CPU 将storebuffer 中的值刷新到L1 缓存时?
When CPU flush value in storebuffer to L1 Cache?
Core A将值x写入storebuffer,等待无效ack,然后将x刷入缓存。它只等待一个确认还是等待所有确认?它是如何知道所有 CPU 中有多少个 ack 的?
我不清楚你所说的 "invalid ack" 是什么意思,但我们假设你的意思是 snoop/invalidation 来自另一个请求同一线路所有权的核心。
在这种情况下,存储缓冲区中的存储通常可以自由地忽略来自其他内核的此类无效,因为存储缓冲区中的存储还不是全局可见的。只有当他们在退休后的某个时候提交到 L1 时,商店才会变得全局可见。此时1 缓存控制器将对关联行进行RFO(所有权请求)(如果它不在缓存中)。基本上在这一点上,商店变得全局可见。 L1 缓存控制器不需要知道有多少其他失效正在进行中,因为它们作为 MESI 协议的一部分由系统中的一些更高级别的组件进行调解,并且当它们到达 E 状态时,它们保证他们是独家拥有者。
简而言之,来自其他核心的失效对存储缓冲区2中的存储几乎没有影响,因为它们根据 RFO 请求在单个点上变得全局可见。是 loads 执行了该区域更可能是由另一个核心上的无效 activity 造成的,尤其是在 x86 等不允许可见负载的强平台上重新排序。例如,x86 上所谓的 MOB 负责跟踪失效是否可能破坏排序规则。
RFO 响应
也许您正在谈论的 "acks" 是其他核心对写入核心请求获取或升级其对该行的所有权的请求的响应,以便它可以写入它:即无效副本其他 CPU 行等。
这通常称为发出 RFO,当成功时,请求核心中的线路将处于 E 状态。
大多数 CPU 都是分层的,各种不同的代理一起工作以确保一致性。实际上,这意味着 CPU 不需要等待来自 N CPU 系统上其他 N-1 个核心的最多 N-1 "acks",而只是一个来自更高级别组件的单个回复,该组件本身负责发送和收集来自其他 CPUs.
的回复
一个示例可以是单插槽多核 CPU,具有专用的 L1 和 L2,以及共享的 L3。内核可能会将其 RFO 向下发送到 L3,L3 可能会向所有内核发送无效请求,等待它们的响应,然后向发出请求的内核确认 RFO 请求。或者,L3 可能会存储一些位,这些位指示哪些内核可能有线路的副本,然后它只需要将请求发送到这些内核(L3 在这种情况下所扮演的角色有时被称为窥探)文件管理器)。
由于代理之间的所有通信都通过 L3,因此它能够保持任何内容的一致性。在多套接字系统的情况下,事情变得更加复杂:本地核心上的 L3 可能会再次收到请求并将其传递给另一个套接字以在那里执行相同类型的无效。同样可能存在探听过滤器的概念,或者可能存在其他概念并且行为甚至可能是可配置的!
例如Intel的Broadwell Xeon架构中,有fully four different configurable snoop modes:
Broadwell offers four different snoop modes a reintroduction of Home
Snoop with Directory and Opportunistic Snoop Broadcast (HS with DIR +
OSB) previously available on Ivy Bridge, and three snoop modes that
were available on Haswell, Early Snoop, Home Snoop, and Cluster on Die
Mode (COD). Table 5 maps the memory bandwidth and latency trade-offs
that will vary across each of the different modes. Most workloads will
find that Home Snoop with Directory and Opportunistic Snoop Broadcast
will be the best choice.
...具有不同的性能权衡:
该文档的其余部分详细介绍了各种模式的工作原理。
所以我想简短的回答是 "it's complicated and depends on the detailed design and possibly even user-configurable settings"。
1 或者可能在更早的某个时间点,因为优化的实现可能 "look ahead" 在存储缓冲区中并发出 RFO(所谓的 "RFO prefetches")即将开业的商店甚至在它们成为最高级的商店之前。
2 然而,无效可能会使第一个脚注中提到的 RFO 预取复杂化,因为这意味着有一个 window 行可以是 "stolen back" 由另一个核心,使 RFO 预取浪费工作。一个复杂的实现可能有一个预测器,它根据是否发生这种情况来监视 RFO 预取积极性。
Core A将值x写入storebuffer,等待无效ack,然后将x刷入缓存。它只等待一个确认还是等待所有确认?它是如何知道所有 CPU 中有多少个 ack 的?
我不清楚你所说的 "invalid ack" 是什么意思,但我们假设你的意思是 snoop/invalidation 来自另一个请求同一线路所有权的核心。
在这种情况下,存储缓冲区中的存储通常可以自由地忽略来自其他内核的此类无效,因为存储缓冲区中的存储还不是全局可见的。只有当他们在退休后的某个时候提交到 L1 时,商店才会变得全局可见。此时1 缓存控制器将对关联行进行RFO(所有权请求)(如果它不在缓存中)。基本上在这一点上,商店变得全局可见。 L1 缓存控制器不需要知道有多少其他失效正在进行中,因为它们作为 MESI 协议的一部分由系统中的一些更高级别的组件进行调解,并且当它们到达 E 状态时,它们保证他们是独家拥有者。
简而言之,来自其他核心的失效对存储缓冲区2中的存储几乎没有影响,因为它们根据 RFO 请求在单个点上变得全局可见。是 loads 执行了该区域更可能是由另一个核心上的无效 activity 造成的,尤其是在 x86 等不允许可见负载的强平台上重新排序。例如,x86 上所谓的 MOB 负责跟踪失效是否可能破坏排序规则。
RFO 响应
也许您正在谈论的 "acks" 是其他核心对写入核心请求获取或升级其对该行的所有权的请求的响应,以便它可以写入它:即无效副本其他 CPU 行等。
这通常称为发出 RFO,当成功时,请求核心中的线路将处于 E 状态。
大多数 CPU 都是分层的,各种不同的代理一起工作以确保一致性。实际上,这意味着 CPU 不需要等待来自 N CPU 系统上其他 N-1 个核心的最多 N-1 "acks",而只是一个来自更高级别组件的单个回复,该组件本身负责发送和收集来自其他 CPUs.
的回复一个示例可以是单插槽多核 CPU,具有专用的 L1 和 L2,以及共享的 L3。内核可能会将其 RFO 向下发送到 L3,L3 可能会向所有内核发送无效请求,等待它们的响应,然后向发出请求的内核确认 RFO 请求。或者,L3 可能会存储一些位,这些位指示哪些内核可能有线路的副本,然后它只需要将请求发送到这些内核(L3 在这种情况下所扮演的角色有时被称为窥探)文件管理器)。
由于代理之间的所有通信都通过 L3,因此它能够保持任何内容的一致性。在多套接字系统的情况下,事情变得更加复杂:本地核心上的 L3 可能会再次收到请求并将其传递给另一个套接字以在那里执行相同类型的无效。同样可能存在探听过滤器的概念,或者可能存在其他概念并且行为甚至可能是可配置的!
例如Intel的Broadwell Xeon架构中,有fully four different configurable snoop modes:
Broadwell offers four different snoop modes a reintroduction of Home Snoop with Directory and Opportunistic Snoop Broadcast (HS with DIR + OSB) previously available on Ivy Bridge, and three snoop modes that were available on Haswell, Early Snoop, Home Snoop, and Cluster on Die Mode (COD). Table 5 maps the memory bandwidth and latency trade-offs that will vary across each of the different modes. Most workloads will find that Home Snoop with Directory and Opportunistic Snoop Broadcast will be the best choice.
...具有不同的性能权衡:
该文档的其余部分详细介绍了各种模式的工作原理。
所以我想简短的回答是 "it's complicated and depends on the detailed design and possibly even user-configurable settings"。
1 或者可能在更早的某个时间点,因为优化的实现可能 "look ahead" 在存储缓冲区中并发出 RFO(所谓的 "RFO prefetches")即将开业的商店甚至在它们成为最高级的商店之前。
2 然而,无效可能会使第一个脚注中提到的 RFO 预取复杂化,因为这意味着有一个 window 行可以是 "stolen back" 由另一个核心,使 RFO 预取浪费工作。一个复杂的实现可能有一个预测器,它根据是否发生这种情况来监视 RFO 预取积极性。