WSL2Linux 子系统(十二)

wsl 子系统安装 cuda 环境

WSL2Linux 子系统(十一)》讲述 WSL 网络转为桥接模式的两种方法,WSL 网络桥接模式无论是静态 IP 还是动态分配 IP 均支持。本篇文章则是简单讲述 WSL 安装 cuda 环境。

作者:炭烤毛蛋 ,点击博主了解更多。


提示: 请按照系统版本安装指定 cuda。


1. 安装 cuda

  • 下载安装包
    本文 Linux 版本使用 Ubuntu 20.04,安装 cuda 环境需要匹配系统 Linuix,系统平台 x86_64, 系统分支为 WSL-Ubuntu,WSL 2.版本,此处使用本地安装脚本 runfile。
    cuda 下载链接为 https://developer.nvidia.com/cuda-11.3.0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_network
    cuda-url

  • 下载在线安装类型中 runfile (local),

wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run
  • 安装 cuda
    直接运行 cuda 安装脚本。
sudo sh cuda_11.3.0_465.19.01_linux.run

跳过安装过程错误提示执行安装脚本。

sudo sh cuda_11.3.0_465.19.01_linux.run --override

2. 配置 cuda 环境变量

安装完成,配置环境变量

sudo vim ~/.bashrc
#在环境变量配置文件中增加 cuda 变量
export LD_LIBRARY_PATH=/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin

生效刚修改配置。

source ~/.bashrc

#查看cuda版本

nvcc -V

查看nvidia界面,这个需要在原本的Windows系统上安装nvidia驱动的

nvidia-smi

可以正常显示 cuda 版本证明 cuda 环境安装完成。

Tips

  1. 安装 cuda 后遗漏 gcc
    缺少 gcc 错误提示如下:
unsupported GNU version! gcc versions later than 10 are not supported! The nvcc flag '-allow-unsupported-compiler' can be used to override this version check; however, using an unsupported host compiler may cause compilation failure or incorrect run time execution. Use at your own risk.

由于linux中可以有多个版本的gcc和g++,我们可以为系统默认的gcc和g++指定特定的默认版本。对于cuda的nvcc来说有更方便的方法,那就是nvcc会优先读取自身路径下的gcc然后如果没有再读取系统默认路径下的gcc。只需要为nvcc设置特定版本gcc的软连接。

查看当前 gcc 版本

gcc -v

本文中使用 cuda 指定安装 gcc version10 版本,

sudo apt-get install gcc-10
sudo apt-get install g++-10

gcc 软链接到 cuda 目录

sudo ln -s /usr/bin/gcc-10 /usr/local/cuda/bin/gcc
  1. 验证 cuda
    编写一个简单的 CUDA 程序,并进行交叉编译和执行。这个文件命名为 a.cu,在以下增加如下内容:
// a.cu
#include <iostream>

__global__ void vectorAdd(const float* A, const float* B, float* C, int N) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < N) {
        C[i] = A[i] + B[i];
    }
}

int main() {
    int N = 1 << 20; // 1M elements
    size_t size = N * sizeof(float);

    // Allocate host memory
    float* h_A = (float*)malloc(size);
    float* h_B = (float*)malloc(size);
    float* h_C = (float*)malloc(size);

    // Initialize input vectors
    for (int i = 0; i < N; ++i) {
        h_A[i] = i;
        h_B[i] = i;
    }

    // Allocate device memory
    float *d_A, *d_B, *d_C;
    cudaMalloc(&d_A, size);
    cudaMalloc(&d_B, size);
    cudaMalloc(&d_C, size);

    // Copy data from host to device
    cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
    cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);

    // Execute kernel
    int threadsPerBlock = 256;
    int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
    vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N);

    // Copy result from device to host
    cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);

    // Verify results
    for (int i = 0; i < N; ++i) {
        if (h_C[i] != h_A[i] + h_B[i]) {
            std::cerr << "Error at index " << i << ": " << h_C[i] << std::endl;
            return -1;
        }
    }

    std::cout << "Vector addition completed successfully." << std::endl;

    // Free memory
    free(h_A);
    free(h_B);
    free(h_C);
    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);

    return 0;
}

使用 NVIDIA 的 nvcc 编译器来编译 CUDA 文件。

nvcc -o vectorAdd a.cu

在终端中运行生成的可执行文件。

./vectorAdd

提示:编译时指定架构:使用 -gencode 标志为特定架构生成代码。

nvcc -o vectorAdd a.cu -gencode arch=compute_52,code=sm_52

参考资料

CUDA Programming Guide
NVIDIA Developer Zone

结语

不枉博主详细讲解,欢迎订阅博主–炭烤毛蛋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值