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

Linux下VSCode中调试Python调用的CuPy CUDA核方法咨询

调试CuPy直接加载的CUDA核函数的便捷方法

我通过CuPy直接加载CUDA核代码(无需编译为库文件),但无法调试CUDA部分的代码——断点只能停留在Python层,不想采用pybind11编译库文件的繁琐方式,求更便捷的调试方案。

现有代码

wrapper.py

import math
from pathlib import Path

import cupy as cp
import numpy as np

with open(Path(__file__).parents[1] / 'cuda' / 'lcx_projector_kernels.cu', 'r', encoding='utf-8') as f:
    lines = f.read()
    compute_systemG_kernel = cp.RawKernel(lines, 'compute_systemG_kernel')


def compute_systemG_lm(xstart,
                   xend,
                   img_origin,
                   voxsize,
                   sysG,
                   nLORs,
                   img_dim,
                   tofbin_width,
                   sigma_tof,
                   tofcenter_offset,
                   nsigmas,
                   tofbin,
                   threadsperblock):

        compute_systemG_kernel(
            (math.ceil(nLORs / threadsperblock), ), (threadsperblock, ),
            (xstart.ravel(), xend.ravel(),
            cp.asarray(img_origin), cp.asarray(voxsize), sysG,
            np.int64(nLORs), cp.asarray(img_dim),
            np.float32(tofbin_width), cp.asarray(sigma_tof).ravel(),
            cp.asarray(tofcenter_offset).ravel(), np.float32(nsigmas),
            tofbin)
    )

尝试过的VS Code launch.json配置

{
  "version": "0.2.0",
  "configurations": [
    {
            "name": "train.py",
            "type": "debugpy",
            "request": "launch",
            "program": "/home/fanghaodu/code/LMPDnet/train.py",
            "console": "integratedTerminal",
            "justMyCode": false,
            "env": {
                "PYTHONPATH": "${workspaceFolder}"
            }
    },

    {
        "name": "CUDA GDB",
        "type": "cuda-gdb",
        "request": "launch",
        "program": "/home/fanghaodu/.conda/envs/cu128/bin/python", // which python
        "args": ["${file}"],
        "debuggerPath": "/opt/apps/cuda-12.8/bin/cuda-gdb", // which cuda-gdb
    },
    
  ],

    "compounds": [
    {
        "name": "Python and CUDA",
        "configurations": ["train.py", "CUDA GDB"]
    }
],
    
}

解决方案

方法一:配置CUDA-GDB直接调试CuPy核函数

不需要编译库文件,只需让CuPy在编译核时生成调试符号,再用CUDA-GDB启动Python进程:

  1. 启用CuPy调试符号:添加环境变量CUDA_DEBUG=1,CuPy会在编译核函数时包含调试信息(调试完成后可移除该变量以恢复编译速度)。
  2. 修改VS Code launch.json配置:去掉compound配置,直接用CUDA-GDB启动你的训练脚本:
    {
      "version": "0.2.0",
      "configurations": [
        {
          "name": "CUDA GDB Debug CuPy Kernel",
          "type": "cuda-gdb",
          "request": "launch",
          "program": "/home/fanghaodu/.conda/envs/cu128/bin/python",
          "args": ["/home/fanghaodu/code/LMPDnet/train.py"],
          "debuggerPath": "/opt/apps/cuda-12.8/bin/cuda-gdb",
          "env": {
            "CUDA_DEBUG": "1",
            "PYTHONPATH": "${workspaceFolder}"
          },
          "cwd": "${workspaceFolder}",
          "stopAtEntry": false
        }
      ]
    }
    
  3. 设置CUDA断点:直接在你的lcx_projector_kernels.cu文件的对应行点击行号添加断点,或者在核函数开头手动插入__brkpt();语句强制触发断点。
  4. 启动调试:运行上述CUDA-GDB配置,当核函数执行时会自动停在断点处,可查看线程信息、变量值等。

方法二:在CUDA核中添加printf日志

如果不想配置调试器,可直接在CUDA核函数中用printf输出关键变量:

__global__ void compute_systemG_kernel(/* 参数列表 */) {
    // 输出线程索引和变量值
    printf("Thread (%d, %d, %d): some_var = %.4f\n", threadIdx.x, threadIdx.y, threadIdx.z, some_var);
    // 核函数逻辑...
}
  • 注意:设备端printf的输出会在核函数执行完成后统一打印到终端(缓冲机制),计算能力2.0及以上的GPU都支持该功能。

方法三:验证参数匹配性

先排查Python到CUDA的参数传递是否正确:

  • 在Python函数中打印每个参数的shape和dtype,确保和CUDA核函数的参数类型完全匹配(比如np.int64对应CUDA的long long,np.float32对应float),类型不匹配是常见的隐性错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 07:54:55