Профилирование производительности 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 времени выполнения, выполните следующие действия:
- Перейдите на страницу CUDA Runtime API Calls.
- Нажмите на столбец Продолжительность 2 раза, чтобы отсортировать по убыванию
Можно захватить стек вызовов для вызовов API CUDA Runtime, чтобы вы могли перейти к исходному коду из отчета. Это может быть включено в Деятельности со следующими шагами:
- Перейдите к настройкам трассировки в действии
- Включить трассировку системы
- Раскройте настройки трассировки CUDA
- Включить трассировку API времени выполнения и трассировку стека вызовов = всегда
ПРЕДУПРЕЖДЕНИЕ. Установка для параметра "Отслеживание стека вызовов" значения "Всегда" увеличивает накладные расходы на вызовы API. Включайте это только тогда, когда программа ограничена ЦП и вы пытаетесь определить исходный код, генерирующий вызовы API.
Доступ к трассировке стека вызовов можно получить со страницы отчета, которая ссылается на вызов API, с помощью панели корреляции в левом нижнем углу страницы отчета. На приведенном ниже снимке экрана показан стек вызовов для вызова cudaEventSynchronize на странице отчета о вызовах API CUDA Runtime.
Можно запросить самые длинные вызовы API на странице отчета временной шкалы, используя информацию о корреляции для строк Process\Thread\ Calls или Process\CUDA\CUDA Context\Runtime API.
- Нажмите на строку, содержащую вызовы API
- В дереве корреляции нажмите Row Information\Runtime API
- В таблице вызовов API дважды щелкните по столбцу Длительность и прокрутите таблицу до самого верха.
- Нажмите на вызов API, чтобы перейти к представлению временной шкалы к вызову API.
Стек вызовов также может быть получен в этой точке с использованием панели корреляции.