对于我必须做的简短报告,我们的班级使用 gcc -O0 和 icc -O0 在集群上运行代码。我们发现没有任何优化的 gcc 比 icc 快 2.5 倍?为什么是这样?gcc -O0 是否真的做了一些小的优化,或者它只是碰巧在这个系统上工作得更好?
该代码是在这里找到的朴素字符串搜索算法的实现,用 c 编写。
谢谢
-O0 处的表现并不有趣或没有任何意义。它明确表示“我不关心性能”,编译器会带你去处理它;它只是做最简单的事情。幸运的是,对于特定硬件配置上的一个高度特定的微基准测试,对于 GCC 最简单的方法比对 ICC 最简单的方法要快。如果您运行 100 个其他微基准测试,您可能会发现一些 ICC 也更快。即使你没有,那仍然没有多大意义。如果您要比较不同编译器的性能,请打开优化,因为如果您关心性能,您就会这样做。
如果您想了解为什么更快,请分析执行情况。执行时间花在哪里?哪里有摊位?为什么会出现这些停顿?
有几点需要考虑:
每个编译器默认使用的指令集。例如,如果您的 GCC 构建默认生成 i686 代码,而 ICC 将自身限制为 i586 操作码,您可能会看到显着的性能差异。
集群中的实际 CPU。如果您使用的是 AMD 处理器,而不是 Intel CPU,那么 ICC 就处于劣势,因为它当然是专门针对 Intel 处理器的。
您提到使用集群。这种速度差异是否也存在于单个处理器上?如果您使用编译器提供的任何并行化工具,则可能存在显着差异。
简单地说,当优化被禁用时,编译器为每个代码结构使用预制的“模板”。由于这些模板打算在之后进行优化,因此它们的构造方式使优化过程能够产生更好的代码。它们可能更慢或更快的-O0
事实并不意味着什么 - 例如,更明确的初始代码可能更容易优化但执行速度要慢得多。
也就是说,找出发生了什么的唯一方法是分析代码的执行情况,并在必要时查看主要差异所在的代码部分的汇编。