我对运行nvcc和nvidia-smi所显示的不同CUDA版本感到非常困惑。我在ubuntu 16.04上安装了cuda9.2和cuda10。现在我将PATH设置为cuda9.2。所以当我跑的时候

$ which nvcc
/usr/local/cuda-9.2/bin/nvcc

然而,当我跑步的时候

$ nvidia-smi
Wed Nov 21 19:41:32 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.72       Driver Version: 410.72       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  GeForce GTX 106...  Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   53C    P0    26W /  N/A |    379MiB /  6078MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1324      G   /usr/lib/xorg/Xorg                           225MiB |
|    0      2844      G   compiz                                       146MiB |
|    0     15550      G   /usr/lib/firefox/firefox                       1MiB |
|    0     19992      G   /usr/lib/firefox/firefox                       1MiB |
|    0     23605      G   /usr/lib/firefox/firefox                       1MiB |

所以我是使用cuda9.2作为nvcc建议,还是我使用cuda10作为nvidia-smi建议?我看到了这个答案,但它没有提供对混乱的直接答案,它只是要求我们重新安装CUDA工具包,我已经这样做了。


当前回答

加上罗伯特·克罗维拉的答案……

设备驱动程序和运行时驱动程序之间的区别在于,使用设备驱动程序,您将能够运行编译好的CUDA C代码。也就是说,你可以下载CUDA驱动的应用程序,它们将能够成功地在你的GPU上执行它们的代码。

然而,使用运行时驱动程序,你将能够编译CUDA C代码,然后在GPU上的设备驱动程序的帮助下执行。

第2.2.3节- Cuda开发工具包

其他回答

CUDA有两个主要的API,运行时API和驱动程序API。两者都有相应的版本(例如8.0、9.0等)。

驱动API的必要支持(例如libcuda)。linux上如此)由GPU驱动程序安装程序安装。

对运行时API(例如libcudart)的必要支持。在linux上,nvcc也是如此)是由CUDA工具包安装程序安装的(其中可能还捆绑了一个GPU驱动程序安装程序)。

在任何情况下,(安装的)驱动程序API版本可能并不总是与(安装的)运行时API版本相匹配,特别是如果你安装了一个独立于安装CUDA(即CUDA工具包)的GPU驱动程序。

nvidia-smi工具由GPU驱动程序安装程序安装,通常GPU驱动程序在视图中,而不是CUDA工具包安装程序安装的任何东西。

最近(linux上的驱动版本介于410.48和410.73之间),NVIDIA的掌权者决定在NVIDIA -smi的输出中添加驱动程序安装的CUDA驱动API版本的报告。

这与已安装的CUDA运行时版本没有连接。

nvcc,与CUDA工具包一起安装的CUDA编译驱动工具,将始终报告它构建时要识别的CUDA运行时版本。它不知道安装了什么驱动程序版本,甚至不知道是否安装了GPU驱动程序。

因此,根据设计,这两个数字不一定匹配,因为它们反映了两种不同的东西。

如果你想知道为什么nvcc -V显示了一个你不期望的CUDA版本(例如,它显示了一个不同于你认为你安装的版本)或根本不显示任何东西,版本方面,这可能是因为你没有遵循CUDA linux安装指南的第7步(在CUDA 11之前)(或CUDA 11 linux安装指南中的第6步)的强制性说明

注意,虽然这个问题主要是针对linux,但同样的概念也适用于windows CUDA安装。驱动程序有一个与之关联的CUDA驱动程序版本(例如,可以通过nvidia-smi查询)。CUDA运行时也有一个与之相关的CUDA运行时版本。这两者并不一定在所有情况下都匹配。

In most cases, if nvidia-smi reports a CUDA version that is numerically equal to or higher than the one reported by nvcc -V, this is not a cause for concern. That is a defined compatibility path in CUDA (newer drivers/driver API support "older" CUDA toolkits/runtime API). For example if nvidia-smi reports CUDA 10.2, and nvcc -V reports CUDA 10.1, that is generally not cause for concern. It should just work, and it does not necessarily mean that you "actually installed CUDA 10.2 when you meant to install CUDA 10.1"

If nvcc command doesn't report anything at all (e.g. Command 'nvcc' not found...) or if it reports an unexpected CUDA version, this may also be due to an incorrect CUDA install, i.e the mandatory steps mentioned above were not performed correctly. You can start to figure this out by using a linux utility like find or locate (use man pages to learn how, please) to find your nvcc executable. Assuming there is only one, the path to it can then be used to fix your PATH environment variable. The CUDA linux install guide also explains how to set this. You may need to adjust the CUDA version in the PATH variable to match your actual CUDA version desired/installed.

类似地,当使用docker时,nvidia-smi命令通常会报告安装在基础机器上的驱动程序版本,而其他版本方法,如nvcc——version将报告安装在docker容器内的CUDA版本。

同样,如果你使用了另一种CUDA“工具包”的安装方法,如Anaconda,你可能会发现Anaconda所指示的版本与nvidia-smi所指示的版本不“匹配”。然而,上述评论仍然适用。Anaconda安装的旧CUDA工具包可以与nvidia-smi报告的新版本一起使用,nvidia-smi报告的CUDA版本比Anaconda安装的版本更新/更高,这并不意味着你有安装问题。

下面是另一个类似的问题。上述处理并不以任何方式表明此答案仅适用于有意或无意地安装了多个CUDA版本的情况。任何时候安装CUDA都会出现这种情况。nvcc和nvidia-smi报告的版本可能不匹配,这是预期的行为,在大多数情况下非常正常。

nvcc在CUDA bin文件夹中-这样检查CUDA bin文件夹是否已添加到您的$PATH。

具体来说,确保您已经执行了CUDA安装后操作(例如从这里开始):

将CUDA Bin添加到$PATH(即在~/.bashrc中添加以下行)

export PATH=/usr/local/cuda-10.1/bin:/usr/local/cuda-10.1/NsightCompute-2019.1${PATH:+:${PATH}}

PS.首先确保存在以下两个路径:/usr/local/cuda-10.1/bin和/usr/local/cuda-10.1/NsightCompute-2019.1 (NsightCompute路径的结尾可能会根据安装的Nsight计算版本稍有不同……

更新$LD_LIBRARY_PATH(即在~/bashrc中添加以下行)。

export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64\
                         ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

在此之后,nvcc和nvidia-smi(或nvtop)都报告了相同的CUDA版本…

如果你正在使用cuda 10.2:

export PATH=/usr/local/cuda-10.2/bin:/opt/nvidia/nsight-compute/2019.5.0${PATH:+:${PATH}}

可能会有帮助,因为当我检查时,cuda-10.2中没有sight-compute目录。 我不确定这只是我的问题,或者为什么他们不在官方文件中提到它。

nvidia-smi可以显示与nvcc报告的“不同的CUDA版本”。因为他们报告了两件不同的事情:

nvidia-smi显示了对给定GPU驱动程序的最大可用CUDA版本支持。 nvcc -V报告的第二件事是系统当前正在使用的CUDA版本。

简而言之

nvidia-smi显示您的驱动程序支持的CUDA的最高版本。nvcc -V显示当前CUDA安装的版本。只要驱动程序支持的版本比安装的版本高,就没问题。你甚至可以同时安装几个版本的CUDA。

加上罗伯特·克罗维拉的答案……

设备驱动程序和运行时驱动程序之间的区别在于,使用设备驱动程序,您将能够运行编译好的CUDA C代码。也就是说,你可以下载CUDA驱动的应用程序,它们将能够成功地在你的GPU上执行它们的代码。

然而,使用运行时驱动程序,你将能够编译CUDA C代码,然后在GPU上的设备驱动程序的帮助下执行。

第2.2.3节- Cuda开发工具包