CUDA блокирующие флаги - PullRequest
       22

CUDA блокирующие флаги

3 голосов
/ 28 января 2011

При создании события CUDA вы можете дополнительно включить флаг cudaEventBlockingSync.Но - что если разница между созданием события с флагом или без него?Я прочитал прекрасное руководство ;это просто не имеет смысла для меня.Что такое «вызывающий поток хоста» и что «блокирует», когда вы не используете флаг?

4.6.2.7 cudaError_t cudaEventSynchronize (событие cudaEvent_t)

Блокирует, пока событие фактически не будет записано.... Ожидание события, которое было создано с флагом cudaEventBlockingSync , приведет к блокировке потока вызывающего хоста, пока событие не будет фактически записано.

Ответы [ 2 ]

7 голосов
/ 26 февраля 2013

cudaEventBlockingSync будет определять, как хост будет ожидать события.

Когда cudaEventBlockingSync установлено SET , CPU может отказаться от потока хоста. Т.е. ЦП будет передан другой поток (возможно, процесс). Хост-узел повторно запустит ЦП позднее. При таком подходе поток хоста не монополизирует все процессорное время, хосту может быть разрешено выполнять другую работу.

Когда cudaEventBlockingSync НЕ УСТАНОВЛЕНО ЦП будет занят, то есть ЦП войдет в цикл проверки событий. Когда это происходит, процессор просто вращается, ища событие, которое произойдет. Это обычно приводит к тому, что измеритель производительности ЦП выводится на 100%. При таком подходе поток хоста монополизирует все время процессора.

Не установка cudaEventBlockingSync приводит к минимальной задержке от завершения выполнения ядра до возврата элемента управления в поток. Какой параметр вы хотите использовать, зависит от того, что делает ядро. то есть, сколько времени потребуется для того, чтобы событие произошло, и сколько накладных расходов связано с блокировкой ЦП. Отключение этого флага происходит за счет невозможности выполнять какую-либо другую работу ЦП (другие потоки) в ожидании события.

4 голосов
/ 28 января 2011

когда вы вызываете эту функцию, поток прекращает выполнение до тех пор, пока не произойдет это событие, после чего программа продолжит работу.Это способ убедиться, что вы знаете состояние работающей программы.Это особенно важно в CUDA, потому что многие вещи являются асинхронными.

«Поток вызывающего хоста» - это поток, работающий на ЦПУ хост-компьютера, в котором находится устройство CUDA.

изменить в ответ на комментарий ниже:

Я считаю, что разница между «блокирующей синхронизацией» и обычной синхронизацией заключается в том, что поток блокируется и не будет работать до завершения события, в отличие отпоток, который "вращается", как он ждет, постоянно проверяя значение.Это означает, что поток не будет использовать дополнительное вращение ЦП, а будет пробужден после завершения события.Это полезно, например, если вы запускаете эту программу на сервере, где процессорное время платно, или вам приходится платить за единицу времени.

...