【问题标题】:Why are std::hardware_con/destructive_interference_size different?为什么 std::hardware_con/破坏性_interference_size 不同?
【发布时间】:2019-12-18 15:44:38
【问题描述】:

首先,我在这里只找到了one question about std::hardware_destructive_interference_size and std::hardware_constructive_interference_size,这并不能回答以下问题:为什么有两个不同的值。两者都应该与缓存线大小相同。那么什么样的缓存架构可以强制要求有两个不同的值呢?

【问题讨论】:

  • "两者都应该与 cacheline-size 相同。" 应该吗?你能解释为什么它们应该是一样的吗?以一种使用特定实现细节的方式?
  • 表示仅共享单个高速缓存行的数据结构的最大大小的大小应与两个数据结构之间的最小差异相同,以防止错误共享。
  • 就是我提到的那篇文章。但它并没有说明为什么这些尺寸不同。
  • 据我了解,尺寸不需要不同。单独的定义仅涵盖它们可能不同的情况,即也涵盖异国情调的硬件。 (我必须承认我不会太努力地考虑硬件。我太忙了,无法让我的软件运行,希望没有 U.B.,甚至可能有性能);-)
  • 这取决于最大可实现的对齐方式。如果它小于 L1 缓存行大小,则编译器无法确保变量存储在缓存行的开头。

标签: c++ multithreading std cpu-cache


【解决方案1】:

至少两种类型的缓存设计可以具有不同的最小对齐以避免错误共享和最大对齐以实现真正共享:扇区缓存块和可变对齐缓存块。

在未命中时获取整个块(IBM 语言;Intel 语言中的扇区;标签覆盖单位)的扇区缓存块将具有 std::hardware_constructive_interference_size 的块(扇区)大小。由于较小的扇区(IBM 语言;Intel 语言中的行;有效性单位)将被远程(或不同级别的缓存)写入无效,因此 std::hardware_破坏性_interference_size 将是这个较小块的大小。这是一个已经实现的设计。

(尚不清楚通常预取相邻块的系统是否将 std::hardware_constructive_interference_size 设置为缓存块/行大小的两倍,同时具有 std::hardware_破坏性_interference_size 的缓存块/行大小。)

可变对齐缓存块*(一种针对较大缓存块的设计,缓存块内部碎片浪费的容量略少)以小于缓存块大小的值对齐存储。例如,一个 64B 缓存块可以以偶数或奇数 32B 对齐方式对齐; std::hardware_constructive_interference_size 将为 32B(因为奇数 32B 对齐的缓存块不会获取 64B 对齐块的互补一半)但 std::hardware_破坏性_interference_size 将为 128B(因为奇数 32B 对齐的缓存块会干扰两个 64B -对齐的地址)。可变对齐的缓存块也打破了对齐足以管理这方面缓存性能的概念。

另一种破坏这些定义的可能性是跨步缓存(数据跟踪缓存的有限形式)。支持具有 2 字跨度的块(即,一个块存储字 0、2、4 等但不存储字 1、3、5 等)的缓存将严重混淆 std::hardware_constructive_interference_size 和 std 背后的假设::hardware_破坏性_干扰_大小。虽然此类缓存块通常会分配给跨步向量缓存,但该设计违反了正交性的预期,并且在以后引入非跨步访问时可能会导致性能问题。


  • 变量对齐的提议将对齐映射到一种方式,并使用重叠的倾斜关联性来避免在任何对齐比另一个更常见时浪费容量。

【讨论】:

  • 错了。对于扇区缓存,内核之间的一致性单位是扇区。真正共享的最大大小应该是一个扇区,并且避免错误共享的对象之间的最小距离也应该是一个扇区。所以两者的大小也应该相同。
  • @BonitaMontero 真正的共享是获取宽度,即获取整个块/扇区时的缓存块(IBM)/缓存扇区(Intel)(通常是此类缓存的情况,在至少来自主内存——从另一个缓存满足读取可能会使其他扇区/行无效)。一致性(失效)在扇区/线的粒度上,所以错误共享在那个粒度上。 std::hardware_constructive_interference_size 更关心在一次访问中会引入多少内存,尤其是来自主内存。
  • 不,真正的共享意味着与其他核心上的其他缓存单元没有任何可避免的冲突。它不一定绑定到 fetch-width。使用扇区缓存,不同的内核可以共享同一缓存线的不同扇区。所以这与整个缓存行无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 2016-05-10
  • 2012-01-02
  • 2021-04-27
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多