CUDA中有多少个网格

问题描述 投票:5回答:2

GPU中可以有多少个CUDA网格?

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

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

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

cuda parallel-processing gpu nvidia
2个回答
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”

作为参考,“网格”是与单个内核启动相关联的整个线程数组。


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,即使您将内核分布在多个流上,您的工作有时也会被序列化。
© www.soinside.com 2019 - 2024. All rights reserved.