You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CUDA整数相加程序输出结果异常,请求排查故障原因

问题描述

这是Jason Sanders与Edward Kandrot所著《CUDA By Example》一书中的示例程序simple_kernel_params.cu:

#include <cstdio>

static void HandleError(cudaError_t err, const char *file, int line)
{
    if (err != cudaSuccess)
    {
        printf("%s in %s at line %d\n", cudaGetErrorString(err), file, line);
        exit(EXIT_FAILURE);
    }
}

#define HANDLE_ERROR(err) (HandleError(err, __FILE__, __LINE__))

__global__ void add(int a, int b, int *c)
{
    *c = a + b;
}

int main(void)
{
    int c;
    int *dev_c;
    HANDLE_ERROR(cudaMalloc((void **)&dev_c, sizeof(int)));
    add<<<1, 1>>>(2, 7, dev_c);
    HANDLE_ERROR(cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost));
    printf("2 + 7 = %d\n", c); // prints "2 + 7 = 0"
    HANDLE_ERROR(cudaFree(dev_c));
    return 0;
}

该程序预期输出为2 + 7 = 9,但实际输出为2 + 7 = 0。

附上sudo nvidia-smi -a的精简输出:

==============NVSMI LOG==============

Driver Version                            : 535.104.12
CUDA Version                              : 12.2

Attached GPUs                             : 1
GPU 00000000:00:1E.0
    Product Name                          : Tesla T4
    Product Brand                         : NVIDIA
    Product Architecture                  : Turing
    Display Mode                          : Disabled
    Display Active                        : Disabled
    Persistence Mode                      : Enabled
    Addressing Mode                       : None
    MIG Mode
        Current                           : N/A
        Pending                           : N/A
    Accounting Mode                       : Disabled
    Accounting Mode Buffer Size           : 4000
    Driver Model
        Current                           : N/A
        Pending                           : N/A
    Serial Number                         : 1563820001764
    GPU UUID                              : GPU-c4636f1c-e8b5-a646-1c6d-14eb842ae426
    Minor Number                          : 0
    VBIOS Version                         : 90.04.96.00.02
    MultiGPU Board                        : No
    Board ID                              : 0x1e
    Board Part Number                     : 900-2G183-0000-001
    GPU Part Number                       : 1EB8-895-A1
    FRU Part Number                       : N/A
    Module ID                             : 1
    Inforom Version
        Image Version                     : G183.0200.00.02
        OEM Object                        : 1.1
        ECC Object                        : 5.0
        Power Management Object           : N/A
    GPU Operation Mode
        Current                           : N/A
        Pending                           : N/A
    GSP Firmware Version                  : 535.104.12
    GPU Virtualization Mode
        Virtualization Mode               : Pass-Through
        Host VGPU Mode                    : N/A
    GPU Reset Status
        Reset Required                    : No
        Drain and Reset Recommended       : N/A
    IBMNPU
        Relaxed Ordering Mode             : N/A

请问为何程序无法正常运行?

问题分析与解决

问题核心是未检查CUDA核函数的执行错误。

当前代码仅检查了cudaMalloc、cudaMemcpy、cudaFree这类同步API的错误,但核函数add<<<1, 1>>>(...)是异步执行的,cudaMemcpy只会等待核函数完成,不会主动捕获核函数的执行错误状态。一旦核函数执行失败,dev_c不会被正确赋值,cudaMemcpy读取到的就是cudaMalloc初始化后的默认值0。

修复步骤

  1. 在核函数调用后立即添加错误检查逻辑:
    add<<<1, 1>>>(2, 7, dev_c);
    HANDLE_ERROR(cudaGetLastError()); // 检查核函数启动阶段的错误(如参数配置、设备不可用)
    HANDLE_ERROR(cudaDeviceSynchronize()); // 等待核函数执行完成,捕获运行时错误
    
  2. 重新编译运行代码,即可定位具体错误。从你的nvidia-smi输出看,驱动与CUDA版本匹配、GPU状态正常,大概率是编译环境问题,比如编译时使用的CUDA版本与运行环境不兼容,或编译命令错误。确保使用nvcc编译:
    nvcc simple_kernel_params.cu -o simple_kernel_params
    

内容的提问来源于stack exchange,提问作者alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:35:01