网站标题空格,网站建站 seo,WordPress使用固定连接,时尚网站设计教程Linux下的CUDA多版本管理
关于CUDA、cuDNN等的简介和安装可参考#xff1a;显卡、显卡驱动、CUDA、CUDA Toolkit、cuDNN 梳理。
CUDA多版本
有时我们会在一台机器上同时看到多个版本的CUDA#xff0c;比如nvcc -V和nvidia-smi的输出就可能会不同#xff1a;
在我们实验室…Linux下的CUDA多版本管理
关于CUDA、cuDNN等的简介和安装可参考显卡、显卡驱动、CUDA、CUDA Toolkit、cuDNN 梳理。
CUDA多版本
有时我们会在一台机器上同时看到多个版本的CUDA比如nvcc -V和nvidia-smi的输出就可能会不同
在我们实验室的服务器上nvcc --version显示的结果如下
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Tue_Jun_12_23:07:04_CDT_2018
Cuda compilation tools, release 9.2, V9.2.148而nvidia-smi显示结果如下
-----------------------------------------------------------------------------
| NVIDIA-SMI 410.104 Driver Version: 410.104 CUDA Version: 10.0 |
|---------------------------------------------------------------------------
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
||
| 0 Tesla V100-PCIE... On | 00000000:01:00.0 Off | Off |
| N/A 28C P0 26W / 250W | 0MiB / 16130MiB | 0% Default |
---------------------------------------------------------------------------
| 1 Tesla P100-PCIE... On | 00000000:02:00.0 Off | Off |
| N/A 24C P0 30W / 250W | 0MiB / 16280MiB | 0% Default |
--------------------------------------------------------------------------------------------------------------------------------------------------------
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
||
| No running processes found |
-----------------------------------------------------------------------------可以看到nvcc的CUDA 版本是9.2而nvidia-smi的CUDA版本是10.0。如果nvidia-smi命令列出的CUDA版本与nvcc -V列出的版本号不一致可能是由以下原因之一引起的
1安装多版本cuda后还没有刷新环境变量刷新即可
2CUDA有两种API分别是运行时API和驱动API即所谓的Runtime API与Driver APInvidia-smi的结果除了有GPU驱动版本型号还有CUDA Driver API的版本号这里是10.0而nvcc的结果是对应CUDA Runtime API。
对于原因二的一个具体解释如下
CUDA有两个主要的APIruntime(运行时) API和driver(驱动) API。这两个API都有对应的CUDA版本如9.2和10.0等。
用于支持driver API的必要文件(如libcuda.so)是由GPU driver installer安装的。nvidia-smi就属于这一类API。用于支持runtime API的必要文件(如libcudart.so以及nvcc)是由CUDA Toolkit installer安装的。CUDA Toolkit Installer有时可能会集成了GPU driver Installer。nvcc是与CUDA Toolkit一起安装的CUDA compiler-driver tool它只知道它自身构建时的CUDA runtime版本。它不知道安装了什么版本的GPU driver甚至不知道是否安装了GPU driver。
综上如果driver API和runtime API的CUDA版本不一致可能是因为你使用的是单独的GPU driver installer而不是CUDA Toolkit installer里的GPU driver installer。
补充说明在安装CUDA 时候会安装3大组件分别是 NVIDIA 驱动、toolkit和samples。NVIDIA驱动是用来控制GPU硬件toolkit里面包括nvcc编译器等samples或者说SDK 里面包括很多样例程序包括查询设备、带宽测试等等。上面说的CUDA Driver API是依赖于NVIDIA驱动安装的而CUDA Runtime API 是通过CUDA toolkit安装的。
runtime API 与 driver API 的区别
下图很清楚的展示前面提到的各种概念之间的关系其中runtime API和driver API在很多情况非常相似也就是说用起来的效果是等价的但是你不能混合使用这两个API因为二者是互斥的。也就是说在开发过程中你只能选择其中一种API。简单理解二者的区别就是runtime是更高级的封装开发人员用起来更方便而driver API更接近底层速度可能会更快。 两种API详细的区别如下 复杂性 runtime API通过提供隐式初始化、上下文管理和模块管理来简化设备代码管理。这使得代码更简单但也缺乏驱动程序API所具有的控制级别。相比之下driver API提供了更细粒度的控制特别是在上下文和模块加载方面。实现内核启动要复杂得多因为执行配置和内核参数必须用显式函数调用指定。 控制 对于runtime API其在运行时所有内核都在初始化期间自动加载并在程序运行期间保持加载状态。而使用driver API可以只加载当前需要的模块甚至动态地重新加载模块。driver API也是语言独立的因为它只处理cubin对象。 上下文管理 上下文管理可以通过driver API完成但是在runtime API中不公开。相反runtime API自己决定为线程使用哪个上下文: 如果一个上下文通过driver API成为调用线程的当前上下文runtime将使用它如果没有这样的上下文它将使用“主上下文(primary context)”。
主上下文会根据需要创建每个设备每个进程一个上下文并进行引用计数然后在没有更多的引用时销毁它们。在一个进程中所有runtime API的用户都将共享主上下文除非上下文已成为每个线程的当前上下文。runtime使用的上下文即当前上下文或主上下文可以用cudaDeviceSynchronize()同步也可以用cudaDeviceReset()销毁。
但是将runtime API与主上下文一起使用会有tradeoff。例如对于那些需要给较大的软件包写插件的开发者来说者会带来不少麻烦因为如果所有的插件都在同一个进程中运行它们将共享一个上下文但可能无法相互通信。也就是说如果其中一个在完成所有CUDA工作后调用cudaDeviceReset()其他插件将失败因为它们使用的上下文在它们不知情的情况下被破坏。为了避免这个问题CUDA clients可以使用driver API来创建和设置当前上下文然后使用runtime API来处理它。但是上下文可能会消耗大量的资源比如设备内存、额外的主机线程和设备上上下文切换的性能成本。当将driver API与基于runtime API(如cuBLAS或cuFFT)构建的库一起使用时这种runtime-driver上下文共享非常重要。
CUDA多版本管理
我们可以通过
ls -l /usr/local | grep cuda来查看自己的机器上有多少个cuda版本通常不带版本号的 cuda 会是其他带版本号的cuda-x.x的软链接。即像下面这样
lrwxrwxrwx 1 root root 21 12月 10 2020 cuda - /usr/local/cuda-11.1/而我们只要把我们使用cuda时都指向这个软链接/usr/local/cuda并在需要切换版本时切换这个软链接的指向即可。
sudo rm -rf cuda
sudo ln -s /usr/local/cuda-9.0/ /usr/local/cuda注意此时如果nvcc -V的输出还是更改之前的CUDA版本的话要修改环境变量
export PATH/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH并且要去 ~/.bashrc 中查看以下是不是会显式地指定CUDA版本如
export PATH/usr/local/cuda-11.1/bin:$PATH
export LD_LIBRARY_PATH/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH如果有这两句的话直接换成上面两句指向软链接 /usr/local/cuda 的两句即可。
Ref
https://bbs.huaweicloud.com/blogs/detail/140384
https://blog.csdn.net/weixin_38705903/article/details/101850116