CUDA实验程序预期输出16个值却仅输出12个,求故障原因
CUDA程序输出数量不符问题排查
核心原因:线程网格维度设置不足,未覆盖所有元素
你的4×4×1张量需要16个线程对应每个元素,但当前线程网格配置dim3 grid(3,5,7);搭配dim3 block(1,1,1);,导致有效线程数不足:
- 宽度维度(idx):
blockIdx.x取值为0~2(grid.x=3),仅3个值满足idx < WIDTH=4 - 长度维度(idy):
blockIdx.y取值为0~4(grid.y=5),仅前4个值满足idy < LENGTH=4 - 高度维度(idz):
blockIdx.z取值为0~6(grid.z=7),仅0满足idz < HEIGHT=1
最终符合条件的线程总数为3×4×1=12,这就是实际只输出12个值的直接原因。
额外问题:缺少设备同步,存在未定义行为
内核启动后直接执行cudaFree(dev_tensor),没有等待GPU完成内核任务。这种写法可能导致GPU内存提前释放,引发未定义行为。需在cudaFree前添加同步操作:
cudaDeviceSynchronize();
修复方案
调整网格维度,确保覆盖所有元素。最简单的写法是:
dim3 grid(4,4,1); // 对应4×4×1的张量维度 dim3 block(1,1,1);
如果需要适配更大维度的张量,可采用动态计算网格大小的方式:
dim3 block(2,2,1); // 可根据硬件性能调整block大小 dim3 grid((WIDTH + block.x - 1)/block.x, (LENGTH + block.y - 1)/block.y, HEIGHT);
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

