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

