代码之家  ›  专栏  ›  技术社区  ›  asachet

在Docker映像中编译时的mtune和march

  •  4
  • asachet  · 技术社区  · 6 年前

    在docker映像(即dockerfile)中编译时,应该 march mtune 准备好了吗?

    注意,这不是关于在正在运行的容器中编译,而是在构建容器时编译(例如,在运行映像时从源代码构建工具)。

    例如,当前当我运行 docker build 并从我得到的源安装R包 g++/gcc/f95 ……)

    g++ -std=gnu++14 [...] -O3 -march=native -mtune=native -fPIC [...]
    

    如果我使用 native 在DockerHub构建的图像中,我想这将使用DockerHub使用的机器的规格,这将影响可供下载的图像二进制文件吗?

    这与 this similar question about VMs 但容器不是虚拟机。

    1 回复  |  直到 6 年前
        1
  •  3
  •   valiano    6 年前

    如果我使用 native 在DockerHub构建的图像中,我想这将使用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

    它使用不同的优化标志将十几个基准与GCC6.3进行了比较。基准测试运行在Intel Core-i7 6800K机器上,该机器支持现代Intel指令集,包括SSE、AVX、BMI等(请参见 here 完整列表)。明确地, -O3 VS -O3 -march=native 是一个有趣的度量标准。 在大多数基准测试中,您可以看到 -o3-3月=本地 结束 -O3 小到可忽略(在一种情况下, -O3 赢……

    最后, -3月=x86-64-mtune=通用 对于Docker图像是一个不错的选择,应该提供良好的可移植性和典型的轻微性能冲击。