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