不同命令查看cuda版本的区别
nvcc --version
# 查看 CUDA runtime api 的版本,为实际使用的版本
ls -l /usr/local | grep cuda
# cuda 默认安装在 /usr/local 目录,查看当前目录下有哪些 cuda 版本
nvidia-smi
# 查看 CUDA driver api,指的是当前 driver 能支持的最高 runtime api 版本
cat /usr/lib/cuda/version.txt
# 一些情况下的路径为 /usr/lib/cuda/version.json
cat /usr/share/doc/nvidia-cuda-toolkit/version.txt
# 属于作为 Linux 发行版的安装版本,不一定是实际使用的版本
CUDA APIs
CUDA 是由 NVIDIA 推出的通用并行计算架构,通过一些 CUDA 库提供了一系列 API 供应用程序调用,开发者可以通过这些 API 利用 GPU 来处理图像、视频解码等。
CUDA 的 API 是可以分层理解的,当出现 nvcc --version
与 nvidia-smi
显示版本不一致时,应该认识到二者或许并不是同意层次的 API,有时并不是一起安装的。
CUDA API体系包括:
- CUDA Libraries( CUDA 函数库)
- CUDA Runtime API ( CUDA 运行时 API )
- CUDA Driver API ( CUDA 驱动 API )
-
CUDA Driver API
-
是 GPU 设备的抽象层,通过提供一系列的接口来操作 GPU 设备,性能好但编程难度高
-
用于支持 driver api 的必要文件(如
libcuda.so
)是由 GPU driver installer 安装的nvidia-smi
查询的就是此类 API
-
-
CUDA Runtime API
-
是对 CUDA Driver API 进行了一定的封装,从而降低开发难度
-
用于支持 runtime api 的必要文件(如
libcudart.so
与nvcc
)是由 GPU Toolkit installer 安装的nvcc --version
查询的就是此类 APInvcc
:cuda 编译器(将程序编译成可执行的二进制文件)- NVIDIA System Management Interface 命令行实用工具,用于帮助管理和监控 NVIDIA GPU 设备
-
CUDA Toolkit Installer 通常集成了 GPU driver installer,此时 runtime api 与 driver api 的版本应该一致。但如果是单独进行 GPU driver installer 的安装,版本有有可能不一致。driver api 向下兼容 runtime api,故保证
nvidia-smi
的版本>=
nvcc --version
的版本即可。 -
nvcc --version
只知道它自身构建时的 CUDA runtime 版本,并不知道安装了什么版本的 GPU driver(甚至不知道是否安装了 driver);nvidia-smi
只知道它自身构建时的 CUDA driver 版本,并不知道安装了什么版本的 GPU runtime(甚至不知道是否安装了 runtime)
-
-
CUDA Librabies
- 是对 CUDA Runtime API 更高一层的封装,通常是一些成熟的高效函数库
- 支持开发者自己封装一些函数库进行调用
- 常见的库有
cuFFT
,cuBLAS
等
对于 nvcc --version
此方式显示的版本将作为差异修正时的依据,此前应该选择并确认需要使用的执行文件。
-
查看实际执行的文件
$ which nvcc /usr/local/cuda-11.2/bin/nvcc
-
查看所有可执行文件
$ find /usr -type f -iname nvcc /usr/local/cuda-11.2/bin/nvcc /usr/lib/nvidia-cuda-toolkit/bin/nvcc /usr/bin/nvcc
从以上可以看出,
nvcc --version
实际是运行/usr/local/cuda-11.2/bin/nvcc
这个可执行文件。但当多个 cuda 版本同时存在时,需要查看内部具体执行的版本。 -
查看实际运行的执行文件并修改为对应版本
( 假设实际运行的文件需为
/usr/bin/nvcc
)$ vim /usr/bin/nvcc #!/bin/sh # exec /usr/lib/nvidia-cuda-toolkit/bin/nvcc "$@" exec /usr/local/cuda-11.2/bin/nvcc "$@
对文件内容进行修改,目的是让 exec
的实际命令为对应版本
$ vim ~/.bashrc
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-11.2/bin:$PATH
export CUDA_HOME=/usr/local/cuda-11.2
此处最好使用 /usr/local/cuda-11.2/bin:$PATH
代替 $PATH:/usr/local/cuda-11.2/bin
,否则可能会出现一些路径带来的版本差异问题
cat
版本不同
在经过上述修改后,nvcc --version
应该显示ls -l /usr/local | grep cuda
下的一个期望使用版本,且二者版本低于nvidia-smi
的支持最高版本。
对于不同的 cat /usr/lib/cuda/version.txt
下版本,作出解释:
/usr/lib/cuda/version.txt
属于 Linux distribution 的一部分安装版本/usr/local/cuda
是手动进行安装的,不依赖于系统分发的
使用的版本应该依照 PATH
与 which
的结果。会仍然存在两个版本,所以以何种方式进行版本的查询更加重要,这能帮助我们对使用的内容更加明确。
参考资料
/usr/local/cuda/version.txt does not match with /usr/lib/cuda/version