2012-02-12 102 views
7

我有一个程序严重缩小到多个线程,但理论上它应该线性缩放:它是一种计算,可以分成更小的块,不需要系统调用,库调用,锁定,等等。使用四个线程运行的速度只有使用单线程(在四核系统上)运行速度的两倍左右,而我期望的数字更接近四倍。多线程性能和性能测试

带pthreads,C++ 0x线程和OpenMP的实现的运行时间同意。

为了查明原因,我尝试了gprof(无用)和valgrind(我没有看到任何明显的东西)。如何有效衡量导致经济放缓的因素?关于其可能原因的任何通用想法?

- 更新 -

计算包括蒙特卡罗积分我注意到,不合理的时间量花在生成随机数。虽然我不知道为什么会发生这种情况,但我注意到随机数发生器不可重入。使用互斥锁时,运行时间会爆炸。在检查其他问题之前,我会重新实现这个部分。

我确实重新实现了确实提高性能的抽样类。其余的问题实际上是CPU缓存的争用(由Evgeny怀疑,它被cachegrind透露)。

回答

4

您可以使用oprofile。或者是一个穷人的伪分析器:在gdb下运行该程序,停止它并查看它停止的位置。 “valgrind --tool = cachegrind”会告诉你CPU缓存的使用效率。

蒙特卡洛积分似乎是非常耗费内存的算法。尝试估计,如何使用内存带宽。这可能是您程序性能的限制因素。另外,如果你的系统只有2核超线程,那么与4线程相比,它应该不会更快,与2线程相比。