首先,我在这里只找到了one question about std::hardware_destructive_interference_size and std::hardware_constructive_interference_size,这并没有回答以下问题:为什么有两个截然不同的值。两者都应与缓存线大小相同。那么,什么样的缓存架构可以强制要求有两个不同的值呢?
发布于 2019-12-21 02:43:02
至少两种类型的高速缓存设计可以具有不同的用于避免假共享的最小对齐和用于真正共享的最大对齐:扇区高速缓存块和可变对齐的高速缓存块。
在未命中时获取整个块(国际商用机器公司的说法;英特尔的说法是扇区;标签覆盖范围的单位)的扇区高速缓存块将具有std::hardware_constructive_interference_size的块(扇区)大小。由于较小的扇区(IBM所说的;英特尔所说的行;有效性单位)将被远程(或不同级别的高速缓存)写入而无效,因此std::hardware_destructive_interference_size将是这个较小块的大小。这是一个已经实现的设计。
(不清楚通常预取相邻块的系统是否具有两倍于高速缓存块/线大小的std::hardware_constructive_interference_size,而具有用于std::hardware_destructive_interference_size的高速缓存块/线大小。)
可变对齐的缓存块*(一种针对较大缓存块的设计,其缓存块内部碎片浪费容量略低)以比缓存块大小更小的值对齐存储。例如,64B高速缓存块可以按偶数或奇数32B对齐;std::hardware_constructive_interference_size将是32B (因为奇数32B对齐的高速缓存块不会取出64B对齐块的互补一半),但是std::hardware_destructive_interference_size将是128B (因为奇数32B对齐的高速缓存块将干扰两个64B对齐的地址)。可变对齐的高速缓存块还打破了对齐足以管理高速缓存性能的这一方面的概念。
打破这些定义的另一种可能性是步长缓存(一种有限形式的数据跟踪缓存)。支持具有2个字跨度的块的高速缓存(即,一个块存储字0、2、4等,但不存储字1、3、5等)将严重扰乱std::hardware_constructive_interference_size和std::hardware_destructive_interference_size背后的假设。虽然这样的缓存块通常会被分配给跨距向量缓存,但这种设计违反了正交性的期望,并且在以后引入非跨距访问时可能会导致性能问题。
https://stackoverflow.com/questions/59395547
复制相似问题