我有一个程序很难扩展到多线程,尽管理论上它应该线性扩展:它是一个拆分成较小块的计算,不需要系统调用、库调用、锁定等。运行四个线程只比运行一个线程快两倍(在四核系统上),而我期望的速度接近四倍。
pthreads、C++0x线程和OpenMP实现的运行时间是一致的。
为了找出原因,我尝试了gprof (无用)和valgrind (我没有看到任何明显的东西)。我如何才能有效地对导致速度减慢的原因进行基准测试?对于其可能的原因,有什么通用的想法吗?
-更新-
计算涉及蒙特卡罗积分,我注意到生成随机数花费了不合理的时间。虽然我还不知道为什么四个线程会发生这种情况,但我注意到随机数生成器不是可重入的。当使用互斥锁时,运行时间会爆炸。在检查其他问题之前,我将重新实现这一部分。
我确实重新实现了采样类,这确实大大提高了性能。剩下的问题实际上是CPU缓存的争用(正如Evgeny怀疑的那样,cachegrind揭示了这个问题)。
发布于 2012-02-13 03:25:39
您可以使用oprofile。或者是穷人的伪分析器:在gdb下运行程序,停止它,并查看它在哪里停止。"valgrind --tool=cachegrind“将显示CPU缓存的使用效率。
蒙特卡罗积分似乎是内存密集型算法。试着估计一下,内存带宽是如何使用的。这可能是程序性能的限制因素。另外,如果你的系统只有2核的超线程,它在4个线程的情况下不会比2个线程快很多。
https://stackoverflow.com/questions/9251059
复制相似问题