Concurrency 使用CUDA为GPU同时启动多个内核

Concurrency 使用CUDA为GPU同时启动多个内核,concurrency,cuda,launch,Concurrency,Cuda,Launch,可以同时启动两个独立任务的内核吗。例如,如果我有这个Cuda代码 // host and device initialization ....... ....... // launch kernel1 myMethod1 <<<.... >>> (params); // launch kernel2 myMethod2 <<<.....>>> (params); //主机和设备初始化 ....... ....... /

可以同时启动两个独立任务的内核吗。例如,如果我有这个Cuda代码

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

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

// launch kernel2
myMethod2 <<<.....>>> (params);
//主机和设备初始化
.......
.......
//启动内核1
myMethod1(参数);
//启动内核2
myMethod2(params);

假设这些内核是独立的,那么是否有一个工具可以同时启动它们,为每个内核分配几个网格/块。CUDA/OpenCL是否有此规定。

只有具备CUDA计算能力2.0及更高版本(即Fermi)的设备才能支持多个并发内核执行。参见CUDA 3.0编程指南第3.2.6.3节,其中说明:

计算能力为2.0的一些设备 可以执行多个内核 同时申请者可以查询 通过调用
cudaGetDeviceProperties()
并检查
concurrentKernels
属性

内核启动的最大数量 一个设备可以并发执行 是四

一个CUDA上下文中的内核不能 与内核并发执行 从另一个CUDA上下文

使用多种纹理或纹理的内核 大量的本地内存更少 可能与同时执行 其他谷物


对于并发内核,您将需要SM 2.0或更高版本

要获得并发执行,您需要手动指示两个内核之间没有依赖关系。这是因为编译器无法确定一个内核不会修改另一个内核中使用的数据,这可以通过读取和写入同一个缓冲区来实现,这看起来很简单,但实际上很难检测,因为数据结构中可能存在指针等等


要表达独立性,必须在不同的流中启动内核。triple chevron语法中的第四个参数指定了流,请查看编程指南或SDK concurrentKernels示例。

CUDA compatibility 2.1=最多16个并发内核通过同步,您的意思是它们的执行是同步的还是简单的重叠?