6

最近、同僚が NVML を使用してデバイス情報を照会する必要があったため、Tesla 開発キット 3.304.5 をダウンロードし、nvml.h ファイルを /usr/include にコピーしました。テストするために、サンプル コードを 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).
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

ただし、nvidia-smi を実行して K20m の状態に関する情報を読み取ることはできます。私の知る限り、nvidia-smi は nvml.h への一連の呼び出しにすぎません。表示されるエラー メッセージはやや不可解ですが、システムにインストールした Tesla ドライバーと nvidia-ml.so ファイルが一致する必要があることを示していると思います。すべてが正しいことを確認するために、CUDA 5.0 を再ダウンロードし、ドライバー、CUDA ランタイム、およびテスト ファイルをインストールしました。nvidia-ml.so ファイルがドライバー (どちらも 304.54) と一致することは確かなので、何が問題なのかについてかなり混乱しています。nvml.h が含まれていない限り、nvcc を使用してテスト コードをコンパイルして実行したり、独自の CUDA コードを実行したりできます。

誰かがこのエラーに遭遇したことがありますか、または問題を修正することについて何か考えがありますか?

$ 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
4

4 に答える 4

0

zCash の EWBF Cuda Miner でこれと同じまたは類似の問題が発生していました。

WIN10用のPro7echの回答(私にとってはうまくいきました)を自動的に実装する方法は次のとおりです。

まだ持っていない場合は、Windows 10 用の WDK をインストールします。これにより、バッチ スクリプトを介してデバイスを操作できる devcon.exe を使用できるようになります: https://docs.microsoft.com/en-us/windows-ハードウェア/ドライバー/ダウンロード-the-wdk

C++ ワークロードを使用したデスクトップ開発を行うビジュアル スタジオがない場合は、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 -アクセス/

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 エラーが発生した場合は、このバッチ ファイルを実行するだけで修正されます。これらの 2 行を start.bat ファイルの先頭に追加して毎回これを行うこともできますが、マイナーを再起動するたびにエラーが常に発生するとは限らないことがわかりました。


参考文献:

スーパーユーザー投稿

devcon コマンド

Devcon の例

一致するデバイスが見つかりません。

注: コマンドには、デバイス ID の先頭に @ 記号が必要です。バッチ スクリプトは管理者として実行する必要があります。

于 2018-03-22T23:51:41.450 に答える