PowerPC32的乱序访存疑问

发布于 2022-10-15 08:04:43 字数 986 浏览 29 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

听你说爱我 2022-10-22 08:04:43

我理解的意思是:如果这两次写在应用上是相关的话,那么必须要加上屏障以避免两次操作之间的乱序。文章并没强调说是否是同一地址,所以即使对于同样的地址,如果存在相关,也需要进行屏障处理。

凝望流年 2022-10-22 08:04:43

我理解的意思是:如果这两次写在应用上是相关的话,那么必须要加上屏障以避免两次操作之间的乱序。文章并没 ...
liuiang 发表于 2011-05-03 16:24

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

暖伴 2022-10-22 08:04:43

回复 3# Cindinx

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

何处潇湘 2022-10-22 08:04:43

我确实审题有问题,现在更正一下。我们先针对文档描述一下我理解的意思:

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所要操作的是硬件寄存器,这里必须要加屏障,因为访问本身是具有意义的,但如果只是普通内存,则要看具体情况,一般来说是不需要加。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文