You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动