问题
我刚刚通过文件cuda
按照官方安装说明进行安装。.deb
当涉及到第 6.2.2.3 节(正在运行deviceQuery
)时,我收到消息说没有找到支持 CUDA 的设备,尽管我很确定一切设置正确:
$ ./bin/x86_64/linux/release/deviceQuery
./bin/x86_64/linux/release/deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 38
-> no CUDA-capable device is detected
Result = FAIL
系统信息
以下是有关我的系统的一些信息:
$ uname -m && cat /etc/*release
x86_64
DISTRIB_RELEASE=16.04
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
VERSION="16.04.2 LTS (Xenial Xerus)"
$ uname -r
4.4.0-64-generic
$ lspci | grep -i nvidia
08:00.0 3D controller: NVIDIA Corporation GK208M [GeForce 920M] (rev a1)
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
我还验证了内核头文件是否已安装:
$ sudo apt-get install linux-headers-$(uname -r)
linux-headers-4.4.0-64-generic is already the newest version (4.4.0-64.85).
安装 CUDA
所以我的系统满足所有先决条件。然后我通过 apt-get(我安装了cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
)按照安装说明进行操作。
PATH
并LD_LIBRARY_PATH
设置为指向所需的位置:
$ echo $PATH
/usr/local/cuda-8.0/bin:[...]
$ echo $LD_LIBRARY_PATH
/usr/local/cuda-8.0/lib64
请注意,我确实手动进行了设置,LD_LIBRARY_PATH
尽管有人提到这仅对运行文件安装是必需的。但是,重置时错误仍然存在LD_LIBRARY_PATH
。
NVIDIA 驱动程序似乎也是最新的:
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module 367.57 Mon Oct 3 20:37:01 PDT 2016
GCC version: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
有关 cuda 编译器驱动程序的信息:
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61
说明提到这可能是文件权限的问题:
如果安装了支持 CUDA 的设备和 CUDA 驱动程序,但 deviceQuery 报告不存在支持 CUDA 的设备,这可能意味着 /dev/nvidia* 文件丢失或权限错误。
这些文件没有我随后添加的执行标志:
$ ls -al /dev/nvidia*
crwxrwxrwx 1 root root 195, 0 Feb 27 13:17 /dev/nvidia0
crwxrwxrwx 1 root root 195, 255 Feb 27 13:17 /dev/nvidiactl
crwxrwxrwx 1 root root 195, 254 Feb 27 13:17 /dev/nvidia-modeset
crwxrwxrwx 1 root root 243, 0 Feb 27 13:17 /dev/nvidia-uvm
crwxrwxrwx 1 root root 243, 1 Feb 27 18:24 /dev/nvidia-uvm-tools
但是在运行deviceQuery
(仍然失败)之后,一些权限被重置:
$ ls -al /dev/nvidia*
crwxrwxrwx 1 root root 195, 0 Feb 27 13:17 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Feb 27 13:17 /dev/nvidiactl
crwxrwxrwx 1 root root 195, 254 Feb 27 13:17 /dev/nvidia-modeset
crw-rw-rw- 1 root root 243, 0 Feb 27 13:17 /dev/nvidia-uvm
crw-rw-rw- 1 root root 243, 1 Feb 27 18:24 /dev/nvidia-uvm-tools
这有点令人费解,特别是因为我在deviceQuery
没有sudo
.
也许相关
样本构建失败
当我尝试通过make
它构建 cuda 样本时,其中一个样本失败并显示消息
/usr/bin/ld: cannot find -lnvcuvid
collect2: error: ld returned 1 exit status
Makefile:381: recipe for target 'cudaDecodeGL' failed
make[1]: *** [cudaDecodeGL] Error 1
确实似乎缺少:
$ ls /usr/local/cuda-8.0/lib64/libnvcuvid
ls: cannot access '/usr/local/cuda-8.0/lib64/libnvcuvid': No such file or directory
虽然有对应的头文件:
$ ls /usr/local/cuda-8.0/targets/x86_64-linux/include/nvcuvid.h
/usr/local/cuda-8.0/targets/x86_64-linux/include/nvcuvid.h
静态链接的问题
引发的错误deviceQuery
表明静态链接存在问题:
CUDA Device Query (Runtime API) version (CUDART static linking)
AFAIKLD_LIBRARY_PATH
只负责动态链接。我发现了这个问题,其中建议包含/usr/lib/nvidia-current
链接器路径。但是,我的安装中不存在此目录:
$ ls /usr/lib/nvidia-current
ls: cannot access '/usr/lib/nvidia-current': No such file or directory
看起来您使用的是带有 Nvidia Optimus 的笔记本电脑,您是否使用过切换到 nvidia
prime-select nvidia
还应注意此行为的另一个潜在原因是
CUDA_VISIBLE_DEVICES
环境变量是否已设置为空。我遇到了类似的问题,结果发现这是在我的 bash 环境文件中意外设置的。