PowerPC32的乱序访存疑问
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类指令.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我理解的意思是:如果这两次写在应用上是相关的话,那么必须要加上屏障以避免两次操作之间的乱序。文章并没强调说是否是同一地址,所以即使对于同样的地址,如果存在相关,也需要进行屏障处理。
是的,這個地方必須使用內存屏障以保證正確性
回复 3# Cindinx
2位没明白英文的意思。这里的不同步是一个写buffer和cache双路径造成的。
我确实审题有问题,现在更正一下。我们先针对文档描述一下我理解的意思:
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所要操作的是硬件寄存器,这里必须要加屏障,因为访问本身是具有意义的,但如果只是普通内存,则要看具体情况,一般来说是不需要加。