【问题标题】:Cuda: Changing grid dimension during executionCuda:在执行期间更改网格尺寸
【发布时间】:2013-09-05 10:51:12
【问题描述】:

我无法清楚地定义我的 CUDA 代码的结构。我的代码分为两个阶段:首先,我需要运行 M * N 个操作,并将这些操作的结果用于其他 N 个操作。为了利用 CUDA,我想知道您是否可以拥有两个级别的并行性。首先,一个带有 dimGrid (N * M / dimBlock.x, N * M / dimBlock.y) 的指令,然后是另一个带有 dimGrid (N / dimBlock.x, N / dimBlock.y) 的指令。

【问题讨论】:

  • 如果“指令”是指“内核启动”,那么您可以运行相同的内核,每个网格具有不同的块,每个块有不同的线程。

标签: cuda gpu


【解决方案1】:

是的,您可以在 GPU 上启动具有不同网格大小/配置的内核。无论您启动的是同一个内核,这都是正确的:

dim3 dimBlock(block_x, block_y);
dim3 dimGrid1(N*M/dimBlock.x, N*M/dimBlock.y);
mykernel<<<dimGrid1, dimBlock>>>(...);
dim3 dimGrid2(N/dimBlock.x, N/dimBlock.y);
mykernel<<<dimGrid2, dimBlock>>>(...);

或不同的内核:

dim3 dimBlock(block_x, block_y);
dim3 dimGrid1(N*M/dimBlock.x, N*M/dimBlock.y);
mykernel1<<<dimGrid1, dimBlock>>>(...);
dim3 dimGrid2(N/dimBlock.x, N/dimBlock.y);
mykernel2<<<dimGrid2, dimBlock>>>(...);

还有一个叫做CUDA dynamic parallelism的东西可以让你做以下事情,但它需要一个计算能力为3.5的GPU:

__global__ void kernel2(...){
...
}

__global__ void kernel1(...){
...
dim3 dimBlock(block_x, block_y);
dim3 dimGrid(N/dimBlock.x, N/dimBlock.y);
kernel2<<<dimGrid, dimBlock>>>(...);
...
}

通过动态并行,甚至可以递归调用同一个内核:

__global__ void kernel1(...){
...
dim3 dimBlock(block_x, block_y);
dim3 dimGrid(N/dimBlock.x, N/dimBlock.y);
kernel1<<<dimGrid, dimBlock>>>(...);
...
}

【讨论】:

  • 非常感谢您的快速回复。我使用的是 TESLA C2075,所以目前无法使用动态并行。
猜你喜欢
  • 2015-11-08
  • 2011-08-14
  • 2015-09-17
  • 2013-08-25
  • 1970-01-01
  • 2011-01-24
  • 2012-04-16
相关资源
最近更新 更多