Windows下CUDA环境配置

Windows下CUDA环境配置

社蕙 191 2023-12-11

在开始之前,如果需要安装windows terminal(以获得更好的powershell与Ubuntu体验,否则默认终端太丑了),具体请参考本站的文章如何连接微软商店并下载

安装WSL + Ubuntu

WSL(Windows Subsystem Linux) 是适用于Linux的Windows虚拟子系统,它基于Linux的发行版本Ubuntu并使用GCC进行C/C++的编译运行工作。打开设定路径

  • 控制面板 > 程序 > 启动或关闭Windows功能
    • 选择适用于Linux的Windows子系统,安装时选择WSL2版本,当然也可以使用命令更换WSL版本。安装过程可能会重启系统。
    • 选择虚拟机平台
    • 选择Hyper-V

如果没有自动安装,那么手动输入命令:

  wsl --install
  # 如果需要安装特定版本:
  wsl.exe --set-version [OS_NAME] 2

如果需要卸载:

  wsl.exe --list --all
  wsl.exe --unregister [OS_NAME]

如果要安装在非系统盘,请参考贴吧教程3楼(链接在文章最后)

使用Windows Terminal打开Ubuntu并输入下面的命令,对其进行更新(没有安装Windows Terminal则在powershell中输入wsl即可):

# sudo的密码就是当前windows账号的密码
sudo apt-get update
sudo apt-get upgrade

参考: 如何使用 WSL 在 Windows 上安装 Linux

安装C/C++编译器和VSC扩展

输入下列命令,安装GCC编译器用于编译运行C/C++程序。

apt-get install build-essential
apt-get install gdb

完成安装后通过命令检测是否完成了安装。

gdb -v
gcc -v
g++ -v

如果出现了版本信息,说明已经完成了C/C++编译器的安装,接下来创建工程文件夹并使用VSC打开:

megumism@DESKTOP-OFLS0LK:/mnt/e/Code$ mkdir cuda
megumism@DESKTOP-OFLS0LK:/mnt/e/Code$ cd cuda/
megumism@DESKTOP-OFLS0LK:/mnt/e/Code/cuda$ touch test.cpp
megumism@DESKTOP-OFLS0LK:/mnt/e/Code/cuda$ code .

现在VScode应该自动打开并建立与WSL的链接,现在需要安装支持C++的VSC扩展(C/C++ Extension Pack),如果在Windows的环境下已经安装,直接可以选择在WSL: Ubuntu中安装安装在Ubuntu上。

对VSC进行编译运行配置。ctrl + shift+ P 输入C++,选择编辑配置(UI):

  • 工程配置选择Linux
  • 编译器路径如果使用C++个需要将gcc改为g++
  • C标准使用c17
  • C++标准使用c++20

然后现在应该多出一个c_cpp_properties.json

配置并试编译C++

// helloworld.cpp
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};

    for (const string& word : msg)
    {
        cout << word << " ";
    }
    cout << endl;
}
  1. 打开 helloworld.cpp ,使其成为活动文件。
  2. 按编辑器右上角的播放按钮(三角形,不带虫子,如果有虫子点一下右边的展开符号选运行run)。
  3. 从系统上检测到的编译器列表中选择 C/C++: g++ 生成和调试活动文件。

现在应该正常run并且输出。

参考: Configure VS Code for Microsoft C++ - Visual Studio Code

安装Nvidia图形驱动

如果想知道有没有在装游戏驱动的时候顺便装过,或者按照下面的装了,可以在Ubuntu进行安装验证,输入下面的命令验证驱动是否安装完成“

nvidia-smi

Official Drivers | NVIDIA,根据电脑选择驱动进行下载。

安装选项选择NVIDIA图形驱动程序。

安装CUDA开发环境

进入CUDA开发者网站下载CUDA编译环境,选择Linux和WSL Ubuntu的deb版本,在Ubuntu中输入对应的命令进行安装。

CUDA Toolkit 12.3 Update 1 Downloads - Nvidia developer为例(建议搜索最新的版本),打开之后可以看到已经选择了:

  • Operating System:Linux
  • Architecture:x86_64
  • Distribution:WSL-Ubuntu
  • Version:2.0
  • Installer Type:deb(local)

输入其中显示的命令完成安装后,以下命令,查看是否已经完成了CUDA编译环境的配置:

nvcc --version

如果显示找不到nvcc也很正常,大多数情况下,nvcc 和其他 CUDA SDK 二进制文件不在环境变量 PATH 中。检查CUDA的安装路径:

megumism@DESKTOP-OFLS0LK:/mnt/e/Code/cuda$ dpkg -L cuda-toolkit-12-3
/.
/usr
/usr/local
/usr/local/cuda-12.3
/usr/local/cuda-12.3/version.json
/usr/share
/usr/share/doc
/usr/share/doc/cuda-toolkit-12-3
/usr/share/doc/cuda-toolkit-12-3/changelog.Debian.gz

如果它安装在/usr/local/cuda ,则将其 bin 文件夹添加到 PATH ~/.bashrc 变量中:

export CUDA_HOME=/usr/local/cuda
export PATH=${CUDA_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH
# 如果想加到路径里
source ~/.bashrc 

参考: nvcc not found but cuda runs fine? - stackoverflow

配置VScode编译cuda

问gpt要一个helloworld demo:

#include <stdio.h>

__global__ void helloFromGPU() {
    printf("Hello World from GPU!\n");
}

int main() {
    // 在GPU上启动打印操作,<<<1, 10>>>表示启动1个block,每个block包含10个线程
    helloFromGPU<<<1, 10>>>();
    // 等待GPU完成所有任务
    cudaDeviceSynchronize();

    return 0;
}

编译运行查看输出:

megumism@DESKTOP-OFLS0LK:/mnt/e/Code/cuda$ nvcc testcuda.cu -o hello
megumism@DESKTOP-OFLS0LK:/mnt/e/Code/cuda$ ./hello
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!

说明可以正常编译,在wsl中打开code,安装安装 Nvidia Nsight 拓展,手动写一下task命令:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "CUDA调试",
            "command": "nvcc",
            "args": [
                // "-pthread",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        },
    ],
    "version": "2.0.0"
}

点一下小三角,程序此时应该在code里也能自动编译并给出正确的输出。

全局参考

感谢贴吧!感谢共享精神!主体框架内容来自:【教程】【CUDA C++】使用VSCode搭建WSL + CUDA + C/C... - 百度贴吧,作者还提供了PDF下载,本教程在此基础上增加了调试使用的demo文本,增加了nvcc找不到的解决方案。