CUDA中有多少个网格

时间:2012-10-09 13:15:16

标签: cuda parallel-processing gpu nvidia

GPU中可以使用多少个CUDA网格?

GPU中可以同时存在两个网格吗?或者一个GPU设备只有一个网格?

Kernel1<<gridDim, blockDim>>(dst1, param1);
Kernel1<<gridDim, blockDim>>(dst2, param2);

上面的两个内核是同时还是顺序运行的?

2 个答案:

答案 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,即使您将内核分布在多个流中,您的工作有时也会被序列化。