在docker镜像中编译时(即在dockerfile中),应将marchmtune设置为什么?

请注意,这不是在正在运行的容器中进行编译,而是在构建容器时进行编译(例如,在运行镜像时从源构建工具)。

例如,当前,当我运行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。

最佳答案



这是真的。构建docker镜像时,它是在主机上并使用其资源完成的,因此-march=native-mtune=native将采用主机的规范。

为了构建可供广大读者使用的docker镜像,并使它们在尽可能多的(X86)目标上运行,最好使用通用的指令集。如果您需要指定marchmtune,则可能是最安全的选择:
-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镜像的不错选择,应提供良好的可移植性,并且通常会对性能造成较小的影响。

10-07 16:26
查看更多