Как профилировать приложение CUDA только nvprof - PullRequest
0 голосов
/ 07 мая 2018

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

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

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

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

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

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

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

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

nvvp результаты

1 Ответ

0 голосов
/ 08 мая 2018

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

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

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

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

...