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

时间:2015-04-11 03:45:44

标签: linux macos performance x86-64

我有两台计算机,我正在尝试运行相同的程序。虽然程序应该在系统B上运行至少快一点,但它实际上是系统A的两倍(或更好)。这对我来说没有任何意义,如果有人能帮我弄清楚什么,我真的很喜欢世界正在造成这种奇怪的性能问题。我添加了第三个系统作为一个完整性检查,现在我更加困惑。

系统A:

  • 使用Sandy Bridge CPU的2011 MacBook Pro
  • Intel(R)Core(TM)i7-2820QM CPU @ 2.30GHz
  • 英特尔功率计报告在运行程序时以3.1GHz运行
  • 编译器是clang ++:Apple LLVM 6.0版(clang-600.0.57)(基于LLVM 3.5svn)

系统B:

  • 2插槽,12芯/插座Ivy Bridge Xeon服务器于2013年购买
  • Intel(R)Xeon(R)CPU E5-2697 v2 @ 2.70GHz
  • turbostat报告在运行程序时以3.5GHz运行一个核心
  • 编译器是clang ++:Ubuntu clang版本3.5-1ubuntu1(主干)(基于LLVM 3.5)

系统C:

  • 四核Haswell Core i5
  • Intel(R)Core(TM)i5-4430 CPU @ 3.00GHz
  • turbostat报告核心最大值为3.2GHz
  • 编译器是clang ++:clang版本3.5.1(标签/ RELEASE_351 / final)

您可以在以下网址找到该计划的源代码:http://www.cs.binghamton.edu/~millerti/test.tgz

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

  • 标量版本:clang++ -O3 -msse3 x.c 3_22_1b.c
  • 矢量版本:clang++ -O3 -msse3 x.c 3_22_1.c

这有两个相当奇怪的事情。一个是标量版本比矢量版本略快。但真正巨大的问题是,该程序在服务器(系统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

其他事实:

  • Sandy Bridge和Ivy Bridge具有相同数量的L1缓存(总共64KB)。实际上,Haswell也是如此。
  • 系统B拥有比任何其他任何一个更多的二级缓存
  • 可执行文件非常小,至少应该大部分适合L1I缓存
  • 数据量为176个浮点数,因此L1D缓存命中率应约为100%
  • IVB和SB微体系结构非常相似,差异主要是有利于IVB
  • 正在运行所有系统,否则将卸载。笔记本电脑(系统A)确实有最少的其他东西。服务器(系统B)和Haswell(系统C)完全卸载。没有其他用户或任何东西。
  • top显示程序在所有系统中获得100%的CPU。 iotop显示服务器上没有I / O在运行。
  • 与任何情况下的clang相比,使用g ++没有多大区别。
  • 作为参考,我添加了Haswell,它没有任何亮点。毫无疑问,这比Ivy Bridge快得多,但比Sandy Bridge慢。
  • 操作系统无法在这里产生任何影响,并且苹果公司在他们的LLVM编译器中没有办法表现出他们没有共享的那种可以使程序更快的程序。
  • 我确实尝试过基准测试。事实证明,它在MacOS X上的速度是Linux的两倍。在系统A(Mac)上,1亿个tanh的调用需要1.484秒,而在系统C(Haswell)上需要3.380秒,在系统B(IVB服务器)上需要3.392秒。但是,我已经完成了分析,并且tanh仅占总运行时间的35%左右,因此无法解释整个性能差异。
  • -ffast-math没有帮助。
  • 我正在Mac上的VM中安装Linux。我将在Mac上的Linux上运行相同的代码,看看glibc的数学运算速度有多快,CPU的数量是多少。 (由于这是计算密集型的,因此虚拟化无关紧要。)我稍后会添加结果。

2 个答案:

答案 0 :(得分:1)

原因完全是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源。

答案 1 :(得分:0)

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

您描述的问题通常是由较旧的编译器产生的最慢,或者在我的情况下,使用最新的免费Microsoft编译器与最新的GCC for Linux,后者产生了卓越的实现。