Разница во времени, сообщаемая НВВП и счетчиками
Я запускаю ядро программ CUDA. Я наблюдаю, что существует значительная разница между временем, сообщаемым счетчиками GPU и NVVP для выполнения ядра. Почему такая разница обычно наблюдается?
1 ответ
Nsight Visual Studio Edition и Visual Profiler поддерживают два механизма для определения продолжительности работы ядра. Оба эти метода приведут к получению значения, меньшего и более точного, чем то, о котором сообщает CUevent/cudaEvent. Методы следующие:
- Параллельное время ядра
Это режим по умолчанию, используемый Nsight 2.x и Visual Profiler 5.0 для создания временной шкалы. Длительность ядра определяется как время от начала выполнения кода ядра на устройстве до момента его завершения. Это не может быть измерено с использованием событий CUDA.
- Сериализированное время ядра
Это режим по умолчанию, используемый инструментами при сборе счетчиков PM для каждого ядра. Длительность ядра определяется как время, в течение которого графический процессор обрабатывает запрос на запуск, пока графический процессор не простаивает после завершения работы ядра. Этот режим специально отключает параллельное выполнение ядра. Почти во всех случаях сообщаемая длительность будет немного больше, чем длительность параллельной трассировки ядра, поскольку она включает время для запуска графическим процессором первого блока и время для графического процессора для завершения всех хранилищ памяти.
- Время проведения CUDA
Синхронизация событий CUDA выполняется путем вызова cu/cudaEventRecord до и после запуска ядра в том же потоке. Каждая запись события вставляет команду в push-буфер GPU. Когда команда достигает GPU, она записывает метку времени в память. Можно запустить две записи событий без запуска. Это позволяет разработчику измерить время GPU между двумя командами отметки времени. Этот метод имеет следующие недостатки, и поэтому я рекомендую разработчикам использовать инструменты (Nsight, Visual Profiler и CUPTI):
- а. Истекшее время между отправкой записи о событии запуска и запуском может зависеть от загрузки ЦП. Затраты на запуск составляют 5-8 мкс в Linux/TCC и потенциально намного выше в WDDM.
б. Графический процессор может переключать контекст между записью события запуска и выполнением ядра.
с. Запись стартового события будет включать в себя издержки запуска, включая время для обновления буферов драйверов, размер которых необходимо изменить, параметры копирования, копии текстурных привязок,...
д. Прошедшее время между отправкой ядра и записью конечного события может повлиять на время.
е. Графический процессор может переключать контекст между окончанием выполнения ядра и записью конечного события.
е. Неправильное использование событий нарушит параллельное выполнение ядра.
Длительность, предоставляемая в каждом из этих режимов, будет обеспечивать разные значения. Кроме того, определение продолжительности, предоставляемое инструментами, и определение, доступное посредством использования событий, отличается.
Инструменты NVIDIA определяют продолжительность как можно лучше, начиная с момента, когда графический процессор начинает работать с ядром, до того момента, когда графический процессор завершает работу с ядром. Если разработчик заинтересован в сборе этой информации, он должен взглянуть на CUPTI SDK, включенный в комплект инструментов.