内存屏障的传递性/累积性属性是如何在微体系结构上实现的? [英] How is the transitivity/cumulativity property of memory barriers implemented micro-architecturally?

查看:11
本文介绍了内存屏障的传递性/累积性属性是如何在微体系结构上实现的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在阅读x86内存模型的工作原理和x86上屏障指令的重要性,并将其与其他体系结构(如ARMv8)进行比较。在x86和ARMv8体系结构中,似乎(没有双关语意思)内存模型尊重传递性/累积性,即,如果CPU1通过CPU0看到存储,并且CPU2通过CPU1看到只有在CPU1看到CPU0存储时才可能发生的存储,那么CPU2也必须看到CPU0的存储。我提到的例子是Paul McKenney的著名论文6.1节中的示例1和2(相关但很旧,在他最新的Perf烹饪书http://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf中也有相同的内容)。如果我理解正确的话,x86使用存储队列(或存储顺序缓冲区)在存储变得全局可见(即写入L1D)之前对存储进行排序(并进行其他微ARCH优化)。我的问题是,x86 Arch(和其他Arch)如何(在微体系结构上)实现传递性属性?存储队列确保特定CPU的存储以特定顺序全局可见,但如何确保一个CPU的存储与不同CPU的存储排序?

推荐答案

在x86上,只有一个一致性域。当所有其他核提交L1d缓存时,它们的存储将完全同时对所有其他核可见。总的来说,再加上MESI,就足以给出一个所有线程都能达成一致的总存储顺序。

少数ISA(包括PowerPC)没有该属性(实际上是因为物理核心内跨SMT线程的退役存储的存储转发)。因此,在POWER硬件上的实践中,两个线程的mo_relaxed可以被另外两个读者以不同的顺序看到。Will two atomic writes to different locations in different threads always be seen in the same order by other threads? (可能是PowerPC上的屏障阻止了该转发。)

ARM内存模型过去允许这种IRIW(独立读取器独立写入器)重新排序,但实际上从来没有ARM硬件这样做。ARM能够增强他们的内存模型,以保证所有内核对多个其他内核完成的存储的全局顺序达成一致。

(存储转发仍然意味着执行存储的核心在它变得全球可见之前很久就能立即看到它。当然,要让内核能够说出它们看到的有关独立写入的排序的任何内容,负载排序是必需的。)


如果所有核心必须就存储的全局顺序达成一致,则(在您的示例中)从Core2看到存储表示Core1肯定已经发生,并且您也可以看到它。

(假设Core2使用适当的屏障或获取-加载或释放-存储,以确保其存储发生在看到Core1的存储的加载之后。)


可能还相关:

这篇关于内存屏障的传递性/累积性属性是如何在微体系结构上实现的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆