在docker映像中编译时进行调整

时间:2019-01-04 12:40:52

标签: docker gcc g++ containers compiler-optimization

在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。

1 个答案:

答案 0 :(得分:3)

  

如果我在Dockerhub构建的映像中使用native,我猜这将使用Dockerhub使用的计算机的规格,这会影响可下载的映像二进制文件吗?

是的。构建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映像的不错选择,应提供良好的可移植性和通常较小的性能影响。