在docker映像中(即在dockerfile中)进行编译时,march
和mtune
应该设置为什么?
请注意,这不是在正在运行的容器中进行编译,而是在构建容器时进行编译(例如,在运行映像时从源构建工具)。
例如,当前,当我运行docker build
并从源代码安装R软件包时,我得到的负载(可能是g++/gcc/f95
...):
g++ -std=gnu++14 [...] -O3 -march=native -mtune=native -fPIC [...]
如果我在Dockerhub构建的映像中使用native
,我猜这将使用Dockerhub使用的计算机的规格,这会影响可下载的映像二进制文件吗?
这与this similar question about VMs有关,但是容器不是VM。
答案 0 :(得分:3)
如果我在Dockerhub构建的映像中使用
native
,我猜这将使用Dockerhub使用的计算机的规格,这会影响可下载的映像二进制文件吗?
是的。构建docker映像时,它是在主机上并使用其资源完成的,因此-march=native
和-mtune=native
将采用主机的规格。
要构建可供广大读者使用的docker映像,并使它们在尽可能多的(X86)目标上运行,最好使用通用的指令集。如果您需要指定march
和mtune
,则可能是最安全的选择:
-march=x86-64 -mtune=generic
在某些情况下,与-march=native -mtune=native
相比,性能可能会有所下降,但是幸运的是,在大多数应用程序中,这种变化几乎没有引起注意(特定的应用程序可能会受到更大的影响,特别是如果它们依赖于一小部分)。 GCC能够很好地优化的内核功能,例如通过利用CPU向量指令集。
作为参考,请查看Phoronix进行的详细基准测试比较:
GCC Compiler Tests At A Variety Of Optimization Levels Using Clear Linux
它使用不同的优化标志比较了GCC 6.3的十几个基准。基准运行在Intel Core-I7 6800K计算机上,该计算机支持现代的Intel指令集,包括SSE,AVX,BMI等(完整列表请参见here)。具体来说,-O3
与-O3 -march=native
对比是有趣的指标。
您可能会看到,在大多数基准测试中,-O3 -march=native
比-O3
的优势微不足道,甚至可以忽略不计(在某些情况下,-O3
胜出...)。
总而言之,-march=x86-64 -mtune=generic
是Docker映像的不错选择,应提供良好的可移植性和通常较小的性能影响。