いくつかの問題があります。コマンドラインでnvidia-smiを使用して正しいCUDAバージョンをキャプチャし、シェルで動作します。
$ nvidia-smi | awk -F"CUDA Version:" 'NR==3{split($2,a," ");print a[1]}'
11.0
しかし、makefileで同じことをすると、構文エラーが発生します。
ver_cuda:
CUDA = $(nvidia-smi | awk -F"CUDA Version:" 'NR==3{split($2,a," ");print a[1]}');
VER_CUDA ?= $(CUDA);
結果:
awk: line 1: syntax error at or near ,
expr: syntax error: unexpected argument ‘11.0’
make: Nothing to be done for 'ver_cuda'
誰でも私を助けることができればとても感謝します!
答え1
問題の一部$(nvidia-smi ...)
は$(shell nvidia-smi ...)
。
また、単に拡張を防止する$$2
代わりに使用する必要があります(何も拡張せずにawk式に行全体を印刷させることもできます)。$2
make
{print }
たとえば、ミニマリズムは次のとおりですMakefile
。
all:
CUDA="$(shell nvidia-smi -q | awk -F': ' '/CUDA Version/ {print $$2}')"
awkフィールド区切り文字にコロンとスペースが付いていることに注意してください-F
。
$ make
CUDA="Not Found"
これは実際に私のシステムの正しい値です。 CUDAがインストールされていません。
ちなみに、いくつかのmake構文はシェル構文と少し似ているように見えますが、非常に異なることを認識することが重要です。さらに悪いことは、類似性のためにバグのあるmakefileの作成が非常に簡単になる可能性があるということです。
バラよりMakefile:sedを正しく使用して変数を編集する方法あなたの質問に関連する良い答えを得るために。
nvidia-smi -q
より一般的には、出力は次のようになります。たくさんsed
awk(または何でも)を使用する方perl
が簡単です。
私のシステムの例は次のとおりです。
$ nvidia-smi -q | grep -i version
Driver Version : 460.56
CUDA Version : Not Found
VBIOS Version : 86.06.0E.00.38
Inforom Version
Image Version : G001.0000.01.03
$ nvidia-smi -q | awk -F': ' '/CUDA Version/ {print $2}'
Not Found
CUDAエントリがインストールされていないため、「見つかりません」というメッセージが表示されます。ドライバのバージョンに関する有用な結果が得られます。
$ nvidia-smi -q | awk -F': ' '/Driver Version/ {print $2}'
460.56
nvidia-smi
オプションも多様です--query-gpu
。例えば
$ nvidia-smi --query-gpu=driver_version,vbios_version --format=csv
driver_version, vbios_version
460.56, 86.06.0E.00.38
奇妙なことに、CUDAバージョンはオプションの1つではありませんquery-gpu
。詳細についてはを参照してくださいnvidia-smi --help-query-gpu
。
答え2
GNUが作成すると仮定すると:
shell
コマンドの前にキーワードを追加し、nvidia-smi
awkコマンドでドルを2倍にします。 make n シェル構文の類似性は混乱の原因です。
ver_cuda:
CUDA = $(shell nvidia-smi | awk -F"CUDA Version:" 'NR==3{split($$2,a," ");print a[1]}')
VER_CUDA ?= $(CUDA)