Как вы профилируете и оптимизируете ядра CUDA? - PullRequest
16 голосов
/ 05 февраля 2010

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

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

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

Ответы [ 4 ]

21 голосов
/ 05 февраля 2010

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

После того, как вы получили данные, вам нужно знать, как их интерпретировать. В презентации Advanced CUDA C от GTC есть несколько полезных советов. Основные вещи, на которые стоит обратить внимание:

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

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

0 голосов
/ 06 февраля 2010

Я отказался, потому что я не эксперт CUDA, и другие ответы довольно хороши, если код уже почти оптимален. По моему опыту, это большой ЕСЛИ, и в проверке нет вреда.

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

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

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

То, что вы ищете, это строки кода, которые занимают много места в стеке вызовов, как показывает доля содержащихся в них выборок стека. Это ваши "узкие места". Для их определения не требуется большого количества образцов.

0 голосов
/ 05 февраля 2010

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

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

0 голосов
/ 05 февраля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...