Являются ли вызовы ядра cuda синхронными или асинхронными? - PullRequest
24 голосов
/ 12 декабря 2011

Я прочитал, что можно использовать запуски ядра для синхронизации различных блоков, т. Е. Если я хочу, чтобы все блоки завершили операцию 1, прежде чем перейти к операции 2, я должен поместить операцию 1 в одно ядро ​​и операцию 2 в другое ядро. Таким образом, я могу добиться глобальной синхронизации между блоками. Однако в руководстве по программированию cuda c упоминается, что вызовы ядра являются асинхронными, т.е. ЦП не ожидает завершения первого вызова ядра, и, таким образом, ЦП также может вызвать второе ядро ​​до завершения первого. Однако, если это так, то мы не можем использовать запуски ядра для синхронизации блоков. Пожалуйста, дайте мне знать, где я иду не так

Ответы [ 3 ]

33 голосов
/ 12 декабря 2011

Вызовы ядра являются асинхронными с точки зрения ЦП, поэтому, если вы вызовете 2 ядра подряд, будет вызвано второе, не дожидаясь завершения первого.Это только означает, что элемент управления немедленно возвращается к ЦПУ.

На стороне графического процессора, если вы не указали разные потоки для запуска ядра, они будут выполняться в порядке их вызова (если вы неДля указания потока они оба идут в поток по умолчанию и выполняются последовательно).Только после того, как первое ядро ​​будет завершено, будет запущено второе.

Это поведение действительно для устройств с вычислительной возможностью 2.x, которые поддерживают параллельное выполнение ядра.На других устройствах, даже если вызовы ядра все еще асинхронны, выполнение ядра всегда последовательное.

Ознакомьтесь с руководством по программированию CUDA C в разделе 3.2.5, которое должен прочитать каждый программист CUDA.

6 голосов
/ 25 мая 2017

Принятый ответ не всегда правильный.

В большинстве случаев запуск ядра происходит асинхронно. Но в следующем случае это синхронно . И они легко игнорируются людьми.

  • переменная окружения CUDA_LAUNCH_BLOCKING равна 1.
  • с использованием профилировщика (nvprof) без одновременного профилирования ядра
  • memcpy, использующий память хоста, которая не заблокирована страницей.

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

Запуск ядра происходит синхронно, если счетчики оборудования собираются через профилировщик (Nsight, Visual Profiler), если не включено параллельное профилирование ядра. Асинхронные копии памяти также будут синхронными, если они содержат память хоста, которая не заблокирована страницей.

Из руководства по программированию NVIDIA CUDA (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#concurrent-execution-host-device).

0 голосов
/ 12 декабря 2011

Одновременное выполнение ядра поддерживается начиная с версии 2.0 CUDA.

Кроме того, возврат к коду ЦП может быть сделан раньше, чем сработало все ядро ​​деформации.

В этом случае вы можете обеспечить синхронизацию самостоятельно.

...