在多线程里要做到的真正的平行计算简直不可能

assassin5616 assassin5616 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近折腾了很久一个关于平行计算的程序,我测试的机器算比较牛的了,16个核,内存16个G。当然,我程序只能用4G。

我要做的不过是启动四个或者8个线程同时运行一个相同的算法。线程间就我写的部分肯定没有任何资源需要共享,也就是说线程间没有任何互斥。 结果跑起来的结果让我大跌眼镜,启动4个线程的时候,同样的算法,时间比只有一个线程比起来多了差不多50%,8个线程的时候,直接翻倍还要多。

这个时候我唯一能想到的就是内存这个东西了各个线程是需要竞争的了,于是我替换了intel 的tbb::scalable_alloc(有点像广告),结果好了一点点,也就是好了10%的样子。

我的算法里面new 和 delete这些有一些,但是在现代程序里面绝对算是正常的。

我大刀阔斧地简化了我的算法,发现只有当简化到一定程度时,使用tbb::scalable_alloc的优势才体现出来,基本可以实现跑8个线程和跑1个线程时时间一样。但是算法一旦复杂,包括程序的结构(链接多个动态库什么的),tbb基本上就没什么优势了。

如果我不用多线程,直接用多进程,比如启动8个进程,执行时间和只有一个进程运行时一模一样(这个倒是不奇怪,16个核在哪呢,可不是来打酱油的)。

我现在真的很好奇到底是什么东西影响了多线程的运行效率,互斥我是可以保证没有的。分配内存的问题按道理tbb::scalable_alloc可以解决,至少程序够简单的时候是解决了的。难道最终还是内存分配问题影响了线程的效率? 还有没有其他的东西会影响呢?

另外就是,如果执行算法的时间如果长,比如需要十秒左右,这个时候跑8个线程和跑1个线程的执行时间就完全一样了。这也是为什么我敢保证线程之间肯定没有互斥的原因,如果有的话, 不管执行多长时间,8个线程的时间都不会和1个线程一样。

哪位对多核运算厉害的牛人能解答一下我遇到的这些神秘现象呢?三跪九叩首了




...全文

相关推荐

Fortran+语言MPI+平行计算程式设计

Fortran+语言MPI+平行计算程式设计 Fortran+语言MPI+平行计算程式设计

naruto321987

多尺度仿真软件:CHARMM_(8).CHARMM的平行计算与性能优化

通过上述各种优化策略,可以在CHARMM中实现高效的并行计算和性能优化。这些策略包括优化计算任务分配、数据通信、算法选择、输入文件、内存管理、负载均衡、编译选项、数据存储、计算环境、计算参数、计算模型、计算精度与速度的平衡、计算资源的动态调整以及数据预处理。合理选择和应用这些策略,可以显著提高大规模分子动力学仿真的计算效率和资源利用率。

kkchenjj

基于多源数据的电网一次调频能力平行计算研究.docx

基于多源数据的电网一次调频能力平行计算研究.docx

罗伯特之技术屋

探究iOS多线程究竟不安全在哪里?

iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话题。那么通过下面这篇文章小编和大家一起来探究了iOS多线程究竟不安全在哪里?需要的朋友可以参考学习。

weixin_38722607

【arduino多线程编程】arduino竟然还能多线程编程?确定不进来夸一下嘛……

目录 1.SCoop库下载 2.多线程简介 3.多线程实现LED闪烁+计时 4.总结 1.SCoop库下载   【点击这里】提取码:u7r5。下载SCoop库,解压后放在arduino安装目录下的libraries文件夹下即可。     2.多线程简介   看了上一篇《arduino面向对象编程》是不是感觉arduino已经到极限了?NO,NO,NO,arduino远远不止如此,不信你往下看:   理解了单线程就很容易理解多线程了吧,举个例子,假设有语文作文和数学试卷两个任务等你完成,那你肯定只能先完成一个,再完成另一个,这样虽不准确但很明确的理解单线程;往往单线程是很不实用的,太占用时间

weixin_38739950
评论 67
收藏 已收藏
分享
返回顶部