Поведение потока 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?


person user2188453    schedule 26.08.2013    source источник


Ответы (1)


cudaMemcpy вызов (во всех случаях, кроме частного) является синхронным вызовом. Поток хоста, выполняющий этот код, блокируется до тех пор, пока память не будет передана хосту. Он не может приступить к запуску ядра, пока не вернется вызов cudaMemcpy, это не произойдет, пока не будет завершена операция копирования.

В более общем случае поток по умолчанию (0 или null) неявно сериализует операции на графическом процессоре всякий раз, когда операция активна в этом потоке. Если вы создаете потоки и помещаете в них операции одновременно с выполнением операции в потоке по умолчанию, весь параллелизм в этих потоках теряется до тех пор, пока поток по умолчанию не станет бездействующим.

person talonmies    schedule 26.08.2013
comment
Важно отметить, что NVIDIA изменила определение потока NULL (0) для среды выполнения устройства. Для среды выполнения хоста поток NULL принудительно объединяет все ожидающие потоки, поэтому обычно он полезен только для параллелизма CPU/GPU. Для среды выполнения устройства поток NULL является собственным потоком; другие потоки могут выполняться одновременно с ним, и синхронизация должна быть принудительно принудительно реализована с помощью cudaStreamWaitEvent(). - person ArchaeaSoftware; 28.08.2013