Docker和-march本机

Dis*_*ame 1 gcc x86-64 cpu-architecture avx docker

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

Mar*_*oom 6

Docker根本不处理CPU。它只是内核命名空间,FS系统分层(例如UnionFS)和进程引用的组合
当您在docker容器上运行某些内容时,它只是在OS上运行的可执行文件,而没有进行虚拟化,它只能访问一组选定的内核对象(例如设备),并且会因覆盖不同的FS而被更改为FS层次结构(包括docker容器中的一个)。

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

正如Peter所评论的,CPU调度基本上有两种方法:

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

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

  1. 要么都需要一些ISA扩展(如果不提供这些扩展会大大降低性能)。对于可选扩展,可以使用上述方法之一。
  2. 仅创建几个基准容器。例如,一为通用amd64,一为amd64-avx,一为amd64-avx2-aesni-tsx和类似。想法是只创建几个容器来覆盖所有大多数少数用户。

编辑
正如BeeOnRope在评论中指出的那样,Dockers 具有在Windows上运行的版本。它使用Hyper-V在Linux版本的docker上运行Linux VM
由于Hyper-V是本机VMM,因此除了额外的层外,同样的注意事项也适用。
同样,也有macOS版本。这次,它使用基于xhyve的管理程序框架