为什么 MESI 协议可能会导致写操作之后是对同一地址的写操作?
Why MESI protocol may result in write action that is followed by write action to the same address?
用于回写的 MESI 协议。单个处理器上有 2 个内核,为简单起见,只有 L1 缓存。
- 地址 A 从未使用过
- 核心 1 启动了对地址 A 的写操作。它导致数据保存到其缓存中,状态设置为 M。
- 核心 2 发起了对地址 A 的写操作。它导致缓存未命中。核心 2 发布 RWITM 广播。核心 1 正在侦听,阻止了 RWITM,值被保存到主内存,其状态在其缓存中设置为 I。随后是核心 2 重新发出 RWITM 并将值存储在主存储器的地址 A 中。地址 A 在其缓存中的状态。
为什么核心 1 会在主内存中保存任何东西,浪费时间 - 它几乎立即被覆盖?
我的消息来源:
http://upload.wikimedia.org/wikipedia/commons/9/99/MESI_protocol_activity_diagram.png
https://www.cs.utexas.edu/~pingali/CS395T/2009fa/lectures/mesi.pdf
有两个原因:
- 这是在整行粒度上完成的。没有人保证两个内核修改了相同的字节,所以内核 2 需要先看到内核 1 的更新,然后合并它修改的字节,然后才提交它的存储。
- Core 2 可能在飞行中被抢占,或者它的写入可能发生其他事情(它仍然没有提交,它只是在等待 RWITM)。在那种情况下,您会因为信任核心 2 而丢失核心 1 的数据。永远不要相信多核硬件会像您期望的那样运行(更不要相信多线程软件)。
请记住,由于没有任何共享缓存,这过于简单化了。如果你有一个(假设它是包容性的),那么核心 1 会简单地将修改写入其中,而核心 2 会更快地获得它。对于这种情况,其他系统也可能实施直接的核心到核心侦听。
一般来说,协议应该假定 none 方知道协议明确告诉它的内容以外的任何内容。您必须使核心 1 之外的行无效以保持一致性(没有 2 个核心可以同时修改同一行),并且由于您没有其他缓存级别 - 您必须将其写入内存并保证数据不会丢失(不要指望核心 2,就核心 1 而言,它不存在,你正在用你信任的唯一流程——写回内存来回应一个神秘的窥探。
最后一件事 - 此流程结束(据我所知,也在幻灯片中),核心 2 将该行安装在其自己的 M 状态缓存中,并进行了修改。从这一点开始,系统可以以任何方式继续(如果该线路稍后会再次被窥探,或者从 Core 2 的缓存中老化 - 这是另一回事)。该流程不需要 Core 2 像您所说的那样将行写回内存,因此没有双写。
用于回写的 MESI 协议。单个处理器上有 2 个内核,为简单起见,只有 L1 缓存。
- 地址 A 从未使用过
- 核心 1 启动了对地址 A 的写操作。它导致数据保存到其缓存中,状态设置为 M。
- 核心 2 发起了对地址 A 的写操作。它导致缓存未命中。核心 2 发布 RWITM 广播。核心 1 正在侦听,阻止了 RWITM,值被保存到主内存,其状态在其缓存中设置为 I。随后是核心 2 重新发出 RWITM 并将值存储在主存储器的地址 A 中。地址 A 在其缓存中的状态。
为什么核心 1 会在主内存中保存任何东西,浪费时间 - 它几乎立即被覆盖?
我的消息来源:
http://upload.wikimedia.org/wikipedia/commons/9/99/MESI_protocol_activity_diagram.png
https://www.cs.utexas.edu/~pingali/CS395T/2009fa/lectures/mesi.pdf
有两个原因:
- 这是在整行粒度上完成的。没有人保证两个内核修改了相同的字节,所以内核 2 需要先看到内核 1 的更新,然后合并它修改的字节,然后才提交它的存储。
- Core 2 可能在飞行中被抢占,或者它的写入可能发生其他事情(它仍然没有提交,它只是在等待 RWITM)。在那种情况下,您会因为信任核心 2 而丢失核心 1 的数据。永远不要相信多核硬件会像您期望的那样运行(更不要相信多线程软件)。
请记住,由于没有任何共享缓存,这过于简单化了。如果你有一个(假设它是包容性的),那么核心 1 会简单地将修改写入其中,而核心 2 会更快地获得它。对于这种情况,其他系统也可能实施直接的核心到核心侦听。
一般来说,协议应该假定 none 方知道协议明确告诉它的内容以外的任何内容。您必须使核心 1 之外的行无效以保持一致性(没有 2 个核心可以同时修改同一行),并且由于您没有其他缓存级别 - 您必须将其写入内存并保证数据不会丢失(不要指望核心 2,就核心 1 而言,它不存在,你正在用你信任的唯一流程——写回内存来回应一个神秘的窥探。
最后一件事 - 此流程结束(据我所知,也在幻灯片中),核心 2 将该行安装在其自己的 M 状态缓存中,并进行了修改。从这一点开始,系统可以以任何方式继续(如果该线路稍后会再次被窥探,或者从 Core 2 的缓存中老化 - 这是另一回事)。该流程不需要 Core 2 像您所说的那样将行写回内存,因此没有双写。