根据环境选择C二进制

Choose a C binary according to the enviroment

我已使用特定标志(-Os、-O2、-march=native 及其组合)编译我的代码,以产生更快的执行时间。

但我的问题是我不会 运行 总是在同一台机器上(因为在我的实验室中有几台不同的机器)。有时我在 MacOS 或 Linux 中 运行(在这两种情况下都使用不同的 OS 版本)。

我想知道是否有一种方法可以根据二进制文件 运行 所在的环境来确定哪个二进制文件将 运行(我的意思是缓存大小,cpu 内核,以及有关特定机器的其他属性)?换句话说,如何根据使用的具体机器选择(当程序加载时)更快的二进制文件(之前编译时使用不同的目标二进制文件大小和指令集扩展)?

提前致谢。

您是否有理由不能在每台机器上重新编译您的源代码?编译器已经专门针对此类内容进行了编写和优化。只需在该机器架构上重新编译您的源代码,您将拥有一个在该机器上运行良好的二进制文件。

你说的是 fat binary(不是 FAT,首字母缩写词)。来自维基百科1:

A fat binary (or multiarchitecture binary) is a computer executable program which has been expanded (or "fattened") with code native to multiple instruction sets which can consequently be run on multiple processor types. This results in a file larger than a normal one-architecture binary file, thus the name.

乍一看,似乎没有太多支持(有关详细信息,请参阅 Programmer StackExchange 中的 this question)。 Apple 在从 PowerPC 过渡到 Intel 时简要地实现了这一点,但此后似乎并没有太多探索。

从技术上讲,胖二进制文件指的是可以 运行 在多个体系结构上的单个二进制文件...但我认为前提适用于在多个操作系统上 运行 的单个二进制文件。这又回到了 Bizkit 在 his/her/zir 回答中提出的观点——通常,您会提前为您所处的环境编译源代码。

你可以预先构建一堆可执行文件,然后根据环境变量或诸如uname之类的东西选择一个。解决该问题的更好方法是选择能够执行 JIT、安装时优化 and/or 运行时优化的工具链,例如 llvm。

如果您希望根据 运行 所在机器的缓存大小调整代码,请查看 Automatically Tuned Linear Algebra Software (ATLAS) 的实现方式。当您编译它时,它 运行 会进行一些测试以找出用于高速缓存阻塞其循环的大小,并将其放入头文件中。