免费注册 查看新帖 |

Chinaunix

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

问一个关于多线程程序执行时间的问题。 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-12-07 21:11 |只看该作者
本帖最后由 kkmm0105 于 2011-12-07 21:19 编辑
回复  kkmm0105

呃, 我上面说的局部貌似没说清楚……  是这个意思:
void* thread1(void* arg)
{
  ...
OwnWaterloo 发表于 2011-12-07 20:49



    很有道理啊,受益匪浅。我测试了,证明你的观点是对的。起初两个cx的地址仅差一个字节。后来我中间又定义了一些整形变量,将地址差距扩大到64字节。运行速度果然得到很大的提升。
   解释的已经很好了~ 能把这问题分析到cache细节,果然是牛人啊。我对cache的了解仅限于书本,没想到这就是一个实际的问题啊。非常感谢~

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
22 [报告]
发表于 2011-12-08 13:54 |只看该作者
本帖最后由 yulihua49 于 2011-12-08 13:58 编辑
很有道理啊,受益匪浅。我测试了,证明你的观点是对的。起初两个cx的地址仅差一个字节。后来我中 ...
kkmm0105 发表于 2011-12-07 21:11



    我这居然没有这个问题。
我把距离拉大了,结果不变。
单7.9秒双3.9秒。
  1. #include <pthread.h>
  2. #include <stdio.h>

  3. int cx1;
  4. int non[16];
  5. int cx2;

  6. void *proc1(void *arg){
  7.     while(1){
  8.         if(cx1 > 900000000){
  9.             break;
  10.         }   
  11.         cx1++;
  12.     }   
  13. }

  14. void *proc2(void *arg){
  15.     while(1){
  16.         if(cx2 > 900000000){
  17.             break;
  18.         }   
  19.         cx2++;
  20.     }   
  21. }

  22. main()
  23. {
  24. pthread_t tid1,tid2;

  25.     pthread_create(&tid1, NULL, proc1, NULL);
  26.     pthread_create(&tid2, NULL, proc2, NULL);
  27.     pthread_join(tid1, NULL);
  28.     pthread_join(tid2, NULL);

  29. };
复制代码
我的机器没有cache?

论坛徽章:
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
23 [报告]
发表于 2011-12-08 14:17 |只看该作者
本帖最后由 zylthinking 于 2011-12-08 14:19 编辑

这个估计塑料袋解释的才会更彻底一些; 比如, 为什么在缓存次次命中情况下, 缓存会频繁被同步?
恐怕是处理器间同步机制吧

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
24 [报告]
发表于 2011-12-08 15:23 |只看该作者
回复 23# zylthinking

  1. cpu           cpu1              cpu2
  2. cache     [aa)[bb)[cc)...   [xx)[yy)[zz)...
  3.               |                 |
  4.               +-----------------+
  5.               |
  6. memory    [ii)[jj)[kk)...
复制代码
细节得找他无误……

论坛徽章:
0
25 [报告]
发表于 2011-12-08 15:48 |只看该作者
回复  zylthinking 细节得找他无误……
OwnWaterloo 发表于 2011-12-08 15:23



    我用了多个线程把一个大任务做了分割,每个线程任务都会输出一条条的包含两个整数的记录,如这样的:
         

                    12      13
                              12      14
                              13      15
                                .....
   我想把这几个线程的输出结果汇总到一个文件中去,使用什么方案能获得最短的运行时间呢。我知道用标准I/O不可重入,没计算出这个一个结果就加锁、解锁,在计算的结果有很多条记录的情况下效率是不是会很低,接近于串行了。这里我用一个全局描述符号,在每个线程中使用write能保证数据一致性吗?或者可否把输出挂到一个全局链表,最后各线程完成任务后统一输出?不过我感觉这样内存碎片多,由于结果中的记录数多所以malloc次数也很多,效率不是很高
    以上哪个方案好些,还有什么其它更好的方案吗?

论坛徽章:
0
26 [报告]
发表于 2011-12-08 15:50 |只看该作者
我这居然没有这个问题。
我把距离拉大了,结果不变。
单7.9秒双3.9秒。我的机器没有cache?
yulihua49 发表于 2011-12-08 13:54



    莫非你的机器cache中缓存的字节数多?你再拉大点地址试试,先打印下两个变量间的地址。我看了intel的一个cache行可缓存32字节的内容

论坛徽章:
1
NBA常规赛纪念章
日期:2015-05-04 22:32:03
27 [报告]
发表于 2011-12-08 17:15 |只看该作者
学习,好帖。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
28 [报告]
发表于 2011-12-08 17:37 |只看该作者
回复 25# kkmm0105

这问题我搞不定……
不怎么写多线程的, 接触多线程只是为了自己的代码在多线程环境下保证不出错而已……  没研究过如何发挥多核的效率……

论坛徽章:
0
29 [报告]
发表于 2011-12-08 18:10 |只看该作者
回复  kkmm0105

这问题我搞不定……
不怎么写多线程的, 接触多线程只是为了自己的代码在多线程环境下 ...
OwnWaterloo 发表于 2011-12-08 17:37



    好的,那我新开个帖子问问吧

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
30 [报告]
发表于 2011-12-12 11:30 |只看该作者
本帖最后由 yulihua49 于 2011-12-12 11:33 编辑
我用了多个线程把一个大任务做了分割,每个线程任务都会输出一条条的包含两个整数的记录,如这样 ...
kkmm0105 发表于 2011-12-08 15:48



    如果写文件不是瓶颈,可以带锁处理的。
如果是瓶颈,可以考虑用数据库,每个线程一个数据库句柄,多线程并行批量插入。
我试过,ORACLE,OCI批量绑定变量,多线程并行插入比写文件快很多。
或采用二进制定长记录文件,为每一个线程划定数据块,每个线程一个fd,在自己的数据块中操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP