我有一些问题,我只想从命令行使用 nvidia-smi 捕获准确的 CUDA 版本,并且它在 shell 中工作:
$ 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
而不是 just$2
来防止make
扩展它(可能扩展为空,导致 awk 表达式只是{print }
并打印整行)。
例如,极简主义Makefile
:
all:
CUDA="$(shell nvidia-smi -q | awk -F': ' '/CUDA Version/ {print $$2}')"
请注意 awk 字段分隔符中的冒号后跟空格-F
。
$ make
CUDA="Not Found"
这实际上是我的系统的正确值,我没有安装 CUDA。
顺便说一句,重要的是要认识到,虽然某些 make 语法看起来有点像 shell 语法,但它们非常不同......而且更糟糕的是,相似之处可以使编写有错误的 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 make:
shell
在命令前添加关键字nvidia-smi
并将 awk 命令中的美元加倍。 make n shell 语法中的相似之处是造成混乱的根源。
ver_cuda:
CUDA = $(shell nvidia-smi | awk -F"CUDA Version:" 'NR==3{split($$2,a," ");print a[1]}')
VER_CUDA ?= $(CUDA)