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 버전은 옵션 중 하나가 아닙니다 query-gpu. 자세한 내용은 을 참조하세요 nvidia-smi --help-query-gpu.

답변2

GNU가 만든다고 가정하면:

shell명령 앞에 키워드를 추가하고 nvidia-smiawk 명령에서 달러를 두 배로 늘립니다. make n 쉘 구문의 유사성은 혼란의 원인입니다.

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

관련 정보