免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4959 | 回复: 4
打印 上一主题 下一主题

PowerPC32的乱序访存疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-03 10:24 |只看该作者 |倒序浏览
freescale的powerpc32位编程手册:第190页
Except for the cases described above and earlier in this section, data and control dependencies do not order
memory accesses. Examples include the following:
• If a load specifies the same memory location as a preceding store and the location is not caching
inhibited, the load may be satisfied from a store queue (a buffer into which the processor places
stored values before presenting them to the memory subsystem) and not be visible to other
processors and mechanisms. As a result, if a subsequent store depends on the value returned by the
load, the two stores need not be performed in program order with respect to other processors and
mechanisms.


按例子说,如果写向addr1,然后从addr1读,通过读出的数据决定另一个写操作,那么这两个写可能不按顺序完成.
如果两次写的地址不同,我可以理解,因为逻辑上两次写的完成不互相影响,不构成"写后写"的问题. 但是如果碰巧是"写后写"呢,文档的意思是说这里有隐患,需要的时候这里就要自己加内存屏障了吗?
上下文太长了我就不贴了, 前文大致是介绍了powerpc的乱序访存和几种sync类指令.

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
2 [报告]
发表于 2011-05-03 16:24 |只看该作者
我理解的意思是:如果这两次写在应用上是相关的话,那么必须要加上屏障以避免两次操作之间的乱序。文章并没强调说是否是同一地址,所以即使对于同样的地址,如果存在相关,也需要进行屏障处理。

论坛徽章:
0
3 [报告]
发表于 2011-05-04 16:21 |只看该作者
我理解的意思是:如果这两次写在应用上是相关的话,那么必须要加上屏障以避免两次操作之间的乱序。文章并没 ...
liuiang 发表于 2011-05-03 16:24



    是的,這個地方必須使用內存屏障以保證正確性

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
4 [报告]
发表于 2011-06-08 20:22 |只看该作者
回复 3# Cindinx


    2位没明白英文的意思。这里的不同步是一个写buffer和cache双路径造成的。

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
5 [报告]
发表于 2011-06-09 17:32 |只看该作者
我确实审题有问题,现在更正一下。我们先针对文档描述一下我理解的意思:

1,文档第一句话明确说明,这个例子是典型的数据和控制依赖问题
2,文档说明如果一个load操作紧跟在一个store后面,那么后面的load操作会直接从store queue中获得数据,而不会从cache,也不会等到store queue刷到cache后在从cache获得
3,仅接着又说,如果紧接着又跟了一个store操作,就是说store->load->store的情况,并且最后的一个store操作依赖中间的load返回值,那么两次store的操作不会按序的被其他处理器察觉到,换句话说,其他处理器有可能发现后面的store先于前面的store执行

举个例子,假设变量初始值为:a=1  b=2  c=3 p=&c,然后执行如下代码:
p = &a;
b = *p;

这种情况下,其他处理器可能会发现b的值先被更改为1,这时候p还指向的是c,而此时c不是1,过了一会,p的值才指向a,对于其他处理器来说这是无法理解的。

这篇段文字并没有提供结论,但结论应该是:需要在两次store之间增加wb()。

对于你紧接着问的问题,我的理解是:
1,就算不是写后写,就算两个地址不相同,也需要加屏障,因为上面已经分析了;
2,对于你说的写后写的情况,反倒不见的必须要加屏障;

我们再假设运行这样一段代码:
p = &a;
reg = *p;
p = reg;
其中reg是个寄存器。这样的话,从外界看,发现p被更改了,至于p被更改了几次,外界并不关心。另外必须要说明的是,外界只会看到:
1,p先指向a,然后p又被更改成a的内容 或者
2,p直接被更改成a的内容
但是外界永远永远不会看到,p先被更改成a的内容,然后更改成p指向a。

所以对于写后写,外界看到的顺序一定是正确的,但有可能被忽略先前的一次写,而忽略本身是否需要被外界察觉才是是否需要加屏障的关键。

显然如果p所要操作的是硬件寄存器,这里必须要加屏障,因为访问本身是具有意义的,但如果只是普通内存,则要看具体情况,一般来说是不需要加。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP