C++ 我应该为英特尔C++;编译器为AMD发出次优代码?

C++ 我应该为英特尔C++;编译器为AMD发出次优代码?,c++,optimization,compiler-construction,intel,amd-processor,C++,Optimization,Compiler Construction,Intel,Amd Processor,我们一直是一家英特尔商店。所有的开发人员都使用英特尔机器,推荐给最终用户的平台是英特尔,如果最终用户想在AMD上运行,这是他们的目标。也许测试部门在某处有一台AMD机器来检查我们没有运送任何完全损坏的东西,但仅此而已 直到几年前,我们才使用MSVC编译器,而且由于它在SSE级别之外没有提供太多处理器调优选项,因此没有人太担心代码是否会偏向某个x86供应商。然而,最近我们经常使用英特尔编译器。我们的产品(在我们的英特尔硬件上)确实从中获得了一些显著的性能优势,而且它的矢量化功能意味着不需要使用as

我们一直是一家英特尔商店。所有的开发人员都使用英特尔机器,推荐给最终用户的平台是英特尔,如果最终用户想在AMD上运行,这是他们的目标。也许测试部门在某处有一台AMD机器来检查我们没有运送任何完全损坏的东西,但仅此而已

直到几年前,我们才使用MSVC编译器,而且由于它在SSE级别之外没有提供太多处理器调优选项,因此没有人太担心代码是否会偏向某个x86供应商。然而,最近我们经常使用英特尔编译器。我们的产品(在我们的英特尔硬件上)确实从中获得了一些显著的性能优势,而且它的矢量化功能意味着不需要使用asm/Intrinsic。然而,人们开始有点担心英特尔编译器是否真的在AMD硬件上做得不好。当然,如果您进入英特尔CRT或IPP库,您会看到许多cpuid查询,显然是为了设置跳转表以优化函数。不过,英特尔似乎不太可能为AMDs芯片做任何好事

在这方面有经验的人能评论一下这在实践中是否是一件大事吗?(我们自己还没有对AMD进行任何性能测试)

更新2010-01-04:支持AMD的需求从未变得足够具体,我自己也无法进行任何测试。关于这个问题有一些有趣的读物,尽管如此


更新2010-08-09:英特尔FTC和解案似乎对这个问题有一些看法-请参阅。

购买AMD机顶盒并在其上运行。这似乎是唯一负责任的做法,而不是在互联网上信任陌生人;)

除此之外,我相信AMD起诉英特尔的部分理由是,英特尔的编译器专门生成在AMD处理器上运行效率低下的代码。我不知道这是否属实,但AMD似乎相信这一点

但是,即使他们不是故意这样做,毫无疑问,英特尔的编译器专门针对英特尔处理器进行优化,而不是其他


说到这里,我怀疑这会有很大的不同。AMD CPU仍将受益于编译器的所有自动矢量化和其他巧妙功能。

我肯定要说的是,如果性能对您的应用程序至关重要,那么您最好在所有硬件/编译器组合上进行一些测试。没有任何保证。作为局外人,我们只能给你我们的猜测/偏见。您的软件可能具有与我们所看到的不同的独特特性

我的经验:

我曾在英特尔工作,并开发了一个内部(C++)应用程序,其中性能至关重要。我们试图使用英特尔的C++编译器,并且在执行GCC的情况下,它“强>总是/强”。即使在进行概要运行之后,使用已配置的信息(ICC被认为是用来优化)重新编译并在完全相同的数据集上重新运行(这是在2005-2007年,情况可能会有所不同)。因此,根据我的经验,您可能希望尝试gcc(除了icc和MSVC之外),这样您可能会获得更好的性能,并回避这个问题。切换编译器应该不会太难(如果构建过程合理的话)

现在我在另一家公司工作,IT人员进行广泛的硬件测试,有一段时间Intel和AMD的硬件相对来说是可比的,但最新一代Intel硬件的性能明显优于AMD。因此,我相信他们购买了大量英特尔CPU,并向运行我们软件的客户推荐同样的产品


但是,回到英特尔编译器是否专门针对AMD硬件运行缓慢的问题。我怀疑英特尔会为此烦恼。可能是某些使用英特尔CPU体系结构或芯片组内部知识的优化在AMD硬件上运行较慢,但我怀疑它们是否专门针对AMD硬件。

如果您点击我的常规按钮,我感到抱歉

这是关于低级优化的主题,因此它只对1)程序计数器花费大量时间的代码和2)编译器实际看到的代码有影响。例如,如果电脑将大部分时间花在你没有编译的库例程上,那就没什么大不了的了

无论是否满足条件1和2,以下是我的优化经验:

进行了多次采样和固定迭代。在每一种情况下,都会发现一个问题,而且通常与程序计数器的位置无关。相反,在调用堆栈的中间层存在一些函数调用,由于性能至关重要,这些调用可以被替换

请记住,如果堆栈上有一条函数调用指令占用了执行时间的很大一部分,无论是在几次长调用中,还是在许多次短调用中,该调用都会占用这一部分时间,因此删除它或不经常执行它可以节省大量时间。而且,这种节省远远超过了任何低级优化

这个程序现在可以比最初快很多倍。 我从来没有见过任何规模好的程序,无论编写得多么仔细,都不能从这个过程中受益。 如果该过程尚未完成,则不应假设低级优化是加速程序的唯一方法


在这个过程完成到无法再进行下去的程度之后,如果样本显示编译器看到的代码中有PC,那么低级优化可以起到作用。

我们看到的是,无论英特尔编译器在什么地方必须对可用的指令集进行运行时选择,我