CUDA 10.0 安装包浅析

本文基于最新的 CUDA 10.0 CentOS 7 操作系统的 run 文件安装包来进行解压分析,看看里边都有些什么内容。有些可能遇到的问题放在最后的 FAQ 里了。CUDA 9.x 会和10.0 有一些差别,不过大部分还是比较接近的。

CUDA 的源代码在 https://developer.download.nvidia.cn/compute/cuda/opensource/10.0.130/

这里有安装指导 https://developer.download.nvidia.cn/compute/cuda/10.0/Prod/docs/sidebar/CUDA_Installation_Guide_Linux.pdf

有快速开始的指导 https://developer.download.nvidia.cn/compute/cuda/10.0/Prod/docs/sidebar/CUDA_Quick_Start_Guide.pdf

解压

首先要下载安装包,我们下载CUDA 10.0 CentOS 7 的 run 文件安装包,其次我们使用 noexec 参数进行解压,操作如下:

1
2
wget https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda_10.0.130_410.48_linux
sh cuda_10.0.130_410.48_linux --noexec --target v10.0

意思是不运行安装脚本,把 cuda_10.0.130_410.48_linux.run解压到v10.0目录。

下载地址是从官网拷贝下来的,不知道为什么没有.run 的后缀,不过是个 run 包无疑。

总览

我们进入的解压的目录里看看有什么

1
2
3
4
5
6
7
8
[root@cuda ~]# cd v10.0
[root@cuda v10.0]# ll -h
总用量 72K
-rwxr-xr-x 1 root root 45K 9月 13 05:44 cuda-installer.pl
-r-xr-xr-x 1 root root 13K 9月 13 05:44 InstallUtils.pm
drwxrwxr-x 3 root root 196 1月 28 18:32 run_files
-r-xr-xr-x 1 root root 7.6K 9月 13 05:44 uninstall_cuda.pl
[root@cuda v10.0]#

从上边的输出来看,解压以后最先看到的就是这三个文件和一个目录,他们分别是:

  • cuda-installer.pl perl 语言写的安装脚本
  • InstallUtils.pm package InstallUtils .
  • run_files run 包的所有文件。
  • uninstall_cuda.pl perl 语言写的卸载脚本,安装以后可以使用安装包来卸载已经安装好的 CUDA。

我们接下来看一下 run_files 里有什么?

执行 ls 命令

1
2
3
4
5
6
7
8
9
[root@172-18-12-25 run_files]# ll -h
总用量 1.9G
-rwxrwxr-x 1 root root 1.8G 9月 13 05:44 cuda-linux.10.0.130-24817639.run
-rwxrwxr-x 1 root root 83M 9月 13 05:44 cuda-samples.10.0.130-24817639-linux.run
-r--r--r-- 1 root root 63K 9月 13 05:44 EULA.txt
-r-xr-xr-x 1 root root 444K 9月 13 05:44 getpass
-rwxr-xr-x 1 root root 102M 9月 13 05:44 NVIDIA-Linux-x86_64-410.48.run
-r--r--r-- 1 root root 185 9月 13 05:44 pc_template.pc
[root@172-18-12-25 run_files]#

可以看到这些文件

  • cuda-linux.10.0.130-24817639.run CUDA 安装包
  • cuda-samples.10.0.130-24817639-linux.run CUDA sample 例子的安装包
  • EULA.txt End User License Agreement 终端用户 license 协议
  • getpass 一个二进制文件,用来获取一个口令
  • NVIDIA-Linux-x86_64-410.48.run 显卡驱动安装包
  • pc_template.pc pc 模板,用来显示一些基本的信息,内容如下:
1
2
3
4
5
6
7
8
9
10
#pc_template.pc
cudaroot=$(CUDAPATH)
libdir=$(LIBDIR)
includedir=${cudaroot}/include

Name: $(NAME)
Description: $(DESCRIPTION)
Version: $(VERSION)
Libs: -L${libdir} -l$(NAME)
Cflags: -I${includedir}

CUDA 安装包

我们先把 cuda-samples.10.0.130-24817639-linux.run 解压,然后看看里边有什么内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@172-18-12-25 run_files]# sh cuda-linux.10.0.130-24817639.run --noexec --target cuda-linux
[root@172-18-12-25 run_files]# cd cuda-linux
[root@172-18-12-25 cuda-linux]# ll -h
总用量 144K
drwxrwxr-x 3 root root 331 9月 13 05:18 bin
-rw-rw-r-- 1 root root 8.7K 9月 13 05:18 CUDA_Toolkit_Release_Notes.txt
drwxrwxr-x 5 root root 40 9月 13 05:18 doc
-rw-rw-r-- 1 root root 63K 9月 13 05:18 EULA.txt
drwxrwxr-x 5 root root 89 9月 13 05:18 extras
drwxrwxr-x 6 root root 8.0K 9月 13 05:18 include
-rwxr-xr-x 1 root root 19K 9月 13 05:18 install-linux.pl
-r-xr-xr-x 1 root root 13K 9月 13 05:18 InstallUtils.pm
drwxrwxr-x 5 root root 185 9月 13 05:18 jre
drwxrwxr-x 3 root root 4.0K 9月 13 05:18 lib64
drwxrwxr-x 8 root root 226 9月 13 05:18 libnsight
drwxrwxr-x 7 root root 209 9月 13 05:18 libnvvp
drwxrwxr-x 8 root root 160 9月 13 05:18 NsightCompute-1.0
drwxrwxr-x 2 root root 53 9月 13 05:18 nsightee_plugins
drwxrwxr-x 3 root root 21 9月 13 05:18 nvml
drwxrwxr-x 7 root root 85 9月 13 05:18 nvvm
drwxrwxr-x 3 root root 17 9月 13 05:18 share
drwxrwxr-x 2 root root 201 9月 13 05:18 src
drwxrwxr-x 2 root root 43 9月 13 05:18 tools
-r-xr-xr-x 1 root root 7.6K 9月 13 05:18 uninstall_cuda.pl
-rw-rw-r-- 1 root root 22 9月 13 05:18 version.txt
[root@172-18-12-25 cuda-linux]#
  • bin 编译好的命令
  • doc 文档
  • extras cuda gdb 源码以及一些 demo 套件,包括 bandwidthTest、busGrind、deviceQuery、nbody、oceanFFT、randomFog、vectorAdd 。
  • install-linux.pl perl 写的安装脚本
  • jre Oracle java 的 jre, http://java.com/licensereadme
  • libnsight nsight 的 lib 库
  • NsightCompute-1.0 用于CUDA应用程序的交互式内核分析器。
  • nvml 一个简单的示例程序,演示如何构建一个 NVML 客户端。
  • share 里边有一个 gbd 目录
  • tools 有一个计算器
  • version.txt 版本信息
  • CUDA_Toolkit_Release_Notes.txt CUDA 的 Release notes
  • EULA.txt End User License Agreemen 终端用户 license 协议
  • include 各种 .h 文件
  • InstallUtils.pm package InstallUtils
  • lib64 库文件
  • libnvvp nvvp 库文件
  • nsightee_plugins nsightee 的插件
  • nvvm nvvm ,bin 目录下有一个 cicc 的命令
  • src 源码, 有一些 .h 结尾的文件
  • uninstall_cuda.pl perl 写的卸载脚本

CUDA 自身的内容大概就是这样,有需要的可以自行探索。

CUDA sample 例子的安装包

我们先把 cuda-samples.10.0.130-24817639-linux.run 解压,然后看看里边有什么内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@172-18-12-25 run_files]# sh cuda-samples.10.0.130-24817639-linux.run
--noexec --target cuda-samples
[root@172-18-12-25 run_files]# cd cuda-samples
[root@172-18-12-25 cuda-samples]# ll -h
总用量 36K
-r-xr-xr-x 1 root root 784 9月 13 05:18 cuda-install-samples-10.0.sh
-rwxr-xr-x 1 root root 7.3K 9月 13 05:18 install-sdk-linux.pl
-r-xr-xr-x 1 root root 13K 9月 13 05:18 InstallUtils.pm
drwxrwxr-x 11 root root 201 9月 13 05:18 samples
-r-xr-xr-x 1 root root 7.6K 9月 13 05:18 uninstall_cuda.pl
[root@172-18-12-25 cuda-samples]# cd samples
[root@172-18-12-25 samples]# ll -h
总用量 84K
drwxrwxr-x 51 root root 4.0K 9月 13 05:18 0_Simple
drwxrwxr-x 8 root root 145 9月 13 05:18 1_Utilities
drwxrwxr-x 13 root root 241 9月 13 05:18 2_Graphics
drwxrwxr-x 22 root root 4.0K 9月 13 05:18 3_Imaging
drwxrwxr-x 10 root root 209 9月 13 05:18 4_Finance
drwxrwxr-x 10 root root 150 9月 13 05:18 5_Simulations
drwxrwxr-x 34 root root 4.0K 9月 13 05:18 6_Advanced
drwxrwxr-x 38 root root 4.0K 9月 13 05:18 7_CUDALibraries
drwxrwxr-x 6 root root 71 9月 13 05:18 common
-rw-rw-r-- 1 root root 63K 9月 13 05:18 EULA.txt
-rw-rw-r-- 1 root root 2.6K 9月 13 05:18 Makefile
[root@172-18-12-25 samples]# cd ..

我们可以看到第一级目录有如下文件:

  • cuda-install-samples-10.0.sh bash 写的 CUDA sample 安装脚本
  • install-sdk-linux.pl perl 写的 SDK 安装脚本
  • InstallUtils.pm package InstallUtils .
  • samples sample 实例目录
  • uninstall_cuda.pl perl 写的卸载脚本

接下来看一下 samples 里有什么?

  • 0_Simple
  • 1_Utilities
  • 2_Graphics
  • 3_Imaging
  • 4_Finance
  • 5_Simulations
  • 6_Advanced
  • 7_CUDALibraries

上边这8个是 CUDA sample 的内容,主要用来做两件事情,一是举例某个接口或者某个功能该如何使用,二是用来验证某项功能是正常的。 个别项目可以用来测试性能。

  • common 0-7里的源码编译要用到的,很重要.
  • EULA.txt End User License Agreement 终端用户 license 协议
  • Makefile 编译的 Makefile 文件

显卡驱动安装包

首先解压 NVIDIA-Linux-x86_64-410.48.run 安装包,这次 noexec 这个参数不起作用了,查看了一下帮助,要求使用 -x 来进行解压 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@172-18-12-25 run_files]# sh NVIDIA-Linux-x86_64-410.48.run -x --target nvidia-linux
Creating directory nvidia-linux
Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48.................................................................
[root@172-18-12-25 run_files]# cd nvidia-linux/
[root@172-18-12-25 nvidia-linux]# ls
10_nvidia.json libGL.la libnvidia-fatbinaryloader.so.410.48 libnvoptix.so.410.48 nvidia-cuda-mps-server nvidia-settings.1.gz
10_nvidia_wayland.json libGL.so.1.7.0 libnvidia-fbc.so.410.48 libOpenCL.so.1.0.0 nvidia-debugdump nvidia-settings.desktop
32 libGL.so.410.48 libnvidia-glcore.so.410.48 libOpenGL.so.0 nvidia-drm-outputclass.conf nvidia-settings.png
html libglvnd_install_checker libnvidia-glsi.so.410.48 libvdpau_nvidia.so.410.48 nvidia_drv.so nvidia-smi
kernel libGLX_nvidia.so.410.48 libnvidia-glvkspirv.so.410.48 LICENSE nvidia.icd nvidia-smi.1.gz
libcuda.so.410.48 libglxserver_nvidia.so.410.48 libnvidia-gtk2.so.410.48 makeself-help-script.sh nvidia_icd.json.template nvidia-xconfig
libEGL_nvidia.so.410.48 libGLX.so.0 libnvidia-gtk3.so.410.48 makeself.sh nvidia-installer nvidia-xconfig.1.gz
libEGL.so.1.1.0 libnvcuvid.so.410.48 libnvidia-ifr.so.410.48 mkprecompiled nvidia-installer.1.gz pkg-history.txt
libEGL.so.410.48 libnvidia-cbl.so.410.48 libnvidia-ml.so.410.48 nvidia-application-profiles-410.48-key-documentation nvidia-modprobe README.txt
libGLdispatch.so.0 libnvidia-cfg.so.410.48 libnvidia-opencl.so.410.48 nvidia-application-profiles-410.48-rc nvidia-modprobe.1.gz tls
libGLESv1_CM_nvidia.so.410.48 libnvidia-compiler.so.410.48 libnvidia-ptxjitcompiler.so.410.48 nvidia-bug-report.sh nvidia-persistenced tls_test
libGLESv1_CM.so.1.2.0 libnvidia-eglcore.so.410.48 libnvidia-rtcore.so.410.48 NVIDIA_Changelog nvidia-persistenced.1.gz tls_test_dso.so
libGLESv2_nvidia.so.410.48 libnvidia-egl-wayland.so.1.1.0 libnvidia-tls.so.410.48 nvidia-cuda-mps-control nvidia-persistenced-init.tar.bz2
libGLESv2.so.2.1.0 libnvidia-encode.so.410.48 libnvidia-wfb.so.410.48 nvidia-cuda-mps-control.1.gz nvidia-settings
[root@172-18-12-25 nvidia-linux]#

可以看到解压以后都是安装驱动需要的库文件 。

FAQ

某些情况下安装 run 包会提示 Can’t locate InstallUtils.pm ,报错提示如下

1
2
3
4
5
Can't locate InstallUtils.pm in @INC (you may need to install the InstallUtils module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/x86_64-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at ./install-sdk-linux.pl line 6.

BEGIN failed--compilation aborted at ./install-sdk-linux.pl line 6.

'uninstall_cuda_8.0.pl' -> '/usr/local/cuda-8.0/bin/uninstall_cuda_8.0.pl'

出现上述问题的原因就是 InstallUtils.pm 文件没有复制到指定的位置,解决方案也很简单安装本文最开始的使用 noexec 将对应的 run 包解压,拷贝 InstallUtils.pm 到 @INC contains 的某个目录下就可以。

例如 可以拷贝到 perl 的目录下:

1
cp InstallUtils.pm /usr/share/perl5

在重新执行 run 包即可。

======================
Erdong, A Linux user !

Er Dong wechat
扫描二维码关注微信公众号
坚持原创技术分享,您的支持将鼓励我继续创作!