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);
- a
的每个数字的平方
- b的每个数的立方体
- 添加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 示例代码了解见证内核并发性的一些要求。
考虑以下伪代码,其中 a 和 b 是 GPU 数组。进行了三个 Cuda 内核调用。
square<<<N,M>>>(a, length);
cube<<<N,M>>>(b,length);
add<<<N,M>>>(a,b,length);
- a 的每个数字的平方
- b的每个数的立方体
- 添加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 示例代码了解见证内核并发性的一些要求。