摘要:我想利用编译器优化和处理器指令集,但是仍然具有可移植的应用程序(在不同的处理器上运行)。通常,我确实可以编译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。
另外,如果您当前不觉得使用不同的功能有任何用处,则可以为两个不同的体系结构“共享”相同的文件。

我建议主可执行文件能够被迫做出特定选择,以便您可以在功能更强大的计算机上查看“较小”版本的情况(如果尝试其他操作,会出现什么错误)。

给定此模型的其他可能性是:

  • 静态链接到标准运行时的不同版本(适用于具有/不具有线程安全性的版本),如果运行时没有任何SMP/SMT功能,则可以适当地使用它们。
  • 检测是否存在多个内核,以及它们是真实的还是超线程的(以及操作系统在这些情况下是否知道调度的有效方式)
  • 检查诸如系统计时器/高性能计时器之类的东西的性能,并使用针对此行为优化的代码,例如,如果您在需要一定时间才能到期的地方进行任何操作,那么就可以知道您的最佳粒度。
  • 如果要优化代码,请根据缓存大小/盒中的其他负载来选择代码。如果您使用展开循环,那么更积极的展开选项可能取决于具有一定数量级别1/2的缓存。
  • 根据体系结构有条件地进行编译以使用double/float。在Intel硬件上不太重要,但是如果您要针对某些ARM cpu,则某些具有实际的浮点硬件支持,而其他则需要仿真。最佳代码将发生重大变化,甚至达到您仅使用条件编译而不是使用优化编译器的程度(1)。
  • 利用协处理器硬件,例如具有CUDA功能的图形卡。
  • 检测虚拟化并更改行为(也许试图避免文件系统写操作)


  • 对于进行的检查,您有几种选择,在Intel上最有用的一种是cpuid指令。
  • Windows
  • 使用someone else's implementation,但您必须支付
  • 使用free open source one
  • Linux
  • 使用built in one
  • 您也可以看看开源软件做同样的事情
  • Pixman进行fair amount of this,并且是许可许可证。

  • 或者,使用有关所需功能的可用文档重新实现/更新现有的功能。

    大量单独的文档确定了如何检测事物:
  • Intel:
  • SSE 4.1/4.2
  • SSE3
  • MMX

  • 您将在CPU-Z库中支付的大部分费用是由某人为您完成所有这些工作(以及涉及的棘手的小问题)。

  • 对此要小心-很难在
  • 上击败像样的优化编译器

    关于c++ - 针对不同的目标架构进行编译和优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1296185/

    10-09 05:53
    查看更多