Cuda:执行期间更改网格尺寸

时间:2013-09-02 10:46:03

标签: cuda gpu

我在尝试清楚地定义CUDA代码的结构时遇到了麻烦。我的代码分为两个阶段:首先,我需要运行M * N个操作,其结果用于其他N个操作。为了利用CUDA,我想知道你是否可以有两个级别的并行性。首先,使用dimGrid(N * M / dimBlock.x,N * M / dimBlock.y),然后使用dimGrid(N / dimBlock.x,N / dimBlock.y)进行另一个指令。

1 个答案:

答案 0 :(得分: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 dynamic parallelism的东西允许你执行以下操作,但它需要具有计算能力的GPU 3.5:

__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>>>(...);
...
}