我的应用程序受益于gcc在-march native
下运行时可以访问的高级CPU功能。 Docker可以消除OS中的差异,但是如何处理不同的CPU?要构建可以在任何CPU上运行的应用程序,我必须为amd64构建,但会损失很多性能。当需要针对每种CPU架构分别编译应用程序时,是否有一种分发Docker映像的好方法?
答案 0 :(得分:6)
Docker根本不处理CPU。它只是kernel namespacing,FS系统分层(例如UnionFS)和process quoting的组合。
当您在Docker容器上运行某些内容时,它只是在您的操作系统,没有虚拟化上运行的可执行文件,它只能访问一组选定的内核对象(例如设备)并且由于覆盖不同的FS(包括docker容器中的FS)而被限制为FS层次结构。
因此,Docker根本不处理CPU,它与您的问题完全正交。
与Peter commented一样,CPU调度基本上有两种方法:
主要问题是,有时ISA扩展是正交的,这会使组合(即库/二进制文件的数量)呈指数增长。 因此,考虑到您正在与Docker的用户群打交道,可以稍微简化此方法(如果组合存在问题):
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。