程序(提供的源代码)在 Ivy Bridge Xeon 上花费 运行 的时间是旧移动 Sandy Bridge 的两倍

Program (source provided) takes twice as long to run on Ivy Bridge Xeon than older mobile Sandy Bridge

我有两台计算机正在尝试 运行 同一个程序。尽管该程序在系统 B 上应该 运行 至少快一点,但实际上它在系统 A 上快两倍(或更好)。这对我来说毫无意义,如果有人能帮我计算,我真的很乐意找出世界上是什么导致了这个奇怪的性能问题。我添加了第三个系统作为健全性检查,现在我更加困惑了。

系统A:

系统B:

系统 C:

您可以在以下位置找到该程序的源代码:http://www.cs.binghamton.edu/~millerti/test.tgz

我在两个系统上使用的编译器命令行如下:

这有两件相当奇怪的事情。一是标量版本比矢量版本稍快。但真正巨大的问题是这个程序在服务器(系统B)上运行所花的时间是笔记本(系统A)上的两倍多。

在系统 A 上:

$ time ./a.out
real    0m22.908s
user    0m22.853s
sys 0m0.038s

在系统 B 上:

$ time ./a.out
real    0m55.354s
user    0m55.310s
sys     0m0.000s

在系统 C 上:

$ time ./a.out
real    0m42.421s
user    0m42.400s
sys     0m0.000s

其他事实:

您需要检查汇编列表。一个编译器可能会生成 SISD 指令,而另一个 SIMD - 例如 mulss xmm0, xmm7 而不是 mulps xmm0, xmm7,它可以快四倍(在相同的 CPU GHz 下)。然后有AVX指令可以试试。

您描述的问题通常是由较旧的编译器生成的速度最慢引起的,或者就我而言,使用最新的免费 Microsoft 编译器与 Linux 的最新 GCC 相比,后者生成了卓越的实现。

原因完全是tanh。由于分析开销,分析没有揭示这一点。我不知道为什么我昨晚没有想到这个,但是今天早上,我注释掉了 tanh,这就是我得到的:

系统A:

$ time ./a.out
real    0m4.443s
user    0m4.433s
sys 0m0.008s

系统 B:

$ time ./a.out
real    0m3.373s
user    0m3.368s
sys     0m0.003s

系统 C:

$ time ./a.out
real    0m4.054s
user    0m4.050s
sys     0m0.000s

这些数字都有道理。所以结论是 tanh 的 Linux 实现真的很糟糕。我必须自己实现或从 BSD libc 获取 tanh 源代码。