摘要:我想利用编译器优化和处理器指令集,但是仍然具有可移植的应用程序(在不同的处理器上运行)。通常,我确实可以编译5次,然后让用户选择合适的运行方式。
我的问题是:如何使它自动化,以便在运行时检测到处理器并执行正确的可执行文件,而无需用户选择它?
我的应用程序有很多低级数学计算。这些计算通常会运行很长时间。
我想利用尽可能多的优化,最好是(并非总是支持)指令集。另一方面,我希望我的应用程序具有可移植性并且易于使用(因此,我不想编译5个不同的版本并让用户选择)。
是否可以编译我的代码的5个不同版本并在执行时动态运行最优化的版本?对于5个不同的版本,我的意思是针对处理器使用不同的指令集和不同的优化。
我不在乎应用程序的大小。
目前,我在Linux上使用gcc(我的代码在C++中),但是我也对Intel编译器和MinGW编译器感兴趣,以便将其编译到Windows。
该可执行文件不必能够在不同的OS上运行,但是理想情况下,自动选择32位和64位也是有可能的。
编辑:请给出明确的指示,最好是使用小的代码示例或说明链接。从我的角度来看,我需要一个 super 通用的解决方案,该解决方案适用于以后的任何随机C++项目。
编辑我将赏金分配给ShuggyCoUk,他有很多指针需要注意。我希望将其拆分为多个答案,但这是不可能的。我尚未实现此功能,因此问题仍然是“开放的”!请,即使不再有悬赏,仍请添加和/或改进答案。
谢谢大家!
最佳答案
如果希望此方法在Windows上可以正常使用,并在具有64位功能的附加1.寻址空间和2.寄存器中充分利用(可能会对您有更多用处),则必须至少为64位提供一个单独的过程。
您可以通过使用带有相关PE64 header 的单独可执行文件来实现。只需使用CreateProcess即可将其作为相关位启动(除非启动的可执行文件位于某个重定向的位置,所以无需担心WoW64 folder redirection
鉴于Windows的这种限制,对于所有不同的选项,简单地“链接”到相关可执行文件可能是最简单的选项,并且使单个测试变得更加简单。
这也意味着您可以根据目标操作系统自由地将“主要”可执行文件完全分开(因为从本质上来说,检测cpu/OS功能是特定于操作系统的),然后将其余大部分代码共享对象/dll。
另外,如果您当前不觉得使用不同的功能有任何用处,则可以为两个不同的体系结构“共享”相同的文件。
我建议主可执行文件能够被迫做出特定选择,以便您可以在功能更强大的计算机上查看“较小”版本的情况(如果尝试其他操作,会出现什么错误)。
给定此模型的其他可能性是:
对于进行的检查,您有几种选择,在Intel上最有用的一种是cpuid指令。
或者,使用有关所需功能的可用文档重新实现/更新现有的功能。
大量单独的文档确定了如何检测事物:
您将在CPU-Z库中支付的大部分费用是由某人为您完成所有这些工作(以及涉及的棘手的小问题)。
关于c++ - 针对不同的目标架构进行编译和优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1296185/