(P1) VSCode 使用记录
全局认知
variable
以下仅是部分的不完全摘录, 推荐直接参考官方文档: https://code.visualstudio.com/docs/editor/variables-reference
Predefined variables
就是经常在 .vscode/tasks.json
和 .vscode/launch.json
文件中出现的类似 ${fileWorkspaceFolder}
, ${file}
这类变量.
Input variables
.vscode/tasks.json
文件内容如下
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build user selected file",
"detail": "C/C++: g++ build user selected file",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${input:cppFileName}",
"-o",
"${input:cppOutFileName}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
],
"inputs": [
{
"id": "cppFileName",
"type": "promptString",
"description": "Enter the name of the C++ file you want to compile"
},
{
"id": "cppOutFileName",
"type": "promptString",
"description": "Enter the name of the compiled filename"
},
// 以下需要 command variable 这个插件, 但似乎也不能运作
// {
// "id": "cppOutFileName",
// "type": "command",
// "command": "extension.commandvariable.transform",
// "args": {
// "text": "${input:cppFileName}", // 此处不能替换 ${input:cppFileName}
// "find": "\\.cpp$",
// "replace": ""
// }
// }
],
"version": "2.0.0"
}
起到的效果是使用 Ctrl+shift+B
(Tasks: Run Build Task
的快捷键) 时, 会继续弹出输入框输入 cppFileName
和 cppOutFileName
, 譬如说输入 helloworld.cpp
和 helloworld
, 那么执行的命令将最终被替换为:
/usr/bin/g++ -fdiagnostics-color=always -g helloworld.cpp -o helloworld
task
官方文档: https://code.visualstudio.com/docs/editor/tasks
tasks 的作用基本上可以认为是设置 run.sh
文件, 需要编写 .vscode/tasks.json
文件. debugging 通常需要与 task 配合使用, 一般 debug 之前需要先编译出可调试的可执行代码, 而这一编译步骤一般是用 task 来完成的.
tasks 相关的全部命令可以使用 Ctrl+Shift+P
后输入 Tasks
后 VSCode 会自动补全显示全部可用命令, 比较常用的应该是:
Tasks: Run Task
: 运行.vscode/tasks.json
里定义的任务, VSCode 会弹出窗口进一步选择运行哪个任务Tasks: Run Build Task
: 运行.vscode/tasks.json
里定义的 group.kind 设置为 build 的默认任务, 也可以直接使用快捷键Ctrl+Shift+B
Tasks: Configure Task
: VSCode 会再此弹出窗口选择编程语言等信息生成默认配置项写在.vscode/tasks.json
里, 供用户进一步修改
这里给一个 .vscode/tasks.json
例子 (type="shell"
), 完整的 schema 定义参考:
{
"tasks": [
{
"type": "shell", // 不能随意乱填
"label": "myscript", // Tasks: Run Task 时会在弹出窗口显示
"detail": "my custom script", // Tasks: Run Task 时会在弹出窗口显示
"command": "echo $MYENV && pwd",
// "args": ["--xx", "yy"] // 搭配 command 使用
"options": { // options 内只能配置 cwd, env, shell
"cwd": "${fileDirname}",
"env": {
"MYENV": "xxx"
}
},
"group": {
"kind": "none", // 只能选择 build, test 或者 none
"isDefault": false
},
"problemMatcher": [] // 定义如何高亮错误信息, 针对不同的 type, 会有一些默认的 problemMatcher 供选择
// 运行时机: 例如用VSCode打开文件夹时就运行
// "runOptions": {
// "runOn": "folderOpen"
// }
}
],
"version": "2.0.0"
}
debugging
官方文档: https://code.visualstudio.com/docs/editor/debugging
debugging 涉及到的是 .vscode/launch.json
, 有几种方式添加配置项:
- 打开代码文件, 编辑器的右上方有运行按钮, 旁边有个齿轮按钮, 点击齿轮按钮即可添加设置到
.vscode/launch.json
- VSCode 左侧边栏点击 debug 图标, 侧边栏展开后点击侧边栏的齿轮按钮, 即可直接编辑
.vscode/launch.json
- 其他按钮有时会自动添加配置进
.vscode/launch.json
常用功能
比较两个文件
code diff a.txt b.txt
C/C++
请仔细阅读:
- https://code.visualstudio.com/docs/cpp/introvideos-cpp
- https://code.visualstudio.com/docs/cpp/config-wsl
tasks.json
, launch.json
, c_cpp_properties.json
以下并无超出上述材料的内容
.vscode/tasks.json
{
"tasks": [
{
"type": "cppbuild", // 不能随意乱填, 例如填了 cppbuild, 那么 "command", "args" 就有特定的含义, 自定义任务类型可以填 "process"/"shell"
"label": "C/C++: g++ build active file", // Tasks: Run Task 时会在弹出窗口显示
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "none", // 只能是 "build", "test", "none"
"isDefault": true // 设置为默认任务与否
},
"detail": "Task generated by Debugger." // Tasks: Run Task 时会在弹出窗口显示
}
],
"version": "2.0.0"
}
.vscode/launch.json
{
"configurations": [
{
"name": "C/C++: g++ build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
],
"version": "2.0.0"
}
除此之外, C/C++ 还有一个额外的配置文件 .vscode/c_cpp_properties.json
可供选择:
{
"configurations": [
{
"name": "Linux",
"includePath": ["${workspaceFolder}/**"],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
CUDA C/C++
所需插件
基本使用参考:
- 官方文档: Nsight Visual Studio Code Edition
- Youtube 视频: https://www.youtube.com/watch?v=gN3XeFwZ4ng
- Nsight Systems 与 Nsight Compute 简介: https://giahuy04.medium.com/introduction-to-nsight-systems-nsight-compute-642ff9578f9f
简要提几个点 (只做记录, 优先参考上面的文档及视频):
- 命令行编译: 官方文档里的例子是用 CUDA Samples: matrixMul.cu 进行举例的, 然而
matrixMul.cu
并不是一个 standalone 的单一源码文件, 代码里还包含了诸如#include <helper_cuda.h>
的编译预处理指令, 所以如果用命令行编译运行/调试, 应该用以下语句cd /path/to/samples/0_Simple/matrixMul nvcc matrixMul.cu -I../../common/inc -o matrixMul # nvcc matrixMul.cu -I../../common/inc -o matrixMul -g -G # 包含可调试的编译 ./matrixMul # 运行可执行文件
当然更正规的用法是使用同目录的
Makefile
:make # 本质上是复杂版的手工编译 # make dbg=1 # 包含可调试的编译, 本质上是复杂版的可调试手工编译 ./matrixMul
- 命令行调试:
cuda-gdb # 以下是 cuda-gdb 命令行, (cuda-gdb) 是提示符, 无需输入 (cuda-gdb) break matrixMul.cu:58 (cuda-gdb) break matrixMul.cu:72 (cuda-gdb) run # 开始运行 # 使用 c 表示 continue 继续, s 表示 step 进入函数, ...
- 使用 IDE debug 代码必须先编译好可调试的可执行文件, 也就是对应上面的命令行编译. 对应于
tasks.json
(配置文件使用:Ctrl+Shift+P
+Tasks: Configure Default Build Task
, 执行编译使用:Ctrl+Shift+P
+Tasks: Run Build Task
) - 使用 IDE 运行 debug 需要配置
launch.json
文件, 也就是对应上面的命令行调试. - 进行性能分析可视化一般使用 Nsight Systems 和 Nsight Compute 工具 (Nsight Visual Profiler 工具只适用于较早版本的 CUDA) (参考), 采用这个流程:
nvcc -lineinfo -O2 -o matrixMul -I../../common/inc matrixMul.cu # nvprof -o matrixMul.nvprof ./matrixMul # Nsight Profiler, 现已弃用 nsys profile -o matrixMul.qdrep ./matrixMul # Nsight Systems # 然后使用 Nsight Systems 打开 matrixMul.qdrep 文件, 可以看到可视化结果
Nsight Systems 可以在本机单独安装 (与服务器 Nsight System 版本相近即可, 本机无需有 GPU), 从服务器上下载
.qdrep
, 然后用 Nsight Systems 打开.
完整操作供参考:
-
远程连接服务器,
git clone https://github.com/NVIDIA/cuda-samples
, 在/path/to/cuda-samples/0_Simple/matrixMul
作为工作目录打开 -
编辑
.vscode/launch.json
文件{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "CUDA C++: Launch", "type": "cuda-gdb", "request": "launch", "program": "${workspaceFolder}/matrixMul" } ] }
-
编辑
./vscode/tasks.json
文件{ "tasks": [ { "type": "shell", "label": "Nsight: autostart (localhost)", "command": "make dbg=1", "problemMatcher": ["$nvcc"], "group": { "kind": "build", "isDefault": true } } ] }
-
使用
CTRL+Shift+P
, 选择Tasks: Run Build Task
, 得到可调试的可执行文件matrixMul
-
在
matrixMul.cu
文件内用鼠标打上断点 -
选择 VSCode 左侧边栏 Debug 图标后点击启动调试按钮