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
-
下载在线安装类型中 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
- 安装 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
- 验证 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
结语
不枉博主详细讲解,欢迎订阅博主–炭烤毛蛋 。