首先,我只找到了 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/