全局认知

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 的快捷键) 时, 会继续弹出输入框输入 cppFileNamecppOutFileName, 譬如说输入 helloworld.cpphelloworld, 那么执行的命令将最终被替换为:

/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++

请仔细阅读:

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++

所需插件

基本使用参考:

简要提几个点 (只做记录, 优先参考上面的文档及视频):

  • 命令行编译: 官方文档里的例子是用 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 打开.

完整操作供参考:

  1. 远程连接服务器, git clone https://github.com/NVIDIA/cuda-samples, 在 /path/to/cuda-samples/0_Simple/matrixMul 作为工作目录打开

  2. 编辑 .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"
             }
         ]
     }
    
  3. 编辑 ./vscode/tasks.json 文件

     {
         "tasks": [
             {
                 "type": "shell",
                 "label": "Nsight: autostart (localhost)",
                 "command": "make dbg=1",
                 "problemMatcher": ["$nvcc"],
                 "group": {
                     "kind": "build",
                     "isDefault": true
                 }
             }
         ]
     }
    
  4. 使用 CTRL+Shift+P, 选择 Tasks: Run Build Task, 得到可调试的可执行文件 matrixMul

  5. matrixMul.cu 文件内用鼠标打上断点

  6. 选择 VSCode 左侧边栏 Debug 图标后点击启动调试按钮