为了测试,我在tdk_3.304.5/nvml/example中编译了示例代码,它工作得很好。
过了一个周末,系统中发生了一些变化(我无法确定发生了什么变化,而且我也不是唯一有权访问该机器的人),现在任何使用nvml.h的代码都会失败,并显示以下错误:
Failed to initialize NVML:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
WARNING:
You should always run with libnvidia-ml.so that is installed with your NVIDIA Display Driver. By default it's installed in /usr/lib and /usr/lib64. libnvidia-ml.so in TDK package is a stub library that is attached only for build purposes (e.g. machine that you build your application doesn't have to have Display Driver installed).
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!为了确保一切正常,我重新下载了CUDA 5.0,并安装了驱动程序、CUDA运行时和测试文件。我确信nvidia-ml.so文件与驱动程序匹配(两者都是304.54),所以我很困惑到底出了什么问题。我可以使用nvcc编译和运行测试代码,也可以运行我自己的CUDA代码,只要它不包含nvml.h。
有没有人遇到过这个错误,或者有什么想法来纠正这个问题?
$ ls -la /usr/lib/libnvidia-ml*
lrwxrwxrwx. 1 root root 17 Jul 19 10:08 /usr/lib/libnvidia-ml.so -> libnvidia-ml.so.1
lrwxrwxrwx. 1 root root 22 Jul 19 10:08 /usr/lib/libnvidia-ml.so.1 -> libnvidia-ml.so.304.54
-rwxr-xr-x. 1 root root 391872 Jul 19 10:08 /usr/lib/libnvidia-ml.so.304.54
$ ls -la /usr/lib64/libnvidia-ml*
lrwxrwxrwx. 1 root root 17 Jul 19 10:08 /usr/lib64/libnvidia-ml.so -> libnvidia-ml.so.1
lrwxrwxrwx. 1 root root 22 Jul 19 10:08 /usr/lib64/libnvidia-ml.so.1 -> libnvidia-ml.so.304.54
-rwxr-xr-x. 1 root root 394792 Jul 19 10:08 /usr/lib64/libnvidia-ml.so.304.54
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module 304.54 Sat Sep 29 00:05:49 PDT 2012
GCC version: gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2012 NVIDIA Corporation
Built on Fri_Sep_21_17:28:58_PDT_2012
Cuda compilation tools, release 5.0, V0.2.1221
$ whereis nvml.h
nvml: /usr/include/nvml.h
$ ldd example
linux-vdso.so.1 => (0x00007fff2da66000)
libnvidia-ml.so.1 => /usr/lib64/libnvidia-ml.so.1 (0x00007f33ff6db000)
libc.so.6 => /lib64/libc.so.6 (0x000000300e400000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000300ec00000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000300e800000)
/lib64/ld-linux-x86-64.so.2 (0x000000300e000000)编辑:解决方案是删除libnvidia-ml.so的所有额外实例。出于某种原因,他们有很多人。
$ sudo find / -name 'libnvidia-ml*'
/usr/lib/libnvidia-ml.so.304.54
/usr/lib/libnvidia-ml.so
/usr/lib/libnvidia-ml.so.1
/usr/opt/lib/libnvidia-ml.so
/usr/opt/lib/libnvidia-ml.so.1
/usr/opt/lib64/libnvidia-ml.so
/usr/opt/lib64/libnvidia-ml.so.1
/usr/opt/nvml/lib/libnvidia-ml.so
/usr/opt/nvml/lib/libnvidia-ml.so.1
/usr/opt/nvml/lib64/libnvidia-ml.so
/usr/opt/nvml/lib64/libnvidia-ml.so.1
/usr/lib64/libnvidia-ml.so.304.54
/usr/lib64/libnvidia-ml.so
/usr/lib64/libnvidia-ml.so.1
/lib/libnvidia-ml.so.old
/lib/libnvidia-ml.so.1发布于 2013-07-22 23:53:02
出现此错误是因为尝试使用nvml的应用程序正在加载位于以下位置的存根库:
...tdk_install_path/lib64/libnvidia-ml.so而不是下面的那个:
/usr/lib64/libnvidia-ml.so当我将存根库路径添加到我的LD_LIBRARY_PATH环境变量中时,我能够重现您的错误。因此,如果有人将tdk发行版附带的存根库的路径添加到您的LD_LIBRARY_PATH环境变量中,这可能是导致错误的一个原因,但这可能不是发生这种情况的唯一方法。如果有人以不寻常的方式将存根库复制到某个系统路径,这也可能是一个问题。
您需要尝试弄清楚为什么您的系统要加载该存根库而不是/usr/lib64中的正确存根库。或者,出于发现的目的,您可以尝试删除系统上任何位置的存根库的所有实例(只保留/usr/lib和/usr/lib64中的正确库),您应该能够观察到正确的行为。
发布于 2017-07-11 23:00:08
我在使用Windows10的GTX1070上这样解决了这个问题:进入设备管理器,选择有问题的GPU,禁用GPU,然后重新启用。
发布于 2018-03-23 07:51:41
我在zCash上使用EWBF Cuda Miner时遇到了同样或类似的问题。
这里有一种自动实现Pro7ech的答案的方法(对我很有效),适用于WIN10:
如果您还没有安装WDK for Windows10,请安装它:这将使您能够使用允许通过批处理脚本操作设备的devcon.exe:https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk
如果没有使用C++ workload进行桌面开发的visual studio,则可能还需要Windows SDK:https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk
为了简单起见,您可能需要将安装路径添加到path环境变量中:https://www.howtogeek.com/118594/how-to-edit-your-system-path-for-easy-command-line-access/
Devcon.exe是为我安装的:
C:\Program Files (x86)\Windows Kits\10\Tools\x64因此,现在在cmd.exe提示符中运行以下命令或类似命令,以获取设备id:
devcon findall * | find /i "nvidia"我的是这样的:
C:\Users\Soenhay>devcon findall * | find /i "nvidia"
HDAUDIO\FUNC_01&VEN_10DE&DEV_0083&SUBSYS_38426674&REV_1001\5&1C277AD4&0&0001: NVIDIA High Definition Audio
SWD\MMDEVAPI\{0.0.0.00000000}.{574980C3-9747-42EF-A78C-4C304E070B81}: SAMSUNG (NVIDIA High Definition Audio)
ROOT\UNNAMED_DEVICE\0000 : NVIDIA Virtual Audio Device (Wave Extensible) (WDM)
PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000: NVIDIA GeForce GTX 1070从这里我可以看到我的图形设备id是:
PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000因此,我创建了一个批处理文件,其中包含以下内容以禁用和重新启用驱动程序:
devcon disable "@PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000"
devcon enable "@PCI\VEN_10DE&DEV_1B81&SUBSYS_66743842&REV_A1\4&1F1337ch33s3&0&0000"现在,当我在启动挖掘器时得到NVML错误时,我只需要运行这个批处理文件,它就会修复它。您也可以将这两行添加到start.bat文件的开头,以便每次执行此操作,但我发现并不是每次重新启动miner time时都会出现错误。
参考文献:
注意:该命令应该在设备id的开头有@符号。批处理脚本应以管理员身份运行。
https://stackoverflow.com/questions/17791053
复制相似问题