多线程性能和评测



我有一个程序可以很好地扩展到多个线程,尽管理论上它应该线性扩展:这是一个可以拆分成更小块的计算,不需要系统调用、库调用、锁定等。用四个线程运行只比用单线程(在四核系统上)运行快两倍,而我预计这个数字的速度会接近四倍。

pthreads、C++0x线程和OpenMP实现的运行时间一致。

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

--更新--

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

我确实重新实现了采样类,这确实大大提高了性能。事实上,剩下的问题是CPU缓存的争用(正如Evgeny所怀疑的那样,cachegrind揭示了这一点。)

您可以使用opfile。或者穷人的伪探查器:在gdb下运行程序,停止它并查看它停止的位置。"valgrind--tool=cachegrind"将向您展示CPU缓存的使用效率。

蒙特卡罗积分似乎是一种内存密集型算法。试着估计一下内存带宽是如何使用的。它可能是限制程序性能的因素。此外,如果您的系统只有2核超线程,那么与2个线程相比,4个线程的工作速度应该不会快得多。

最新更新