赞
踩
目前很多服务器是unix系统或者linux系统,想学习Linux系统上调用GPU进行程序加速,但是没有Linux系统设备,要弄双系统也觉得麻烦。Windows系统有一个适用于Linux的windows子系统,叫做WSL,可以在Windows下使用Linux编程。因此这篇文章就是记录自己在wsl上安装cuda并进行程序测试的过程。
安装过程中由于ubuntu系统、NVIDIA显卡驱动以及cuda版本(包括后面可能安装pytorch等一些包)的适配问题,会有非常多的坑,因此,明确自己各个设备的版本十分有必要。
本人的设备以及要安装的软件系统包括:
NVIDIA GeForce GTX 750 ti显卡
NVIDIA 显卡驱动472.212
ubuntu22.04
cuda11.4
这个网上有很多教程,自己找个装就好了。这里贴一个:
Win11 WSL2 安装教程
我按照上面的教程,安装了wls2+ubuntu22.04。
注意,ubuntu安装过程会附带安装某个版本的gcc、g++,但是这个版本可能会与cuda版本不匹配,这个我们会讲。
此处参考教程:如何使用 GTX750 或 1050 显卡安装 CUDA11+和win11 WSL ubuntu安装CUDA、CUDNN、TensorRT最有效的方式_wsl安装cudnn-CSDN博客
要安装 CUDA 的条件是电脑有独立显卡,并且显卡是英伟达也就是 N 卡。打开“控制面板”,点击“硬件和声音”,找到“NVIDIA控制面板”并打开,点击“系统信息”。
“显示”里面可以看到当前驱动的版本。“组件”里面可以看到支持当前驱动的最高cuda版本。如果你想下载高版本cuda,那么就需要更新显卡驱动程序了。
或者打开命令行窗口,输入:
nvidia-smi
也可以看到驱动程序版本和最高支持的cuda版本。如果 cmd 输入后找不到该命令,需要把 “C:\Program Files\NVIDIA Corporation\NVSMI” (监控工具默认位置) 添加到 “path” 的环境变量中。可以看一下上面的参考链接。
首先查看显卡的型号,打开“任务管理器”,点击“性能”,找到GPU,这里将显示显卡的型号。
然后下载显卡驱动。进入英伟达驱动下载网站:NVIDIA Driver Downloads.选择对应显卡型号的驱动程序并下载一个最新的。
下载完之后双击进行安装。安装之后可以把原来版本的驱动程序给卸载。
重启计算机之后,驱动程序应该更新到了下载好的版本!可以在Step1再次查看是否更新成功,并且查看当前最高支持的cuda版本。
打开网站developer.nvidia.com/cuda-toolkit-archive,找一个满足条件的cuda版本,比如我的驱动程序最高支持cuda11.4,于是选择cuda11.4.0.按照如图所示选择,下面会显示下载的指令。
之后,我们以管理员身份运行命令行窗口,并输入wsl切换至ubuntu系统。然后依次输入上面的下载指令。
注意,安装过程可能会出现如下问题:
W: http://mirrors.aliyun.com/kubernetes/apt/dists/kubernetes-xenial/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
可以直接忽略,也可以参考链接:ubuntu 安装 cuda-CSDN博客以去除“warning”代码提示。
The following packages have unmet dependencies:
libcufile-11-4 : Depends: liburcu6 but it is not installable
E: Unable to correct problems, you have held broken packages.
参考链接: WSL2 Ubuntu22.04 + 3070安装cuda11.6 +Pytorch1.13.0全纪录_wsl ubuntu cuda-CSDN博客进行解决。
安装时间可能比较长,耐心等待就好。
使用cd ~
命令切换至用户文件夹下,并用nano文本编辑器(没有这个就sudo install nano
)打开.bashrc
文件。
nano .bashrc
#config cuda
export CUDA_HOME=/usr/local/cuda-11.4
export PATH=$PATH:$CUDA_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/extras/CUPTI/lib64
按ctrl+X
退出,Y
保存,enter
确定。然后输入:
source ~/.bashrc
环境变量生效。
如果这几步没有问题,cuda程序就安装好了,使用命令:
nvcc --version
如果安装成功,会输出类似如下信息:
确保windows下面安装了vscode,安装教程可以网上找。
首先安装WSL插件,确保WSL-Ubuntu系统下也能调用vscode。
在命令窗口,创建cpp文件夹并用vscode打开:
mkdir myproject
cd myproject
mkdir cpp
cd cpp
code .
在该文件夹下创建一个test.cu
文件,并输入下面的测试代码并保存:
#include <stdio.h> __global__ void myKernel() { printf("Hello, world from the device!\n"); } int main() { myKernel<<<4,4>>>(); cudaError_t cudaError = cudaGetLastError(); if (cudaError != cudaSuccess) { printf("CUDA error: %s\n", cudaGetErrorString(cudaError)); return 1; } else { printf("No CUDA error\n"); } cudaDeviceSynchronize(); }
该代码调用4个线程块,每个线程块有4个线程,因此将会输出16个"Hello, world from the device!".
新建一个终端,在终端输入下面指令进行编译:
nvcc test.cu -o test
输入下面指令进行运行:
./test
如果输出结果为16个"Hello, world from the device!",那么测试成功!你已经可以成功调用GPU进行编程!
注意,也有可能出现如下的问题:
#error -- 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.
| ^~~~~
解决方法: 这说明cuda不支持ubuntu自带的gcc版本,因此我们需要重新安装gcc和g++,参考解决链接CUDA与我的gcc版本不兼容 | 码农家园 (codenong.com)。在命令行窗口依次执行以下命令:
# 安装支持的gcc版本
sudo apt-get install gcc-10
sudo apt-get install g++-10
# 更改软连接
cd /usr/bin
sudo rm gcc
sudo rm g++
sudo ln -s /usr/bin/gcc-10 gcc
sudo ln -s /usr/bin/g++-10 g++
CUDA error: no kernel image is available for execution on the device
解决方法: 在cuda调用GPU内核时,会默认指定GPU架构,不同版本cuda可能会有差异?如果默认的架构与我们的显卡架构不一致,就会出现内核无法调用的问题。按照链接CUDA GPUs - Compute Capability | NVIDIA Developer,查找显卡的算力。
比如我的GTX 750 ti算力为5.0,因此算力架构为compute_50 sm_50
,编译cpp代码时指定相应GPU架构编译再运行就不会出现上面的问题了。
nvcc -arch=compute_50 -code=sm_50 test.cu -o test
如果不想每次编译时都这么复杂,那也可以为nvcc设置别名,用nano编辑.bashrc
并在末尾加入:
# 命名一个别名,以指定调用gpu的架构
alias nvcc='nvcc -arch=compute_50 -code=sm_50'
保存并source。这样,运行:
nvcc test.cu -o test
和运行上面指定GPU架构的编译命令就没什么区别了。
个人感觉GPU可以看作CPU的一个辅助工具,用于快速的流水线作业,而CPU则是大脑发出生产的指令。cuda搭起了CPU指挥GPU的通信桥梁。所以CUDA的版本,GPU的版本都会影响二者之间建立联系。因此安装过程格外需要注意版本问题以及一些调用指令。
最后再次感谢文中出现的博客,讨论贴链接,学习了很多。抱拳了~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。