c++ - 为什么 std::hardware_con/corruption_interference_size 不同?

标签 c++ multithreading std cpu-cache

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

最佳答案

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

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

(尚不清楚通常预取相邻块的系统的 std::hardware_constructive_interference_size 是否为缓存块/行大小的两倍,同时缓存块/行大小为 std::hardware_corruption_interference_size。)

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

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

  • 变量对齐的提议将对齐映射到一种方式,并使用重叠的倾斜关联性来避免在任何对齐比另一种对齐更常见时的容量浪费。
  • 关于c++ - 为什么 std::hardware_con/corruption_interference_size 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59395547/

    相关文章:

    c# - 异步生产者/消费者

    C++ cin.get();功能异常?

    c++ - 在 C++ 中给出两个整数 vector (相同的大小和类型),我想将其中一个从最小元素到最大元素排序并更改第二个 vector 的顺序

    c++ - 枚举及其值

    c++函数作为没有指针的参数

    c++ - gsoap 作为 soap 客户端是线程安全的吗?

    c# - 在多个线程中锁定一个变量

    C++ NetBeans std::array 不可用

    c++ - 如何在 vc 2008 或 vc 2010 Beta 中将对话框栏或对话框放入 Pane

    c++ - std::getline 在遇到 eof 时抛出