Как профилировать приложение CUDA только с помощью nvprof

Я хочу написать сценарий для профилирования моего приложения cuda, используя только командный инструмент nvprof. В настоящее время я сосредотачиваюсь на двух показателях: использование GPU и GPU flops32 (FP32).

Использование графического процессора - это часть времени, в течение которого графический процессор активен. Активное время графического процессора можно легко получить с помощью nvprof --print-gpu-trace, в то время как затраченное время (без накладных расходов) приложения мне не ясно. Я использую визуальный профилировщик nvvp для визуализации результатов профилирования и расчета использования графического процессора. Похоже, что прошедшее время - это интервал между первым и последним вызовом API, включая время накладных расходов.

GPU flops32 - это количество инструкций FP32, которые графический процессор выполняет в секунду, пока он активен. Я следую предложению Грега Смита (Как рассчитать гигафлопс ядра) и обнаружили, что nvprof очень медленно генерирует flop_count_sp_* метрики.

Итак, я хочу задать два вопроса:

  1. Как рассчитать затраченное время (без накладных расходов) приложения CUDA с помощью nvprof?
  2. Есть ли более быстрый способ получить gpu flops32?

Любое предложение будет оценено.

================ Обновление =======================

Что касается первого вопроса выше, прошедшее время без накладных расходов, которое я имел в виду, на самом деле является временем сеанса - накладные расходы, показанное в результатах nvvp:

результаты nvvp


person Lucien Wang    schedule 07.05.2018    source источник


Ответы (1)


Вы можете использовать библиотеку NVTX от NVIDIA, чтобы программно отмечать именованные диапазоны или точки на временной шкале. Длина такого диапазона, правильно определенная, будет составлять ваше «прошедшее время» и будет очень четко отображаться в инструменте визуализации nvvp. Вот сообщение в блоге "CUDA pro tip" об этом:

Совет CUDA Pro: создание пользовательских графиков профиля приложения с NVTX

и если вы хотите сделать это более удобным для C ++ и RAII способом, вы можете использовать мой CUDA оболочки API времени выполнения, которые предлагают маркер диапазона области и другие служебные функции. Конечно, поскольку я являюсь автором, отнеситесь к моей рекомендации с недоверием и посмотрите, что сработает для вас.

О «Истекшем времени» для сеанса - это время между началом и остановкой профилирования. Это может быть либо при запуске процесса, либо при явном запуске профилирования. В моих собственных оболочках API для этого также есть класс RAII: cuda :: profiling :: scope или, конечно, вы можете явно использовать вызовы API в стиле C. (Я действительно должен написать пример программы, но, к сожалению, до этого еще не дошел).

person einpoklum    schedule 08.05.2018
comment
Спасибо за любезный ответ, просим увидеть обновление выше. - person Lucien Wang; 08.05.2018
comment
Все ясно, спасибо большое. Между прочим, есть ли какой-либо способ явно получить время профилирования с помощью ваших оболочек API? - person Lucien Wang; 09.05.2018
comment
@LucienWang: Если вы имеете в виду время, затраченное на само профилирование, я не уверен, что даже API nVIDIA позволяет это. Во всяком случае, нет, не в моей библиотеке-оболочке. - person einpoklum; 09.05.2018