Ответ 1
Это все барьеры. Барьеры предотвращают выполнение кода за пределы барьера до тех пор, пока не будет выполнено какое-либо условие.
- cudaDeviceSynchronize() останавливает выполнение в CPU/узла нити (что cudaDeviceSynchronize был выпущен в) до тех пор, пока ГПУ завершила обработку всех ранее запрошенные задачи Cuda (ядра, копии данных и т.д.).
- cudaThreadSynchronize(), как вы обнаружили, это просто устаревшая версия
cudaDeviceSynchronize
. Устаревший означает, что он по-прежнему работает, но он рекомендовал не использовать его (вместо этого использовать cudaDeviceSynchronize), и в будущем он может стать неподдерживаемым. НоcudaThreadSynchronize
() иcudaDeviceSynchronize
() в основном идентичны. - cudaStreamSynchronize() похож на двух указанных выше функций, но он предотвращает дальнейшее выполнение в хост-процессор нити до тех пор, пока ГПУ закончит обработку всех ранее запрошенных задач, которые Cuda были выпущены в указанном потоке. Таким образом,
cudaStreamSynchronize
() принимает идентификатор потока как только параметр. Задачи cuda, выпущенные в других потоках, могут быть или не быть полными, когда выполнение кода ЦП продолжается за пределами этого барьера.