몇 가지 문제가 있습니다. 명령줄에서 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 버전은 옵션 중 하나가 아닙니다 query-gpu
. 자세한 내용은 을 참조하세요 nvidia-smi --help-query-gpu
.
답변2
GNU가 만든다고 가정하면:
shell
명령 앞에 키워드를 추가하고 nvidia-smi
awk 명령에서 달러를 두 배로 늘립니다. make n 쉘 구문의 유사성은 혼란의 원인입니다.
ver_cuda:
CUDA = $(shell nvidia-smi | awk -F"CUDA Version:" 'NR==3{split($$2,a," ");print a[1]}')
VER_CUDA ?= $(CUDA)