针对特定的机器/处理器架构进行优化

时间:2017-04-11 13:18:56

标签: c++ optimization

在这个高度投票的answer中关于C ++和Java之间性能差异的问题我了解到JIT编译器有时能够更好地进行优化,因为它可以确定机器的确切细节(处理器,缓存大小)等等):

  

通常,C#和Java可以像JIT一样快速或快速   编译器 - 第一次编译IL的编译器   执行 - 可以优化C ++编译的程序不能   因为它可以查询机器。它可以确定机器是否   英特尔或AMD; Pentium 4,Core Solo或Core Duo;或者如果支持SSE4,   等

     

C ++程序必须事先通过混合编译   优化使它在所有机器上运行得相当好,但是   没有尽可能多地优化单一配置(即   处理器,指令集,其他硬件)。

问题:有没有办法告诉编译器专门针对我当前的机器进行优化?有没有能够做到这一点的编译器?

2 个答案:

答案 0 :(得分:9)

对于GCC,您可以使用标记-march=native。请注意,生成的代码可能无法在其他CPU上运行,因为

  

GCC使用此名称来确定它可以发出的指令类型   生成汇编代码时。

因此可以生成CPU特定的程序集。

如果您希望代码在其他CPU类型上运行,但是为了在CPU上获得更好的性能进行调整,那么您应该使用-mtune=native

  

指定要调整其性能的处理器名称。该   代码将被调整为好像目标处理器属于该类型   在此选项中指定,但仍使用与之兼容的指令   目标处理器由-mcpu =选项指定。

答案 1 :(得分:4)

当然可以指示编译器针对特定体系结构进行优化。如果您查看可以传入的大量architecture flags,那么gcc就是如此。在Visual Studio上也是如此,因为它具有-MACHINE选项和{{3选项。

但是,与Java不同,这可能意味着生成的代码仅(安全)在目标硬件上运行。在一般编译的C ++代码的情况下,Java可以同样快或更快的断言。鉴于目标体系结构,为特定体系结构编译的C ++代码可能比同等Java代码快或快。当然,以这种方式支持多种架构还有很多工作要做。