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:
- 您加载了正确的动态库(但对库的每个函数调用都使用指针)。
- 您构建了同一个 statically-linked 二进制文件的多个版本,运行 正确的那个。
主要问题是有时 ISA 扩展是正交的,这使得组合(即 libraries/binaries 的数量)呈指数增长。
因此,考虑到您正在处理 Docker 的用户群,您可以稍微简化该方法(如果组合有问题):
- 要么需要一些 ISA 扩展(如果没有这样会大大降低性能)。对于可选扩展,您可以使用上述方法之一。
- 只创建几个基线容器。例如。一种用于通用
amd64
,一种用于 amd64-avx
,一种用于 amd64-avx2-aesni-tsx
等。这个想法是只创建几个容器来覆盖 all、most 和 few 的用户。
编辑
作为 , Dockers has a version running on Windows. .
由于 Hyper-V 是本机 VMM,除了一个额外的层外,同样的考虑也适用。
同样,也有 macOS 版本。 This time it uses an hypervisor framework based on xhyve.
我的应用程序受益于 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,它与您的问题完全正交。
作为
- 您加载了正确的动态库(但对库的每个函数调用都使用指针)。
- 您构建了同一个 statically-linked 二进制文件的多个版本,运行 正确的那个。
主要问题是有时 ISA 扩展是正交的,这使得组合(即 libraries/binaries 的数量)呈指数增长。 因此,考虑到您正在处理 Docker 的用户群,您可以稍微简化该方法(如果组合有问题):
- 要么需要一些 ISA 扩展(如果没有这样会大大降低性能)。对于可选扩展,您可以使用上述方法之一。
- 只创建几个基线容器。例如。一种用于通用
amd64
,一种用于amd64-avx
,一种用于amd64-avx2-aesni-tsx
等。这个想法是只创建几个容器来覆盖 all、most 和 few 的用户。
编辑
作为
由于 Hyper-V 是本机 VMM,除了一个额外的层外,同样的考虑也适用。
同样,也有 macOS 版本。 This time it uses an hypervisor framework based on xhyve.