1 想法
上周被调试整的要死要活,这次,我要全部赢回来
外带,优化的效果和情况都是瞎子,我要全方位多角度的观察
本文以命令实操和解释为主,具体优化与测试的协同,待到下次算法章节再说
2 使用详解
首先,你编译的时候一定要加
-g -G
不然就太小丑了。
2.1 CUDA_GDB
它,是用来debug的,安装什么的网上教程是不少的。不多说了
docker环境弄不好的,ptrace默认被ban,只能docker run的时候释放权限。
然而
run不动,一润就exit(2),再往下我就找不到教程了。咱就是说,反正是练习,就不跟他们扯这些有的没的了。用裸机跑
启动
cuda-gdb your_program
添加断点
break kernel_name
跑起来
run
看变量
print variable_name
看寄存器
info registers
单步调试
step
// or
next
切换寄存器切换块(设置焦点)
cuda thread thread_id
cuda block block_id
info的其它用法
info breakpoints
info registers // 当前线程寄存器
info locals // 当前作用域局部变量
info shared // 当前线程块
info args // 当前函数参数值
info threads
info cuda threads // 当前所有CUDA线程
info cuda warps
info cuda blocks
info source // 查看原代码块
info program // 当前执行情况
info functions // 当前程序的函数
info variables // 当前程序的全局和静态变量
info args // 当前函数参数值
info frame // 当前堆栈帧的信息,包括函数名称、参数和局部变量
info memory // 当前内存布局信息
查看计算能力
info cuda devices
2.2 Nsight Visual Studio Code Edition
安装还是傻瓜式的,不讲
我认为最关键的就是配置文件launch.json的写法
自认为,很头疼。
试错情况:
cppdbg+路径到gdb,那么可以调试C++部分代码,核函数自动跳过
cppdbg+路径到cuda-gdb,那么,无视你的断点,自顾自跑完
cuda-gdb+路径到cuda-gdb,那么,右上角根本不显示你写好的配置。。。嘿嘿
解决方案:
是不是很好玩呀!
这里暂存写好的两套json
tasks
{
"version": "2.0.0",
"tasks": [
{
"label": "buildForDebug",
"type": "shell",
"command": "/usr/bin/nvcc",
"args": [
"-G",
"-g",
// "-arch",
// "sm_86",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": "build",
"problemMatcher": [
"$gcc"
],
"detail": "Generated task for CUDA compilation"
},
{
"label": "build",
"type": "shell",
"command": "/usr/bin/nvcc",
"args": [
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": "build",
"problemMatcher": [
"$gcc"
],
"detail": "Generated task for CUDA compilation"
}
]
}
launch
{
"version": "0.2.0",
"configurations": [
{
"name": "CUDA-GDB Debug",
"type": "cuda-gdb",
"request": "launch",
"program": "${workspaceFolder}/matMul2d", // 修改为你的可执行文件路径
"args": "", // 如果有命令行参数,可以在这里添加
"debuggerPath": "/usr/bin/cuda-gdb"
},
{
"name": "Launch CUDA Program",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/matMul2d", // 你的可执行文件路径
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "buildForDebug",
"miDebuggerPath": "/usr/bin/gdb", // 或根据你的系统修改路径
"logging": {
"trace": true,
"traceResponse": true,
"engineLogging": true
}
}
]
}
3 总结
至此,调试问题就不是很大了
除了对于现在的我来说,只能用向日葵远程的内网pc连接的服务器才有ptrace权限,那个操作的卡顿体验,让我出现肠胃抽动
接下来,性能调试工具走一波,今天先去看比赛(赤石)了