为何CUDA程序未按预期打印多线程ID?如何配置3个网格?
问题原因分析
原代码中,dim3 grids(1); 指定当前CUDA内核启动的grid(网格)仅包含1个block(线程块),dim3 blocks(1); 指定每个block仅包含1个thread(线程)。因此内核只会启动1个线程,最终仅输出Block ID: 0和Thread ID: 0。
修改方案
你描述的“3个网格,每个网格包含1个block,每个block包含1个thread”存在概念混淆:CUDA中一次内核启动对应一个grid,grid可以包含多个block,无法同时启动多个独立grid。正确的实现目标应该是启动一个包含3个block的grid,每个block包含1个thread,修改方式如下:
只需调整main函数中grid的维度设置,将dim3 grids(1);改为dim3 grids(3);,即可让grid包含3个block,每个block保留1个thread。
修改后的完整代码:
#include <stdio.h> #include <cuda.h> __global__ void my_kernel() { int block_id = blockIdx.x; int thread_id = threadIdx.x; printf("Block ID : %d\n", block_id); printf("Thread ID : %d\n", thread_id); } int main() { dim3 grids(3); // 设置grid包含3个block dim3 blocks(1); my_kernel<<<grids, blocks>>>(); cudaDeviceSynchronize(); return 0; }
修改后的输出:
Block ID : 0 Thread ID : 0 Block ID : 1 Thread ID : 0 Block ID : 2 Thread ID : 0
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

