使用CUDA同时启动多个内核以利用GPU

5

是否可以同时启动两个执行独立任务的内核?例如,如果我有以下CUDA代码:

// host and device initialization
.......
.......

// launch kernel1
myMethod1 <<<.... >>> (params);

// launch kernel2
myMethod2 <<<.....>>> (params);

假设这些内核是独立的,是否有一种方法可以启动它们,并为每个内核分配少量的网格/块。CUDA/OpenCL是否有此功能?
假设这些内核是独立的,CUDA/OpenCL是否提供一种同时启动它们并为每个内核分配少量的网格/块的机制。

你所说的“同时”,是指它们的执行被同步还是仅仅是重叠? - Kim Reece
3个回答

6

只有CUDA计算能力为2.0及以上的设备(即Fermi架构)才能支持多个内核同时执行。请参阅CUDA 3.0编程指南3.2.6.3节,其中说明:

某些计算能力为2.0的设备可以同时执行多个内核。应用程序可以通过调用cudaGetDeviceProperties()并检查concurrentKernels属性来查询此功能。

设备可以同时执行的最大内核启动次数为4次。

来自一个CUDA上下文的内核不能与来自另一个CUDA上下文的内核同时执行。

使用许多纹理或大量本地内存的内核不太可能与其他内核同时执行。


6
您需要SM 2.0或更高版本才能进行并发内核操作。
要实现并发执行,您需要手动指示两个内核之间不存在依赖关系。这是因为编译器无法确定一个内核是否会修改另一个内核正在使用的数据,这可能是通过从同一缓冲区读取和写入来完成的,这似乎很简单,但实际上要检测起来更加困难,因为数据结构中可能有指针等。
为了表达独立性,您必须在不同的流中启动内核。三重尖括号语法中的第四个参数指定了流,请查看编程指南或SDK concurrentKernels示例。

3

CUDA兼容性2.1 = 最多可同时运行16个内核


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接