Docker 和 -march 本机

Docker and -march native

我的应用程序受益于 gcc 在 运行 和 -march native 时可以访问的高级 CPU 功能。 Docker 可以平滑 OS 中的差异,但它如何处理不同的 CPU?要构建一个可以在任何 CPU 上 运行 的应用程序,我将不得不为 amd64 构建,从而损失很多性能。当需要为每个 CPU 架构单独编译应用程序时,有没有一种分发 Docker 图像的好方法?

Docker 根本无法处理 CPU。它只是 kernel namespacing, FS system layering (e.g. UnionFS) and process quoting.
的组合 当你 运行 东西在 docker 容器上时,它只是一个可执行文件 运行ning 在 你的 OS, 没有虚拟化,它只能访问一组选定的内核对象(例如设备),并且它被 chroot 到一个 FS 层次结构,这是由于覆盖不同的 FS(包括 docker 容器中的一个)。

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

作为基本上有两种方式CPU-dispatch:

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

主要问题是有时 ISA 扩展是正交的,这使得组合(即 libraries/binaries 的数量)呈指数增长。 因此,考虑到您正在处理 Docker 的用户群,您可以稍微简化该方法(如果组合有问题):

  1. 要么需要一些 ISA 扩展(如果没有这样会大大降低性能)。对于可选扩展,您可以使用上述方法之一。
  2. 只创建几个基线容器。例如。一种用于通用 amd64,一种用于 amd64-avx,一种用于 amd64-avx2-aesni-tsx 等。这个想法是只创建几个容器来覆盖 allmostfew 的用户。

编辑
作为 , Dockers has a version running on Windows. .
由于 Hyper-V 是本机 VMM,除了一个额外的层外,同样的考虑也适用。
同样,也有 macOS 版本。 This time it uses an hypervisor framework based on xhyve.