Как Do You Profile & Optimize CUDA Kernels?

Я несколько знаком с визуальным профилировщиком CUDA и электронной таблицей заполнения, хотя я, вероятно, не усиливаю их, а также я мог. Профилирование и оптимизация кода CUDA не похожи на профилирование и оптимизацию кода, который работает на ЦП. Таким образом, я надеюсь учиться на Вашем опыте о том, как получить все возможное от моего кода.

Было сообщение, недавно ища самый быстрый код для идентификации сам числа, и я обеспечил реализацию CUDA. Я не удовлетворен, что этот код - то, с такой скоростью, как это может быть, но я в замешательстве для выяснения и что правильные вопросы и от какого инструмента я могу получить ответы.

Как Вы определяете способы заставить Ваши ядра CUDA работать быстрее?

16
задан 2 revs 23 May 2017 в 12:16
поделиться

4 ответа

Общее правило должно быть: используйте «это», чтобы избежать двусмысленности, не используйте это, если это очевидно к тому, что вы ссылаетесь.

Например, при программировании на Java не требуется this.getSomeValue () , так как все вызовы функций являются вызовами метода «this». С другой стороны, this.myProperty может быть полезен, если в методе много локальных переменных или если существуют статические переменные члены, и необходимо уточнить, что доступ к переменной экземпляра возможен.

Конечно, иногда «это» неизбежно, как в

void setX(int x){ this.x = x; }
-121--2444738-

Я склонен говорить просто использовать дистанционное взаимодействие. Запись данных в файл также требует сериализации. Сериализация кажется почти неизбежной, что когда-либо технологии вы используете. Необходимо перенести данные из одного домена приложения в другой, используя какой-либо канал, и необходимо сериализовать данные, чтобы получить их через канал.

Единственный способ избежать сериализации - использовать общую память, чтобы оба домена приложений могли получить доступ к данным, не проходя канал. Даже глубокое клонирование данных из памяти одного домена приложения в память другого не является более чем двоичной сериализацией (где результат не обязательно хранится в последовательных ячейках памяти).

-121--2242489-

Если вы разрабатываете на Linux, то CUDA Visual Profiler дает вам целый груз информации, зная, что с ней делать может быть немного сложно. В Windows также можно использовать CUDA Visual Profiler или (на Vista/7/2008) Nexus, который хорошо интегрируется с Visual Studio и предоставляет объединенную информацию о профиле хоста и графического процессора.

Как только вы получите данные, вы должны знать, как их интерпретировать. Презентация Advanced CUDA C от GTC содержит несколько полезных советов.

  • Оптимальный доступ к памяти: вы должны знать, что вы ожидаете от кода, а затем искать исключения. Так что если вы всегда загружаете поплавки, и каждый поток загружает разные поплавки из массива, то вы ожидаете увидеть только 64-байтовые нагрузки (на текущий h/w). Любые другие нагрузки неэффективны. Информация о профилировании, вероятно, улучшится в будущем h/w.
  • Минимизация сериализации: счетчик «warp serialize» указывает, что у вас есть конфликты общего банка памяти или постоянная сериализация, представление переходит к более подробному и что делать с этим, как SDK (например, выборка сокращения)
  • Перекрытие ввода-вывода и вычисления: это место, где Nexus действительно светит (вы можете получить ту же информацию вручную с помощью cudaEvents), если у вас есть большой объем передачи данных, вы хотите перекрыть вычисления и конфигурацию ввода-вывода
  • Execution: калькулятор занятости может помочь с этим, но простые методы, такие как комментирование вычисления для измерения ожидаемой и измеренной пропускной способности, действительно полезны (и наоборот, для вычислительной пропускной способности)

Это просто начало, посмотрите презентацию GTC и другие вебинары на сайте NVIDIA.

21
ответ дан 30 November 2019 в 22:10
поделиться

Я повис, потому что я не эксперт CUDA, и другие ответы По моему опыту, это большая ИФ, и нет никакого вреда в проверке.

Чтобы проверить его, вам нужно выяснить, точно ли код не делает ничего, что он на самом деле не должен делать. Вот как я могу убедиться, что:

  • Запустите тот же код на ванильном процессоре и либо возьмите stackshots из него, либо используйте профилировщик, такой как Oprofile или RotateRight/Zoom, который может дать вам эквивалентную информацию.

  • Запустите его на процессоре CUDA и, если возможно, выполните то же самое.

Вы ищете строки кода, которые имеют высокую заполняемость стека вызовов, как показывает часть выборок стека, содержащих их. Это твои «узкие места.» Не требуется очень большое количество образцов, чтобы найти их.

0
ответ дан 30 November 2019 в 22:10
поделиться

Профилировщик CUDA довольно груб и не предоставляет много полезной информации. Единственный способ серьезно оптимизировать свой код (при условии, что вы уже выбрали наилучший из возможных алгоритмов) - это иметь глубокое понимание архитектуры графического процессора, особенно в отношении использования общей памяти, шаблонов доступа к внешней памяти, использования регистров, занятости потоков. , искажения и т. д.

Может быть, вы могли бы опубликовать здесь свой код ядра и получить отзывы?

Форум разработчиков nVidia CUDA также является хорошим местом, где можно получить помощь в решении подобных проблем. .

0
ответ дан 30 November 2019 в 22:10
поделиться

Если вы используете Windows ... Проверьте Nexus:

http://developer.nvidia.com/object/nexus.html

0
ответ дан 30 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: