免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: hy036630
打印 上一主题 下一主题

多线程OR多进程-访存密集型应用 [复制链接]

论坛徽章:
0
61 [报告]
发表于 2011-12-23 17:28 |只看该作者
本帖最后由 ks9960 于 2011-12-23 17:31 编辑

“我觉得大家都把关注点放到了流水线和lockfree上面了 其实这个模型如果不处理数据, 吞吐量是很大的,100W/s”

另外按楼主说的,感觉是处理单元中某些代码不是SMP安全的,导致后续处理单元必须spinloop来等待,随着处理单元的增加性能急速下降。把业务处理代码拆分一下,逐段放进去测试,什么时候性能大幅下降了,就是那段代码有问题了。

论坛徽章:
0
62 [报告]
发表于 2011-12-23 18:03 |只看该作者
对于一个单元的流数据X来说,只不过是从一个线程到另一个线程,并没有并行处理(这里的并行处理对于X来说是多个线程同时处理X数据),而是从逻辑上清晰地分工每个业务的职能,这个角度看,多线程和多进程在处理业务上并没有本质区别。既然出现了性能不同的问题,说明这就跟业务处理模式无关了,X的处理单元(线程或进程)做的事情应该也是一样,做事情的时间应该差别不到数量级的,那只有环形缓冲区和管道的区别了。如果线程能满负荷运行,我觉得必然有忙等的情况,那么系统切换这些忙等的时间应该比管道客观了吧。

论坛徽章:
0
63 [报告]
发表于 2011-12-23 18:04 |只看该作者
ks9960 发表于 2011-12-23 17:28
“我觉得大家都把关注点放到了流水线和lockfree上面了 其实这个模型如果不处理数据, 吞吐量是很大的,100W ...

是啊 我也是这么做的

业务代码随便拆一点 速度涨一点,业务代码已经贴到前面了,才那么几行。


{:2_175:}

论坛徽章:
0
64 [报告]
发表于 2011-12-25 21:30 |只看该作者
我看你代码中用了很多临时变量,这一点是否有问题?用性能剖析工具看看。

论坛徽章:
0
65 [报告]
发表于 2011-12-27 13:34 |只看该作者
哎~看完这个心哇凉哇凉的。。。

论坛徽章:
0
66 [报告]
发表于 2011-12-27 16:58 |只看该作者
yeye518 发表于 2011-12-27 13:34
哎~看完这个心哇凉哇凉的。。。

还在测试 如果找到问题一定发出来

论坛徽章:
0
67 [报告]
发表于 2011-12-28 11:46 |只看该作者
JohnBull 发表于 2011-12-21 15:09
不妨设置一个计数器,在“push时满”和"pop时空"的时候++下,统计下一分钟发生多少次,再决定下一步怎办
...


不知道楼主按版主的建议测试过没有。写了一个小程序测试了楼主的RingQueue,在一台空闲的4核服务器上,可以处理8 thread(超线程),push失败的情况还是会发生(未测试pop)。据此分析,内核的分时调度并不能保证按楼主的流水线顺序来执行线程,即使楼主设置了优先级,2.6内核调度程序也会动态的修改,在这种情况下,导致了某个业务处理单元在时间片内一直在push或者pop,没有进行业务处理。

猜测:采用管道后,缓冲区足够的大,减少或消除了push的失败,处理性能保持了正常水平。

论坛徽章:
0
68 [报告]
发表于 2011-12-29 11:04 |只看该作者
大家好 谢谢大家的意见和建议:
问题解决了  是处理过程中有一个函数影响了并行性,现在测试一个线程是3W 8个线程达到了4W左右
(这个能够解释,现在的SMP都是多核共享LLC)
这个模型还是不错的多多线程无锁模型,谢谢大家。
哎 终于解决困扰这么久的疑问 差点让我的世界观人生观崩塌{:3_183:}
具体是哪个个库函数还在测试

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
69 [报告]
发表于 2011-12-29 11:48 |只看该作者
hy036630 发表于 2011-12-29 11:04
大家好 谢谢大家的意见和建议:
问题解决了  是处理过程中有一个函数影响了并行性,现在测试一个线程是3W  ...


啥意思, 这个4w 也和你 10个进程 25w 相差的不是一点啊

论坛徽章:
0
70 [报告]
发表于 2011-12-29 11:50 |只看该作者
回复 9# hy036630


    想知道lz怎么解决问题的,顺便说下我对你的环形缓冲的看法吧:
#   bool Push(const T& AData) {
#         if (Push_Count - Pop_Count < Max_Count) {
#             List[Push_Index] = AData;
#             Push_Count++;
#             if (Push_Index == High_Index)
#                 Push_Index = 0;
#             else
#                 Push_Index++;
#             return true;
#         } else
#             return false;
#     }
#     T Pop() {
#         T result = NULL;
#         if (Push_Count != Pop_Count) {
#             result = List[Pop_Index];
#             Pop_Count++;
#             if (Pop_Index == High_Index)
#                 Pop_Index = 0;
#             else
#                 Pop_Index++;
#         }
#         return result;
#     }

假设你的主线程push,子线程pop。因为两个线程不会同时修改Push_Count或Pop_Count的值,所以才可以不用锁来同步的吧?如果是这样就有问题了我。

#             List[Push_Index] = AData;
#             Push_Count++;
怎么保证第一条指令会先于第二条指令执行的呢?编译器可能会优化执行顺序,或者某些cpu可能乱序执行。这个地方应该用写内存屏障吧(参考rcu)

另外,考虑性能方面你的if是不是应该用likely 或者 unlikey呢?

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP