6

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

两个网格可以同时存在于 GPU 中吗?还是一台 GPU 设备只有一个网格?

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

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

4

2 回答 2

9

如果两个内核如上所示发出,它们将被序列化(它们将按顺序运行)。这是因为没有任何其他代码(即切换流),两个内核将被发布到同一个 cuda 流。对同一流发出的所有 cuda 调用都按顺序执行,即使您认为您应该看到其他情况,因为您使用的是 cudaMemcpyAsync 或类似的东西。

当然可以让多个内核彼此异步运行(因此可能同时运行),但有必要使用 cuda 流 API 来完成此操作。

您可能需要查看CUDA C 程序员指南中的第 3.2.5 节“异步并发执行”以了解有关流和并发内核执行的更多信息。此外,nvidia CUDA SDK中有许多示例,例如简单的流,它们将说明这些概念。并发内核示例展示了如何同时运行多个内核(使用流)。请注意,同时运行内核需要计算能力 2.0 或“更高”的硬件。

此外,要回答您的第一个问题,来自CUDA C 编程指南的第 3.2.5.2 节,“设备可以同时执行的内核启动的最大数量因设备而异,但对于某些设备可能高达 128”

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

于 2012-10-09T14:32:16.193 回答
4

为了详细说明 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,即使您将内核分布在多个流上,您的工作有时也会被序列化。
于 2012-10-20T04:45:05.823 回答