Профилирование производительности CUDA с помощью Nvidia NSight в VS2010 - файл отчета.nvreport

Я сделал след приложения

В этом файле отчета:

1.

Когда я выбираю "CUDA -> CUDA Summary" в выпадающем списке

Под Runtime API вызывает элемент в таблице

% Времени - 80,66

Запуски

% Времени устройства - 15,46

Все остальные проценты времени почти 0%

так что мой вопрос здесь заключается в том, где остальные 19,34% времени и 84,54% времени устройства? То есть, если они означают процентное отношение к совершенно разным значениям "общего времени"?

2.

Я использовал векторы тяги, чтобы копировать мои данные назад и вперед. В разделе "Копирование из памяти" этого отчета все значения% Time для копии заметки для моего прогона, по-видимому, незначительны.

Но угадайте, что, когда я нажимаю ссылку "Сводка" вызовов API времени выполнения (у которой значение% Time достигает 80,66), я сразу же вижу, что виновник - "cudaMemcpy" со значением "Capture Time %" столь же высоким 73,75 на этой странице " Сводка вызовов API времени выполнения".

так что мой вопрос здесь в том, что

  • Означает ли это, что моя бутылочная горловина - это все еще те вызовы thrust::copy(), что даже в разделе отчета "Копии заметок" это не отображается?
  • и как я могу действительно найти точный вызов функции, который является самым дорогим для меня в целом?
  • Как функция временной шкалы помогает с этим?

1 ответ

Решение

РЕЗЮМЕ CUDA

В сводке CUDA% времени при вызовах API времени выполнения представляет собой% времени ЦП, которое заняло время выполнения CUDA. Я не помню, если% ограничен до 100% (все потоки процессора сглажены), или если максимальный% равен NumCpuCores * 100%.

API ЗВОНКИ

Чтобы найти самые дорогие вызовы API времени выполнения, выполните следующие действия:

  1. Перейдите на страницу CUDA Runtime API Calls.
  2. Нажмите на столбец Продолжительность 2 раза, чтобы отсортировать по убыванию

Можно захватить стек вызовов для вызовов API CUDA Runtime, чтобы вы могли перейти к исходному коду из отчета. Это может быть включено в Деятельности со следующими шагами:

  1. Перейдите к настройкам трассировки в действии
  2. Включить трассировку системы
  3. Раскройте настройки трассировки CUDA
  4. Включить трассировку API времени выполнения и трассировку стека вызовов = всегда

ПРЕДУПРЕЖДЕНИЕ. Установка для параметра "Отслеживание стека вызовов" значения "Всегда" увеличивает накладные расходы на вызовы API. Включайте это только тогда, когда программа ограничена ЦП и вы пытаетесь определить исходный код, генерирующий вызовы API.

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

Страница отчета о вызовах API Nsight VSE CUDA

Можно запросить самые длинные вызовы API на странице отчета временной шкалы, используя информацию о корреляции для строк Process\Thread\ Calls или Process\CUDA\CUDA Context\Runtime API.

  1. Нажмите на строку, содержащую вызовы API
  2. В дереве корреляции нажмите Row Information\Runtime API
  3. В таблице вызовов API дважды щелкните по столбцу Длительность и прокрутите таблицу до самого верха.
  4. Нажмите на вызов API, чтобы перейти к представлению временной шкалы к вызову API.

Стек вызовов также может быть получен в этой точке с использованием панели корреляции.

введите описание изображения здесь

Другие вопросы по тегам