多线程性能和性能分析

我有一个程序可以很好地扩展到多个线程,但理论上它应该线性扩展:它是一个分割成更小的块并且不需要系统调用,库调用,锁定等的计算。 (使用四核系统)运行速度是单线程运行速度的两倍,而我期望的数字更接近四倍。

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

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

- 更新 -

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

我确实重新实施了大幅提高性能的抽样类。 其余的问题实际上是CPU缓存的争用(Evgeny怀疑它是由cachegrind公开的)。


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

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

链接地址: http://www.djcxy.com/p/57559.html

上一篇: threaded performance and profiling

下一篇: rake db:migrate not working on my postgres db