Makefileから起動したときのAWK CUDAバージョンコマンド構文エラー

Makefileから起動したときのAWK CUDAバージョンコマンド構文エラー

いくつかの問題があります。コマンドラインで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式に行全体を印刷させることもできます)。$2make{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より一般的には、出力は次のようになります。たくさんsedawk(または何でも)を使用する方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-smiawkコマンドでドルを2倍にします。 make n シェル構文の類似性は混乱の原因です。

ver_cuda:
    CUDA = $(shell nvidia-smi | awk -F"CUDA Version:" 'NR==3{split($$2,a," ");print a[1]}')
    VER_CUDA ?= $(CUDA)

関連情報