首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程性能和性能分析

多线程性能和性能分析
EN

Stack Overflow用户
提问于 2012-02-13 01:42:33
回答 1查看 294关注 0票数 7

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

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

为了找出原因,我尝试了gprof (无用)和valgrind (我没有看到任何明显的东西)。我如何才能有效地对导致速度减慢的原因进行基准测试?对于其可能的原因,有什么通用的想法吗?

-更新-

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-13 03:25:39

您可以使用oprofile。或者是穷人的伪分析器:在gdb下运行程序,停止它,并查看它在哪里停止。"valgrind --tool=cachegrind“将显示CPU缓存的使用效率。

蒙特卡罗积分似乎是内存密集型算法。试着估计一下,内存带宽是如何使用的。这可能是程序性能的限制因素。另外,如果你的系统只有2核的超线程,它在4个线程的情况下不会比2个线程快很多。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9251059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档