GCC-Go - 针对特定架构优化构建

Ant*_*lon 2 compilation environment-variables go compiler-optimization gccgo

如何使用环境变量来优化 Go 二进制文件?

例如,使用 C 和 GCC,您可以设置CFLAGS="-O2 -march=znver1使用第 2 层优化进行构建,并对 Zen 微架构进行特定优化。我在 Golang 的文档中找不到等效的环境变量。

Go 确实提供了一种禁用它们的方法,但不指定在您使用 gccgo 作为编译器后端时使用哪一个。因此,它与一般询问有关 Go 优化标志的其他问题非常不同(例如,将优化标志传递给 Go 编译器? )

Ant*_*lon 7

经过很长时间的搜索,我找到了我需要的信息。首先,正如Adrian提到的,标准 gc 编译器(通常是关于 Go 规范的最新版本)不支持优化标志(除了使用此处提到的完全禁用-N -l它们

但是,如果您使用 GCCGO,则有一个可以使用的环境变量,即GOGCCFLAGS. go env在安装了 gcc-go 的系统上使用时,我看到它的默认值是-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build920233973=/tmp/go-build -gno-record-gcc-switches -funwind-tables. 因此,我们可以覆盖此环境变量并传递其他优化,例如GCCGO 文档中描述的优化。标准 gcc 选项似乎有效,例如-march=native,这正是我正在寻找的。

编辑:经过更多测试,Go似乎经常忽略这个环境变量,所以你必须添加-gccgoflags="${GOGCCFLAGS}".

编辑 25/01/2022:从 Go 1.18 开始,GOAMD64添加了环境变量,允许您选择目标x86_64功能级别(从v1v4)。默认值为,但如果您知道您只针对比Sandy BrigeBulldozerGOAMD64=v1更新的 CPU ,则可以安全地使用它来获得一些性能。GOAMD64=v2

ARM 也存在类似的环境变量。您可以在此处了解更多详细信息: https: //github.com/golang/go/wiki/MinimumRequirements#microarchitecture-support