Поведение потока 0 (по умолчанию) и других потоков
В CUDA, как поток 0 связан с другими потоками? Выполняется ли поток 0 (поток по умолчанию) одновременно с другими потоками в контексте или нет?
Рассматривая следующий пример:
cudaMemcpy(Dst, Src, sizeof(float)*datasize, cudaMemcpyHostToDevice);//stream 0;
cudaStream_t stream1;
/...creating stream1.../
somekernel<<<blocks, threads, 0, stream1>>>(Dst);//stream 1;
В приведенном выше коде, может ли компилятор обеспечить somekernel
всегда запускается ПОСЛЕ cudaMemcpy
заканчивается или будет somekernel
выполнять одновременно с cudaMemcpy
?
1 ответ
cudaMemcpy
вызов (во всех случаях, кроме частного случая) является синхронным вызовом. Хост-поток, выполняющий этот код, блокируется до тех пор, пока память не будет перенесена на хост. Он не может продолжить запуск ядра, пока cudaMemcpy
вызов возвращен, этого не происходит, пока операция копирования не будет завершена.
В более общем смысле поток по умолчанию (0 или ноль) неявно сериализует операции на графическом процессоре всякий раз, когда операция активна в этом потоке. Если вы создаете потоки и вставляете в них операции одновременно с выполнением операции в потоке по умолчанию, весь параллелизм в этих потоках теряется до тех пор, пока поток по умолчанию не будет занят.