考虑以下伪代码,其中 a 和 b 是 GPU 数组。进行了三个 Cuda 内核调用。
square<<<N,M>>>(a, length);
cube<<<N,M>>>(b,length);
add<<<N,M>>>(a,b,length);
Run Code Online (Sandbox Code Playgroud)
在方形和立方体内核完成之前,是否有可能执行添加内核并读取 a 和 b 的旧值?
在方形和立方体内核完成之前,是否有可能执行添加内核并读取 a 和 b 的旧值?
不像你写的那样。在 CUDA 中,活动在流中流动。流是有序的执行路径。基本流语义说,对于发布到流中的 2 个项目(即都发布到同一个流中),这些项目将按发布顺序执行。项目 2 在项目 1 之后发布,在项目 1 完成执行之前不会开始执行。CUDA 流强制执行此操作。
流的另一个特征是,即使您没有明确标识流,您也将 NULL(或默认)流用于所有可流的活动,其中包括任何可以采用流参数的活动。 您的内核启动可以采用流参数。由于您省略了这一点:
square<<<N,M>>>(a, length);
^
no stream parameter
Run Code Online (Sandbox Code Playgroud)
您正在使用 NULL 流(对于您的所有 3 个启动),并且 CUDA 流语义规定这些内核将被序列化。
这整个文档节将是有益的阅读理解并发,你可以通过学习CUDA concurrentKernels示例代码得到的一些要求证人内核并发的想法。