我已经使用特定标志(-Os,-O2,-march = native及其组合)编译了我的代码,以便产生更快的执行时间。
但我的问题是我不会一直在同一台机器上运行(因为在我的实验室里有几台不同的机器)。有时我在MacOS或Linux内运行(在两种情况下都有不同的操作系统版本)。
我想知道是否有办法确定运行哪个二进制文件取决于二进制文件运行的环境(我的意思是缓存大小,cpu核心以及有关特定计算机的其他属性)?换句话说,如何根据所使用的特定机器选择(当程序加载时)更快的二进制文件(以前使用不同的目标二进制文件大小和指令集扩展编译)?
提前致谢。
答案 0 :(得分:4)
您所谈论的内容称为胖二进制(不是FAT,首字母缩略词)。来自维基百科 1 :
胖二进制文件(或多体系结构二进制文件)是一种计算机可执行程序,它已经扩展(或“加肥”),具有多个指令集的本机代码,因此可以在多种处理器类型上运行。这导致文件大于普通的单体系结构二进制文件,因此名称为。
快速浏览一下,似乎没有太多的支持(有关更多信息,请参阅Programmer StackExchange中的this question)。 Apple在从PowerPC过渡到英特尔时实施了这一过程,但从那以后它似乎没有被探索过多。
从技术上讲,胖二进制文件指的是可以在多个体系结构上运行的单个二进制文件......但我想这个前提将适用于在多个操作系统上运行的单个二进制文件。它回到了Bizkit在他/她/ zir答案中提出的要点 - 通常,你为你提前所处的环境编译源代码。
答案 1 :(得分:1)
您可以预先构建一堆可执行文件,并根据环境变量或uname
之类的内容选择一个。更好的解决方法是选择能够执行JIT,安装时优化和/或运行时优化的工具链,例如llvm。
答案 2 :(得分:0)
您是否有理由在每台计算机上重新编译源代码?编译器已经完全针对这种东西编写和优化。只需在该机器架构上重新编译源代码,您就可以在该机器上运行良好的二进制文件。
答案 3 :(得分:0)
如果您希望针对所运行计算机的缓存大小调整代码,请查看Automatically Tuned Linear Algebra Software (ATLAS)执行此操作的方式。编译时,它会运行一些测试来查找用于缓存阻塞其循环的大小,并将其放在头文件中。