CUDA内核的并行执行

parallel execution of CUDA kernels

考虑以下伪代码,其中 a 和 b 是 GPU 数组。进行了三个 Cuda 内核调用。

square<<<N,M>>>(a, length);
cube<<<N,M>>>(b,length);
add<<<N,M>>>(a,b,length);
  1. a
  2. 的每个数字的平方
  3. b的每个数的立方体
  4. 添加a和b对应的元素

是否有可能在方形和立方体内核完成之前,执行添加内核并读取 a 和 b 的旧值?

Is it possible that before square and cube kernels are finished, add kernel gets executed and it reads older values of a and b?

不像你写的那样。在 CUDA 中,activity 在流中流动。流是有序的执行路径。基本流语义表明,对于发布到流中的 2 个项目(即 both 发布到 same 流中),这些项目将按发布顺序执行。在第 1 项之后发布的第 2 项在第 1 项完成执行后才会开始执行。 CUDA 流强制执行此操作。

流的另一个特点是,即使您没有明确标识流,对于所有可流式 activity,您也使用 NULL(或默认)流,其中包括任何可以接受的内容流参数。 Your kernel launches can take a stream parameter。因为你省略了这个:

square<<<N,M>>>(a, length);
            ^
            no stream parameter

您正在使用 NULL 流(对于您的所有 3 个启动)并且 CUDA 流语义指示这些内核将被序列化。

This 阅读整个文档部分将有助于理解并发性,您可以通过研究 CUDA concurrentKernels 示例代码了解见证内核并发性的一些要求。