免费注册 查看新帖 |

Chinaunix

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

灭哈哈,想了多半年的时间,终于明白多核编程的实质了~!@#$%^&*( [复制链接]

论坛徽章:
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
11 [报告]
发表于 2011-09-13 00:51 |只看该作者
那么如果如下序列 从内存加载数据到寄存器 寄存器2加载寄存器的值并加一, 寄存器2写回寄存器1 寄布存器3执行同样过程, 如何避免23竟争 cpu一定会知道2的结果是3的操作数吗

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
12 [报告]
发表于 2011-09-13 10:00 |只看该作者
那么如果如下序列 从内存加载数据到寄存器 寄存器2加载寄存器的值并加一, 寄存器2写回寄存器1 寄布存器3执 ...
zylthinking 发表于 2011-09-13 00:51



    你再描述得清楚点。


    另外,这个图是能说明实质的,出自<super scalar processor design> :

论坛徽章:
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
13 [报告]
发表于 2011-09-13 10:39 |只看该作者
你再描述得清楚点。


    另外,这个图是能说明实质的,出自 :
塑料袋 发表于 2011-09-13 10:00


我自己似乎想明白了, 又不确定。。。。。。。
乱序的基本原理就是“取指”,“译码”都是顺序的; 虽然指令的“执行”是乱序的
又让我糊涂了, 如果执行是乱序的, 那么怎么保证执行的结果是正确的呢?
比如我上面的疑问:
1. r1 存储原始值
2. r2 load r1
3. r2 加1
4. r2 写回 r1

5. r3 load r1
6. r3 加1
7. r3 写回 r1

如果第6步先于第3步, cpu如何不犯错误呢。。。。。
应该完全是基础问题, 但我就是开不了窍。

另外, “取指”,“译码”都是顺序的 会对乱序起什么作用呢? 取指顺序不足够cpu得到乱序执行的足够的信息吗?

论坛徽章:
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
14 [报告]
发表于 2011-09-13 10:45 |只看该作者
图没有相应文字资料, 看不懂。。。。。。。

论坛徽章:
0
15 [报告]
发表于 2011-09-13 11:04 |只看该作者
难得的好帖。

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
16 [报告]
发表于 2011-09-13 11:05 |只看该作者
你看到了:

上边的图中有一个reorder buffer,你的这7条指令在解码后,会顺序的进入这个reorder buffer,同时我们假定他们分别对应ID号1~7。

上边的图中在ALU,shifter,branch这三个大框上边,都有8个小框,这8个小框框唤作reservation station。你的这7条指令在解码后,会顺序的进入reservation station。




好,现在每一条指令都存储于两个地方: reorder buffer, reservation station。


reorder buffer里,最关键的内容是 指令的ID号<===> 指令的执行结果 <===> 指令的目的寄存器,这个对应关系

reservation station里,存放的是真正的指令,这些指令的源操作数是ID号,目的操作数也是ID号。



reservation station里的指令在执行完毕后,会根据目的操作数的ID号:

1) 将ID号及结果发送给reorder buffer,更新reorder buffer中对应的指令执行结果,

2) 将ID号及结果广播给各个reservation station,更新reservation station中,有些指令的源操作数也是ID号,而且等于刚广播的这个ID号。




reorder buffer中,不仅顺序入,也是顺序出的。

当顶部的“ID号<===> 指令的执行结果 <===> 指令的目的寄存器”这个对应关系中,指令的执行结果已确定,即指令真的已经执行完毕时,才能从reorder buffer中出来。出来的时候会根据“指令的执行结果 <===> 指令的目的寄存器”这个关系,来修改register file,即真正的回写到寄存器中。


reservation station中,是顺序入,乱序出的。

未收到广播,即源操作数还是ID号时,就不能发射;

已收到广播,将源操作数的ID号替换为前边指令的执行结果后,就能发射。




象你的例子中,

指令5是这样的 :  load   目的ID是5   源ID是4

仅只当指令4执行完毕后,指令5才可能发射。

论坛徽章:
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
17 [报告]
发表于 2011-09-13 11:27 |只看该作者
本帖最后由 zylthinking 于 2011-09-13 11:42 编辑

请问发射的含义是什么: 真正执行? 如果不是真正执行, 那么对指令ID做加法, 而不是对数据做加法, 不明白怎么做的出;
如果是真正执行, 那么 “reservation station里的指令在执行完毕后,会根据目的操作数的ID号”  中的执行做何理解?

似乎给我的理解就是cpu根据指令ID就能执行似的, 而不需要数据。。。。。。。
哦, 是不是乱序含义其实就是: 等源操作数确定后, 就可以进行运算了, 而不需要目的操作数ready? 乱序乱就乱在两个源操作数不相干的两条指令可以并发(???), 而目的操作数为另一指令源操作数的2条指令需要顺序执行

论坛徽章:
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
18 [报告]
发表于 2011-09-13 11:47 |只看该作者
我现在的理解; 进入 record buffer 是批进入的, 需要本次进入的指令完全执行的一个不剩, 下一批才被允许进入?

乱序是在本批进入的指令内部的乱序, 不同批次间的指令还是循序执行的?

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
19 [报告]
发表于 2011-09-13 11:47 |只看该作者
请问发射的含义是什么: 真正执行? 如果不是真正执行, 那么对指令ID做加法, 而不是对数据做加法, 不明白怎么做的出;
如果是真正执行, 那么 “reservation station里的指令在执行完毕后,会根据目的操作数的ID号”  中的执行做何理解?

似乎给我的理解就是cpu根据指令ID就能执行似的, 而不需要数据。。。。。。。
哦, 是不是乱序含义其实就是: 等源操作数确定后, 就可以进行运算了, 而不需要目的操作数ready?
zylthinking 发表于 2011-09-13 11:27



    发射就是指从reservation station扔到ALU中去,或者从reservation station扔到shifter中去......这就叫发射了。

   CPU依靠ID号来维持指令之间的依赖关系,比如 1)  a = 5 + 3 ;  2) b = a+1 :
  
   那么b=a+1就译码为   2) = 1) + 1 ;  

   
   仅只当a=5+3完成后,CPU会将" ID号为1)的指令,其结果为8 " 这个消息广播给reservation station。

   这时, “2) = 1) + 1” 就会变为“2) = 8 + 1”

   于是,ID号为2的指令就可以发射了。2)完成后,同样将广播“ID号为2)的指令,其结果为9” 给reservation station。

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
20 [报告]
发表于 2011-09-13 11:54 |只看该作者
我现在的理解; 进入 record buffer 是批进入的, 需要本次进入的指令完全执行的一个不剩, 下一批才被允许 ...
zylthinking 发表于 2011-09-13 11:47



    否

   
   reorder buffer的理想状态,是时刻都是满的。


  因为reorder buffer中的entry,和reservation station中的entry,是一一对应的。

  而且reservation station中的entry越多,发射那条指令的可选余地就越大。




  reorder buffer中的entry :        指令ID <==> 指令的目的寄存器 <==> 指令的结果

  reservation station中的entry :  指令ID <==> 指令的逻辑,以及指令的源操作数。这里源操作数并不是某个寄存器,它只可能是两种情况

  1) 前边某条指令的ID
  
   2) 不是前边某条指令的ID,因为前边某条指令已经完成,所以已经将其ID替换为真正的执行结果,即一个立即数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP