免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
51 [报告]
发表于 2011-12-23 14:25 |只看该作者
sonicling 发表于 2011-12-23 13:28
另外循环等待会影响进程的优先级,因为进程总是满满当当用完了自己的时间片,却并没做多少实际事情,而Linu ...

只需要设置成SCHED_FIFO, 然后搞上一个非常高的优先级, 然后每个核分配一个这样的线程基本就禁用了抢占了

论坛徽章:
0
52 [报告]
发表于 2011-12-23 14:33 |只看该作者
大概了解你的意思了。你是说,不同的线程统计不同的结果是把。你先前的描述:
有个公共的缓冲队列: qun(环形的)
thread 1 : 主线程。。。专门分发任务的。将数据分发到下面的 thread 2...n 自个环形队列。只传指针。
thread 2.....n...专门从自个的队列里面取数据做处理。然后统计结果。不晓得我这个描述是不是正确的。。。

论坛徽章:
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
53 [报告]
发表于 2011-12-23 14:43 |只看该作者
本帖最后由 zylthinking 于 2011-12-23 14:45 编辑
hy036630 发表于 2011-12-23 13:47
呵呵 RingQueue里放的是数据呢  不是处理单元
处理单元一直读RingQueue里的数据,然后push到下一级的RingQ ...


100W/s 是10个线程串起来, 每个线程都 push/pop 然后什么也不干 的吞吐???
如果是的话, 有可能就是分工不均的原因了, 比如第一个节点处理时间占总处理时间的 90%, 那剩下的节点基本上总是在等待第一个线程了, 那么表现出来的总体性能其实就是第一个线程的性能

论坛徽章:
0
54 [报告]
发表于 2011-12-23 14:44 |只看该作者
先前的:
   这样的方式把10个线程串成一条流水线,主线程把指针push到第一个线程的环形队列,第一个线程从环形队列里面pop出来一个数据(指针),然后处理(不会修改这个指针指向的值),然后把这个指针插入到下一个线程的队列。。(这里。。我觉得还是有点绕。你是由第一个业务线程来触发其他的线程来处理这个业务的。这个有问题的)
thread 1:
while (取数据)
{
   我先push数据到thread 2.//注意这里。。你必须处理了下面的业务,才会去取下一个任务。。这样其实并非是一个并发的处理过程。。
                           //我建议。。每个线程需要有自个的缓冲来处理,或者你对缓冲做个引用计数(如果想节省内存)。也是可以的。
  doTask()
}

论坛徽章:
0
55 [报告]
发表于 2011-12-23 14:51 |只看该作者
补充上面。你后续的业务线程,由于前面的线程必须处理玩当前的业务才会去取数据push到后面的业务线程去处理数据,这样是耽搁了后面的线程处理数据的。如果后面的业务耗时比较少,就会导致。。后面的业务线程的等待。。

论坛徽章:
0
56 [报告]
发表于 2011-12-23 15:12 |只看该作者
C/C++技术交流探讨。 群号: 148848632  大家可以一起来讨论  期待大家的加入。

论坛徽章:
0
57 [报告]
发表于 2011-12-23 15:42 |只看该作者
zylthinking 发表于 2011-12-23 14:43
100W/s 是10个线程串起来, 每个线程都 push/pop 然后什么也不干 的吞吐???
如果是的话, 有可能就 ...

是啊  理想情况下流水线的性能应该是处理得最慢的那个节点的性能。就好比工厂的流水线一样。

论坛徽章:
0
58 [报告]
发表于 2011-12-23 15:43 |只看该作者
xiboboy123 发表于 2011-12-23 14:33
大概了解你的意思了。你是说,不同的线程统计不同的结果是把。你先前的描述:
有个公共的缓冲队列: qun( ...

是这样的 ,这样好比工厂的流水线,每个人虽然是串行的做事情,但是从流水线总体上来看,确是并行的在做。

论坛徽章:
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
59 [报告]
发表于 2011-12-23 15:47 |只看该作者
hy036630 发表于 2011-12-23 15:42
是啊  理想情况下流水线的性能应该是处理得最慢的那个节点的性能。就好比工厂的流水线一样。

但你这样是解释不了为什么多进程就能避免性能下降如此剧烈的现象的。。。。代码在你哪里, 如果你不测试单纯理论上琢磨, 那不会找到原因的

论坛徽章:
0
60 [报告]
发表于 2011-12-23 16:44 |只看该作者
zylthinking 发表于 2011-12-23 15:47
但你这样是解释不了为什么多进程就能避免性能下降如此剧烈的现象的。。。。代码在你哪里, 如果你不测试单 ...

zylthinking 说的不错。测试一下处理性能是否按你处理单元个数的增加线性下降了,如果是的话,可以认为因为某种原因程序并未能利用上多核来同时处理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP