在 MESI protocol ,如果需要将缓存行加载到缓存中,CPU 将发出 PrRd
。根据缓存行是否已在另一个缓存中,发出 BusRd
。然后其他缓存将看到 BusRd 并检查它们是否有有效的副本。如果是,该缓存将发送值。
现在英特尔CAT(缓存分配技术)提供了一种将 LLC 缓存使用情况隔离到不同 CPU 的方法。例如,CPU1 使用前 8 路,CPU2 使用后 8 路。我的问题是:如果现在 CPU1 需要加载 CPU2 缓存中的缓存行,CPU2 会发送该副本而不是从主内存加载吗?
最佳答案
是的。 CAT 不是 NUMA 的一种形式,地址空间仍然是共享的。 它只是一个微架构功能,可以帮助您控制缓存占用,以便线程之间的干扰更少(或者可以访问更多缓存机会,具体取决于您如何分配掩码)。
如果您不从其他线程分区返回数据,您将失去一致性(如果该行被修改怎么办?在这种情况下您无法从内存返回过时的数据)。 可以这样想 - 每个线程都可以从整个缓存中查找,但只分配给他的分区(这可以通过破解 LRU 和受害者选择来轻松实现)。 通过这种方式,您可以完全控制专用线路,并且只有共享线路才会被放置在首先访问它们的线程的分区中。足够接近以获得所需的 QoS。
一个开放的实现问题可能是这样的 - 如果您在一个分区中分配一行,但仅由另一个线程继续使用它,会发生什么情况。它最终会迁移到另一个分区吗?我的猜测是否定的,只是因为检测和组织起来太麻烦了。
关于cpu - 英特尔高速缓存分配技术是否允许一组中的 CPU 对另一组中的高速缓存行进行命中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75927834/