我无法清楚地定义我的 CUDA 代码的结构。我的代码分为两个阶段:首先,我需要运行 M * N 个操作,并将这些操作的结果用于其他 N 个操作。为了利用 CUDA,我想知道您是否可以有两个级别的并行性。首先,一个带有 dimGrid (N * M / dimBlock.x, N * M / dimBlock.y) 的指令,然后是另一个带有 dimGrid (N / dimBlock.x, N / dimBlock.y) 的指令。
问问题
268 次
1 回答
0
是的,您可以在 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 动态并行性的东西,它允许您执行以下操作,但它需要计算能力为 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>>>(...);
...
}
于 2013-09-02T12:24:50.883 回答