我有两台计算机,我正在尝试运行相同的程序。虽然程序应该在系统B上运行至少快一点,但它实际上是系统A的两倍(或更好)。这对我来说没有任何意义,如果有人能帮我弄清楚什么,我真的很喜欢世界正在造成这种奇怪的性能问题。我添加了第三个系统作为一个完整性检查,现在我更加困惑。
系统A:
系统B:
系统C:
您可以在以下网址找到该计划的源代码: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
其他事实:
top
显示程序在所有系统中获得100%的CPU。 iotop
显示服务器上没有I / O在运行。-ffast-math
没有帮助。答案 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,后者产生了卓越的实现。