CUDA代码仅输出CPU结果的问题排查与修复方案
CUDA Hello World GPU无输出问题排查与解决
核心原因:CUDA核函数是异步执行的,CPU调用
helloFromGPU<<<1,10>>>()后会立刻继续执行后续代码,不等GPU完成核函数内的打印操作,就执行cudaDeviceReset()终止了GPU设备,导致GPU的输出根本没机会传到主机端。解决办法:在核函数调用后添加同步操作,让CPU等待GPU完成所有任务再继续。使用
cudaDeviceSynchronize()即可,它会阻塞CPU,直到GPU上的所有任务执行完毕。修正后的代码:
#include <stdio.h> __global__ void helloFromGPU(void){ printf("Hello World From GPU!\n"); } int main(void){ printf("Hello World From CPU!\n"); helloFromGPU <<<1, 10>>>(); // 等待GPU完成任务再继续执行后续操作 cudaDeviceSynchronize(); cudaDeviceReset(); return 0; }
- 额外建议:加上CUDA错误检查,能快速排查核函数启动失败、设备不兼容这类隐藏问题,示例代码如下:
#include <stdio.h> #include <stdlib.h> #define CHECK_CUDA_ERROR(err) \ if (err != cudaSuccess) { \ fprintf(stderr, "CUDA错误位置:%s:%d,错误信息:%s\n", __FILE__, __LINE__, cudaGetErrorString(err)); \ exit(EXIT_FAILURE); \ } __global__ void helloFromGPU(void){ printf("Hello World From GPU!\n"); } int main(void){ printf("Hello World From CPU!\n"); helloFromGPU <<<1, 10>>>(); CHECK_CUDA_ERROR(cudaGetLastError()); // 检查核函数启动是否出错 CHECK_CUDA_ERROR(cudaDeviceSynchronize()); // 同步GPU并检查同步错误 CHECK_CUDA_ERROR(cudaDeviceReset()); return 0; }
内容的提问来源于stack exchange,提问作者Milin




