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

使用nvprof分析CUDA矩阵加法代码无法捕获内核仅返回API统计问题

问题排查与解决方案

一、修复代码致命错误(核心原因)

当前代码存在多处逻辑错误直接导致内核启动失败,因此nvprof无法捕获到内核运行记录:

  • 内核传入非法指针:前三次matrixInit调用以及后续matrixAdd调用传入的都是malloc分配的主机内存指针,CUDA核函数无法直接访问主机地址,会直接触发非法地址访问导致内核启动崩溃。
  • 设备内存释放错误:最终调用cudaFree释放的是主机内存指针,cudaFree仅支持释放cudaMalloc分配的设备内存,该调用会直接报错。
  • 数组越界风险:matrixAdd内核中d_A[index-1]在index为0时会访问越界地址,触发运行时错误。
  • 网格维度定义错误:dim3 BLOCKS(block_y,block_x)写反了x、y维度,会导致线程索引计算不匹配,部分地址访问错误。
  • 执行逻辑颠倒:应该先分配设备内存,再直接在设备端调用初始化核函数,不需要先在主机分配大内存再拷贝到设备,冗余且容易出错。

你可以在所有CUDA API调用、核函数启动后添加错误检查代码定位错误点,示例如下:

// 核函数调用后检查
matrixInit<<<BLOCKS,THREADS>>>(d_A, Nx, Ny, 1.0);
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
    printf("Kernel launch failed: %s\n", cudaGetErrorString(err));
}
// 同步检查执行结果
err = cudaDeviceSynchronize();
if (err != cudaSuccess) {
    printf("Kernel execute failed: %s\n", cudaGetErrorString(err));
}

二、修复nvprof警告

针对提示的缓冲区不足问题,执行nvprof时添加对应参数调整缓冲区大小即可:

nvprof --device-buffer-size 128MB --profiling-semaphore-pool-size 16MB ./你的可执行文件名

如果仍然报同类警告,继续增大两个参数的数值即可。

三、适配新架构GPU

如果你使用的是安培及以上架构的GPU(算力8.0+,如RTX 30/40系列、A系列等),nvprof已经官方弃用,无法捕获内核信息,需要改用新一代性能分析工具nsys,执行命令如下:

nsys profile ./你的可执行文件名

四、前置校验步骤

  • 修复代码后先直接运行可执行文件,确认程序无崩溃、正常退出后再进行性能分析
  • 编译代码时保留符号信息,nvcc编译参数添加-g -G,不要添加裁剪符号的参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:54:01