CUDA: Разница между таймером процессора и событием таймера CUDA? - PullRequest
8 голосов
/ 29 апреля 2011

В чем разница между использованием таймера ЦП и события таймера CUDA для измерения времени, необходимого для выполнения некоторого кода CUDA?Что из этого следует использовать программисту CUDA и почему?

Использование таймера ЦП потребует вызова cudaThreadSynchronize до того, как будет замечено какое-либо время.Для того, чтобы отметить время, которое можно использовать clock(), или можно запросить счетчик производительности с высоким разрешением, например QueryPerformanceCounter (в Windows).

Событие таймера CUDA будет включать запись до и послеиспользуя cudaEventRecord.Позднее истекшее время будет получено путем вызова cudaEventSynchronize событий, а затем cudaEventElapsedTime для получения истекшего времени.

Ответы [ 2 ]

9 голосов
/ 29 апреля 2011

Ответ на первую часть вопроса заключается в том, что таймеры cudaEvents основаны на счетчиках с высоким разрешением на борту графического процессора, и они имеют меньшую задержку и лучшее разрешение, чем при использовании таймера хоста, потому что они "не работают".Вы должны ожидать субмикросекундное разрешение от таймеров cudaEvents.Вы должны предпочесть их для синхронизации операций GPU именно по этой причине.Характер cudaEvents для каждого потока также может быть полезен для инструментирования асинхронных операций, таких как одновременное выполнение ядра и дублированное выполнение копирования и ядра.Выполнение такого рода измерения времени практически невозможно с использованием таймеров хоста.

РЕДАКТИРОВАТЬ: я не буду отвечать на последний абзац, потому что вы удалили его.

3 голосов
/ 01 мая 2011

Основным преимуществом использования событий CUDA для синхронизации является то, что они меньше подвержены возмущениям из-за других системных событий, таких как пейджинг или прерывания от диска или сетевого контроллера.Кроме того, поскольку cu (da) EventRecord является асинхронным, эффект Гейзенберга меньше при сокращении времени выполнения операций, интенсивно использующих графические процессоры.

Еще одно преимущество событий CUDA заключается в том, что они имеют чистый кроссплатформенный API -нет необходимости переносить gettimeofday () или QueryPerformanceCounter ().

Последнее замечание: будьте осторожны при использовании потоковых событий CUDA для синхронизации - если вы не укажете поток NULL, вы можете свернуть операции синхронизации, которые вы выполнялине собираюсь.Существует хорошая аналогия между событиями CUDA и чтением счетчика меток времени CPU, который является командой сериализации.На современных суперскалярных процессорах семантика сериализации делает синхронизацию однозначной.Как и в случае с RDTSC, вы всегда должны заключать события, которые вы хотите рассчитать, в достаточное количество времени, чтобы время имело смысл (точно так же, как вы не можете использовать RDTSC для значимого времени одной машинной инструкции).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...