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进程:
- 启用CuPy调试符号:添加环境变量
CUDA_DEBUG=1,CuPy会在编译核函数时包含调试信息(调试完成后可移除该变量以恢复编译速度)。 - 修改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 } ] } - 设置CUDA断点:直接在你的
lcx_projector_kernels.cu文件的对应行点击行号添加断点,或者在核函数开头手动插入__brkpt();语句强制触发断点。 - 启动调试:运行上述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
相关产品推荐
相关产品推荐

