GPU中可以使用多少个CUDA网格?
GPU中可以同时存在两个网格吗?或者一个GPU设备只有一个网格?
Kernel1<<gridDim, blockDim>>(dst1, param1);
Kernel1<<gridDim, blockDim>>(dst2, param2);
上面的两个内核是同时还是顺序运行的?
答案 0 :(得分:8)
如果如上所示发布了两个内核,它们将被序列化(它们将按顺序运行)。这是因为没有任何其他代码(即切换流),两个内核将被发布到相同的cuda流。发出到同一个流的所有cuda调用都是按顺序执行的,即使你认为你应该看到其他因为你正在使用cudaMemcpyAsync或类似的东西。
当然可能有多个内核彼此异步运行(因此可能同时运行)但是必须使用cuda流API来实现这一点。
您可能需要查看CUDA C Programmers Guide中的第3.2.5节“异步并发执行”以了解有关流和并发内核执行的更多信息。此外,nvidia CUDA SDK中有许多样本,例如simple streams,它们将说明这些概念。 concurrent kernels示例显示了如何同时运行多个内核(使用流)。请注意,同时运行内核需要计算能力2.0或“更高”的硬件。
另外,要回答您的第一个问题,请参阅CUDA C编程指南的section 3.2.5.2,“设备可以同时执行的最大内核启动次数因设备而异,但对于某些设备可能高达128 “
作为参考,“grid”是与单个内核启动相关联的整个线程数组。
答案 1 :(得分:3)
详细说明Robert的答案,这里有一个例子,说明如何使用流来同时运行Kernel1
的两个实例:
cudaStream_t stream1; cudaStreamCreate(&stream1);
cudaStream_t stream2; cudaStreamCreate(&stream2);
Kernel1<<gridDim, blockDim, 0, stream1>>(dst1, param1);
Kernel1<<gridDim, blockDim, 0, stream2>>(dst2, param2);
关于使用流并发执行的一些注释:
Kernel1<<<g, b>>>()
的情况下启动内核,然后启动具有特定流Kernel2<<<g, b, 0, stream>>>()
的内核,则Kernel2
将等待Kernel1
完成。 Kernel1<<<g, b>>>()
)的情况下启动内核时,Nvidia会“使用NULL流”调用它。cudaEvents
,即使您将内核分布在多个流中,您的工作有时也会被序列化。