从 Makefile 启动时 AWK CUDA 版本命令语法错误

从 Makefile 启动时 AWK CUDA 版本命令语法错误

我有一些问题,我只想从命令行使用 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)

相关内容