2013-12-21 8 views
0

Я пытаюсь понять разницу между выполнением синхронизации ядра с использованием таймеров CUDA (событий) и регулярных методов синхронизации процессора (gettimeofday на Linux и т. Д.).Таймеры CUDA - процессор против GPU?

От чтения http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/ раздела 8.1, мне кажется, что единственное реальное различие заключается в том, что при использовании таймеров ЦП необходимо помнить о синхронизации графического процессора, поскольку вызовы асинхронны. Предположительно, API-интерфейсы CUDA делают это для вас.

Так это действительно вопрос:

  1. С GPU событий вам не нужно явно вызывать cudaDeviceSynchronize
  2. С GPU событий вы получите по своей сути независимый от платформы синхронизации API, в то время как с CPU вам необходимо использовать отдельные API для каждой ОС

?

Заранее благодарен

ответ

2

У вас его нет. Поскольку GPU работает асинхронно от CPU, при запуске ядра графического процессора процессор может продолжать свой весомый путь. Когда время, это означает, что вы можете достичь конца вашего кода времени (т. Е. Записать продолжительность), прежде чем GPU вернется из своего ядра. Вот почему мы синхронизируем .., чтобы убедиться, что ядро ​​закончено, прежде чем двигаться вперед с кодом ЦП. Это особенно важно, когда нам нужны результаты из ядра GPU для следующей операции (т. Е. Шаги в алгоритме).

Если это помогает, вы можете думать о cudaEventSynchronize как о точке синхронизации от CPU-GPU, поскольку таймер процессора зависит от кода CPU и GPU, тогда как события таймера cuda зависят только от кода графического процессора. И поскольку эти события синхронизации cuda скомпилированы nvcc специально для платформ CUDA, они независимы от платформы CPU, но зависят от платформы GPU.

+3

В целом я согласен с вашим ответом, и я согласен с тем, что ОП имеет концепции в основном правильные. Однако я не уверен, что согласен с этим утверждением: «в то время как события таймера cuda зависят только от кода GPU». По крайней мере, на linux я могу обернуть события таймера cuda вокруг кода, который является чисто хост-кодом (даже не требуется CUDA в моей программе, кроме механизма синхронизации cudaEvents), и, похоже, точное время выполнения кода хоста , из того, что я могу сказать. Таким образом, мне кажется, что cudaEvents, в истекшее время, будет зависеть от надмножества CPU и кода графического процессора, который происходит между ними. –

+0

Хорошая точка. Кажется, вы не единственный, кто нашел, что это правда. См. Соответствующий вопрос SO [здесь] (http://stackoverflow.com/a/5846331/832648). – Justin

Смежные вопросы