具有已创建流的CUDA默认流的并发性

wor*_*tor 2 parallel-processing cuda

我用这种方式创建了流:

cudaStream_t stream0;
cudaStream_t stream1;
cudaStreamCreate( &stream0);
cudaStreamCreate( &stream1);
Run Code Online (Sandbox Code Playgroud)

我运行像这样的内核函数

singlecore<<<1,1>>>(devL2,1000);
singlecore<<<1,1,0,stream0>>>(devL2,1000);
Run Code Online (Sandbox Code Playgroud)

目前没有执行这两个内核.但是如果我执行第一个内核stream1:

singlecore<<<1,1,0,stream1>>>(devL2,1000);
singlecore<<<1,1,0,stream0>>>(devL2,1000);
Run Code Online (Sandbox Code Playgroud)

他们将目前执行.

我想知道默认流中的内核函数当前是否无法执行.

Rob*_*lla 7

是的,对发布到默认流的cuda命令有限制.参考关于隐式同步的C编程指南部分:

"如果主机线程在它们之间发出以下任何一个操作,则来自不同流的两个命令不能同时运行:...•对默认流的任何CUDA命令,"

因此,作为一般经验法则,对于重叠复制和计算操作,最简单的方法是在一组非默认流中编程所有此类操作.有一个漏洞(你已经发现),它可能与默认流(和其他流)中发出的命令重叠,但它需要仔细了解默认流和其他流之间的限制,以及仔细注意发出命令的顺序.C编程指南中解释了一个很好的例子.阅读"重叠行为"部分的所有内容.

在您的第一个示例中,发布到默认流的内核会阻止执行发送到其他流的内核.在第二个示例中,您可以具有并发性,因为发布到非默认流的内核不会阻止发出到默认流的内核的执行.