Поведение потока 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 или ноль) неявно сериализует операции на графическом процессоре всякий раз, когда операция активна в этом потоке. Если вы создаете потоки и вставляете в них операции одновременно с выполнением операции в потоке по умолчанию, весь параллелизм в этих потоках теряется до тех пор, пока поток по умолчанию не будет занят.

Другие вопросы по тегам