为什么gcc -o0比icc -o0快?

时间:2011-02-25 00:53:48

标签: c gcc icc

对于我要做的简短报告,我们的类使用gcc -O0和icc -O0在集群上运行代码。我们发现gcc比没有任何优化的icc快2.5倍?为什么是这样? gcc -O0实际上是做了一些小的优化,还是只是为了这个系统更好地工作?

代码是找到here的天真字符串搜索算法的实现,用c编写。

谢谢

2 个答案:

答案 0 :(得分:6)

-O0的表现并不重要或任何指示。它明确地说“我不关心性能”,编译器会引导你;它只做最简单的事情。通过随机运气,对于GCC而言,对于特定硬件配置上的一个高度特定的微基准测试而言,最简单的是ICC。如果你运行了100个其他微基准测试,你可能会发现一些ICC更快的地方。即使你没有,这仍然没有多大意义。如果您要比较编译器的性能,请启用优化,因为如果您关心性能,那就是您所做的。

如果您想了解为什么一个更快,请分析执行情况。执行时间在哪里?哪里有摊位?为什么会出现这些摊位?

答案 1 :(得分:3)

需要考虑的一些事项:

  • 默认情况下每个编译器使用的指令集。例如,如果你的GCC构建默认生成i686代码,而ICC将自己限制为i586操作码,你可能会看到显着的性能差异。

  • 群集中的实际CPU。如果你使用的是AMD处理器,而不是Intel CPU,那么ICC就处于劣势,因为它当然是专门针对英特尔处理器的。

  • 您提到过使用群集。这个速度差异是否也存在于单个处理器上?如果您使用了编译器提供的任何并行化工具,那么可能存在显着差异。

  • 简单地说,当禁用优化时,编译器会为每个代码构造使用预先制作的“模板”。由于这些模板旨在随后进行优化,因此它们的构建方式使得优化过程能够生成更好的代码。使用-O0它们可能更慢或更快的事实并不意味着什么 - 例如,更明确的初始代码可能更容易优化但执行起来要慢得多。

也就是说,找出正在发生的事情的唯一方法是分析代码的执行情况,并在必要时查看代码中主要区别所在的那些部分的组合。