CUDA/cudnn/CUDA Toolkit/NVCC区别简介

发布时间 2023-10-09 22:36:35作者: emanlee

 

CUDA:为“GPU通用计算”构建的运算平台。

cudnn:为深度学习计算设计的软件库。

CUDA Toolkit (nvidia): CUDA完整的工具安装包,其中提供了 Nvidia 驱动程序、开发 CUDA 程序相关的开发工具包等可供安装的选项。包括 CUDA 程序的编译器、IDE、调试器等,CUDA 程序所对应的各式库文件以及它们的头文件。

CUDA Toolkit (Pytorch): CUDA不完整的工具安装包,其主要包含在使用 CUDA 相关的功能时所依赖的动态链接库。不会安装驱动程序。

(NVCC 是CUDA的编译器,只是 CUDA Toolkit 中的一部分)

注:CUDA Toolkit 完整和不完整的区别:在安装了CUDA Toolkit (Pytorch)后,只要系统上存在与当前的 cudatoolkit 所兼容的 Nvidia 驱动,则已经编译好的 CUDA 相关的程序就可以直接运行,不需要重新进行编译过程。如需要为 Pytorch 框架添加 CUDA 相关的拓展时(Custom C++ and CUDA Extensions),需要对编写的 CUDA 相关的程序进行编译等操作,则需安装完整的 Nvidia 官方提供的 CUDA Toolkit。

 

二、CUDA Toolkit具体组成

 

一般的结构中,include 包含头文件,bin 包含可执行文件,lib 包含程序实现文件编译生成的library,src包含源代码,doc或help包含文档,samples包含例子。

Compiler:NVCC

Tools:分析器profiler、调试器debuggers等

Libraries:科学库和实用程序库

CUDA Samples:CUDA和library API的代码示例

CUDA Driver:驱动,需要与“有CUDA功能的GPU”和“CUDA”都兼容。CUDA工具包都对应一个最低版本的CUDA Driver,CUDA Driver向后兼容。

 

三、NVCC简介

nvcc其实就是CUDA的编译器,cuda程序有两种代码, 在cpu上的host代码和在gpu上的device代码。

.cu后缀:cuda源文件,包括host和device代码

nvcc编译例子

1、pytorch运行时的CUDA版本

(1)查看cuda 运行版本 和 编译时的版本

(2)pytorch寻找可用CUDA的过程:

查找可用的cuda路径

1、环境变量CUDA_HOME 或 CUDA_PATH

2、/usr/local/cuda

3、which nvcc的上级上级目录

(which nvcc 会在环境变量PATH中找)

4、如果上述都不存在,则torch.utils.cpp_extension.CUDA_HOME为None,会使用conda安装的cudatoolkit,其路径为cudart 库文件目录的上级目录(此时可能是通过 conda 安装的 cudatoolkit,一般直接用 conda install cudatoolkit,就是在这里搜索到 cuda 库的)。

测试过程(1):改掉默认可以的搜索路径

测试过程(2):测试torch.utils.cpp_extension.CUDA_HOME路径和torch.version.cuda 版本

测试过程(3):把上述修改的路径改回去

在确定好使用的 cuda 路径后,基于 cuda 的 Pytorch 拓展即会使用确定好的 cuda 目录中的可执行文件( /bin )、头文件( /include )和库文件( /lib64 )完成所需的编译过程。

2、conda下的cudatoolkit

通过 conda 安装 cudatoolkit 包含的库文件在 ~/miniconda3/lib 中,或者在miniconda3/pkgs/cudatoolkit-xxx/lib 中查看)

conda 的 cudatoolkit只包含pytorch或其他框架( tensorflow、xgboost、Cupy)会使用到的so库文件。

3、nvidia-smi和nvcc显示的CUDA版本

CUDA主要有两个API:runtime API、driver API

 

用于支持driver API的必要文件(如libcuda.so)是由GPU driver installer安装的。

用于支持runtime API的必要文件(如libcudart.so以及nvcc)是由CUDA Toolkit installer安装的。

nvidia-smi属于driver API、nvcc属于runtime API。

nvcc属于CUDA compiler-driver tool,只知道runtime API版本,甚至不知道是否安装了GPU driver。

4、使用环境变量查找CUDA

  • 一般的安装CUDA时,大家都会在~/.bashrc中添加如下内容

上述这个代码存在一个BUG,即在LD_LIBRARY_PATH不存在时,LD_LIBRARY_PATH会被赋值为":/usr/local/cuda/lib64"而不是"/usr/local/cuda/lib64",有一个冒号的区别。这个BUG对于pytorch来说,是无所谓的,哪怕不加,pytorch也会通过/usr/local/cuda找到外部的CUDA。但对于一些兼容性没那么好的代码而言,环境变量是最重要的,在~/.bashrc中,应使用这段代码来添加环境变量

 

 

https://zhuanlan.zhihu.com/p/542319274