Подтвердить что ты не робот

Ядро cuda вызывает синхронное или асинхронное

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

  • переменная окружения 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).

Ответ 3

Поддержка параллельного ядра поддерживается с версии 2.0 CUDA.

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

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