在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。
最佳答案
这是真的。构建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镜像的不错选择,应提供良好的可移植性,并且通常会对性能造成较小的影响。