Docker和-march本机

时间:2019-06-18 21:14:56

标签: docker gcc x86-64 cpu-architecture avx

我的应用程序受益于gcc在-march native下运行时可以访问的高级CPU功能。 Docker可以消除OS中的差异,但是如何处理不同的CPU?要构建可以在任何CPU上运行的应用程序,我必须为amd64构建,但会损失很多性能。当需要针对每种CPU架构分别编译应用程序时,是否有一种分发Docker映像的好方法?

1 个答案:

答案 0 :(得分:6)

Docker根本不处理CPU。它只是kernel namespacing,FS系统分层(例如UnionFS)和process quoting的组合。
当您在Docker容器上运行某些内容时,它只是在您的操作系统没有虚拟化上运行的可执行文件,它只能访问一组选定的内核对象(例如设备)并且由于覆盖不同的FS(包括docker容器中的FS)而被限制为FS层次结构。

因此,Docker根本不处理CPU,它与您的问题完全正交。

Peter commented一样,CPU调度基本上有两种方法:

  1. 您加载了正确的动态库(但是对库的每个函数调用都使用一个指针)。
  2. 您可以构建同一静态链接二进制文件的多个版本,然后运行正确的版本。

主要问题是,有时ISA扩展是正交的,这会使组合(即库/二进制文件的数量)呈指数增长。 因此,考虑到您正在与Docker的用户群打交道,可以稍微简化此方法(如果组合存在问题):

  1. 两者都需要进行某些ISA扩展(如果不提供此类扩展,则会导致性能降低太多)。对于可选扩展,可以使用上述方法之一。
  2. 仅创建几个基准容器。例如。一个用于通用amd64,一个用于amd64-avx,一个用于amd64-avx2-aesni-tsx等。想法是只创建几个容器来覆盖用户的 all most few

编辑
BeeOnRope pointed in the comments一样,Dockers 具有在Windows上运行的版本。 It uses Hyper-V to run a Linux VM with the Linux version of docker
由于Hyper-V是本机VMM,因此除了额外的层外,同样的注意事项也适用。
同样,也有macOS版本。 This time it uses an hypervisor framework based on xhyve