Ядра CUDA на звонки синхронный или асинхронный

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

3 ответов


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

на стороне GPU, если вы не указали разные потоки для выполнения ядра, они будут выполняться в порядке, в котором они были вызваны (если вы не укажете поток, они оба переходят в поток по умолчанию и выполняются последовательно). Только после завершения первого ядра будет выполнено второе.

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

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


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

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

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

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

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

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


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

кроме того, возврат к коду CPU может быть сделан раньше, чем все ядро warp, чтобы работать.

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