加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

多线程 – 多线程性能和分析

发布时间:2020-12-15 00:44:43 所属栏目:Java 来源:网络整理
导读:我有一个程序可以很好地扩展到多个线程,虽然 – 从理论上讲 – 它应该线性扩展:它是一个分成较小的块,不需要系统调用,库调用,锁定等的计算.运行四个线程只是关于比使用单个线程(在四核系统上)运行速度快两倍,而我希望数字的速度接近四倍. 使用pthreads,C 0x
我有一个程序可以很好地扩展到多个线程,虽然 – 从理论上讲 – 它应该线性扩展:它是一个分成较小的块,不需要系统调用,库调用,锁定等的计算.运行四个线程只是关于比使用单个线程(在四核系统上)运行速度快两倍,而我希望数字的速度接近四倍.

使用pthreads,C 0x线程和OpenMP的实现的运行时间一致.

为了找出原因,我尝试了gprof(无用)和valgrind(我没有看到任何明显的东西).我怎样才能有效地对导致经济放缓的因素进行基准测试?关于其可能原因的任何一般性想法?

– 更新 –

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

我重新实现了抽样类,这确实大大提高了性能.事实上,剩下的问题是CPU缓存的争用(它是由evgeny怀疑的cachegrind所揭示的.)

解决方法

您可以使用oprofile.或者是一个穷人的伪分析器:在gdb下运行程序,停止它并查看它停止的位置. “valgrind –tool = cachegrind”将向您展示CPU缓存的使用效率.

蒙特卡罗集成似乎是非常耗费内存的算法.尝试估算内存带宽的使用方式.这可能是您的计划表现的限制因素.此外,如果您的系统只有超级线程的2核,那么使用4个线程时,与2个线程相比,它的工作速度要快得多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读