内存屏障的传递性/累积性如何通过微体系结构实现?

Rag*_*ghu 3 x86 x86-64 cpu-architecture memory-barriers micro-architecture

我一直在阅读有关x86内存模型如何工作以及屏障指令在x86上的意义,并与其他体系结构(例如ARMv8)进行比较。在x86和ARMv8架构中,内存模型都遵循(无双关),即传递性/累积性,即如果CPU 1看到CPU0的存储,而CPU2看到CPU1的存储,则只有在CPU1看到CPU0的存储时才会发生,然后CPU2还必须查看CPU0的存储。我指的示例是保罗·麦肯尼(Paul McKenney)著名论文6.1节中的示例1和2(尽管相关,但他最新的性能手册《http://www.puppetmastertrading.com/images/hwViewForSwHackers》中也存在同样的问题。 pdf格式)。如果我理解正确,那么x86使用商店队列(或商店订单缓冲区)对商店进行排序(以及其他微体系结构优化),然后使其成为全局可见(即写入L1D)。我的问题是x86拱(和其他拱)如何实现(微架构)传递性?存储队列确保按特定顺序使特定CPU的存储在全局范围内可见,但是又如何确保一个CPU进行的存储排序与其他CPU进行的存储排序呢?

Pet*_*des 6

在x86上,只有一个一致性域。当所有其他核心提交到L1d缓存时,它们就会在同一时间对所有其他核心可见。通常,这与MESI一起足以给我们提供所有线程可以达成共识的总存储订单。

某些ISA(包括PowerPC)不具有该属性(实际上,是因为跨SMT线程在物理核心内对退休存储进行存储转发)。因此mo_relaxed,在实践中,在POWER硬件上,其他2个读者可以按不同的顺序查看2个线程的存储。 是否会在其他线程中始终以相同顺序看到对不同线程中不同位置的两次原子写操作? (大概是PowerPC上的障碍阻止了该转发。)

用于允许此IRIW(独立读者独立作家)重新排序的ARM内存模型,但实际上,从来没有ARM HW可以做到这一点。ARM能够增强其内存模型,以确保所有内核都同意由多个其他内核完成的存储的全局顺序。

(存储转发仍然意味着,在进行存储的核心在全局可见之前很久就可以立即看到它。当然,需要进行负载排序,以使核心能够说出他们看到了关于独立写入顺序所观察到的一切)


如果所有内核必须就存储的全局顺序达成一致,那么(在您的示例中)从Core2查看存储意味着Core1必须已经发生,并且您也可以看到它。

(假设Core2使用适当的障碍或获取负载或发布存储来确保其存储在看到Core1的存储的负载之后发生。)


可能还与以下内容有关:

  • 最近,ARM决定指定其模型为多副本原子模型,因此我认为在那里不再可能使用IRIW。 (2认同)
  • @Raghu:所有主流 ISA 都使用 MESI(或其变体),创建单个一致性域。是的,这就是为什么提交 L1d 使存储对所有其他核心同时全局可见。其他内核读取该行的唯一机制是发送请求以共享该修改后的行。(除了 PowerPC 在 SMT 线程之间的存储转发)。x86 通过将存储提交顺序限制为每个核心内的程序顺序来获得 TSO。(TSO 是一个比所有商店都存在全局订单更强的术语)。 (2认同)