英特尔编译器与GCC

时间:2011-11-30 14:16:04

标签: c++ optimization gcc compiler-construction intel

当我使用英特尔编译器编译应用程序时,它比我用GCC编译它时要慢。英特尔编译器的输出速度慢了2倍。该应用程序包含几个嵌套循环。 GCC和我缺少的英特尔编译器之间是否存在任何差异?我是否需要打开其他一些标志来提高英特尔编译器的性能?我预计英特尔编译器的速度至少与GCC一样快。

编译器版本:

 Intel version  12.0.0 20101006 
 GCC   version  4.4.4  20100630

两个编译器的编译器标志相同:

-O3 -openmp -parallel -mSSE4.2 -Wall -pthread

2 个答案:

答案 0 :(得分:3)

我没有使用intel编译器的经验,所以我无法回答你是否遗漏了一些标志。

然而,我记得最近的gcc版本通常和icc一样优化代码(有时更好,有时更糟糕(虽然大多数来源似乎表明通常更好)),所以你可能遇到过icc的情况特别糟糕。可以找到每个编译器可以执行的优化的示例herehere。即使gcc通常不是更好,你也可以简单地得到一个gcc认可优化的情况而icc没有。编译器可以非常挑剔他们优化的内容和不优化内容,尤其是关于自动向量化等内容。

如果你的循环足够小,那么在gcc和icc之间比较生成的汇编代码可能是值得的。此外,如果你展示一些代码或至少告诉我们你在循环中做了什么,我们可能会给你更好的猜测导致这种行为的原因。例如在某些情况下。如果它是一个相对较小的循环,很可能是icc缺少一个(或一些,但可能不是很多)优化的情况,这些优化要么具有固有的良好潜力(预取,自动向量化,展开,循环不变运动......),要么启用其他优化优化(主要是内联)。

请注意,当我将gcc与icc进行比较时,我只讨论优化潜力。最后icc通常可以生成比gcc更快的代码,但不是因为它做了更多的优化,而是因为它有更快的标准库实现,并且因为它更优化在哪里优化(在高优化级别gcc得到一点点过度(或至少习惯)关于(理论上)运行时改进的交易代码大小。这实际上会损害性能,例如,当经过精心展开和向量化的循环只执行3次迭代时。

答案 1 :(得分:2)

我通常使用-inline-level=1 -inline-forceinline来确保我明确声明inline的函数实际上已经内联。除此之外,我预计ICC的性能至少与gcc一样好。您需要对代码进行概要分析,以了解性能差异的来源。如果这是Linux,那么我建议使用Zoom,您可以获得30天的免费评估。