我有一个程序可以很好地扩展到多个线程,虽然 - 从理论上讲 - 它应该线性扩展:它是一个分成较小的块并且不需要系统调用,库调用,锁定等的计算。运行四个线程只比使用单个线程(在四核系统上)运行速度快两倍,而我希望它的速度接近四倍。
使用pthreads,C ++ 0x线程和OpenMP的实现的运行时间一致。
为了找出原因,我尝试了gprof(无用)和valgrind(我没有看到任何明显的东西)。我怎样才能有效地对导致经济放缓的因素进行基准测试?关于其可能原因的任何一般性想法?
- 更新 -
计算涉及蒙特卡罗积分,我注意到花费了不合理的时间来生成随机数。虽然我不知道为什么四线程会发生这种情况,但我注意到随机数生成器不是可重入的。使用互斥锁时,运行时间会爆炸。在检查其他问题之前,我会重新实现这一部分。
我重新实现了抽样类,这确实大大提高了性能。事实上,剩下的问题是CPU缓存的争用(正如evgeny所怀疑的那样,它被cachegrind所揭示。)
答案 0 :(得分:4)
您可以使用oprofile。或者一个穷人的伪剖析器:在gdb下运行程序,停止它并查看它停止的位置。 “valgrind --tool = cachegrind”将向您展示CPU缓存的使用效率。
蒙特卡罗集成似乎是一种非常耗费内存的算法。尝试估算内存带宽的使用方式。这可能是您的计划表现的限制因素。此外,如果你的系统只有超级线程的2核,那么与2个线程相比,使用4个线程的速度不应该快得多。