2010-06-14 45 views
5

是否可以启动两个同时执行独立任务的内核。例如,如果我有这样的Cuda的代码使用CUDA为GPU同时启动多个内核

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

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

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

假设这些内核是独立的,是有一个机构在同一时间分配为每个网格数/块启动它们。 CUDA/OpenCL是否有此规定。

+0

同时,你的意思是他们的执行是同步的还是简单的重叠? – 2010-06-14 05:35:41

回答

6

只有具有CUDA计算能力2.0及更高版本(即Fermi)的设备才能支持多个同时执行的内核。见3.2.6.3节的CUDA 3.0节目指南,其中规定的:

计算能力2.0 的一些装置可以执行多个内核 兼任。应用程序可通过调用 cudaGetDeviceProperties()并检查 concurrentKernels属性来查询 此功能。

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

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

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

6

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

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

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

3

CUDA兼容性2.1 =多达16个并行内核