c++ - std::hardware_constructive_interference_size 有用吗?

标签 c++ alignment cpu-cache

该领域的现有问题仍然没有具体询问我的问题:

第二个问题的答案实际上让我问了这个问题。

所以,假设我想要建设性的干预。我将几个变量放入适合 std::hardware_constructive_interference_size 的单个结构中:

struct together
{
  int a;
  int b;
};

如果不适合,则禁止使用 static_assert 进行编译的优势似乎太弱了:

// Not going to do the below:
static_assert(sizeof(together) <= std::hardware_constructive_interference_size);

仍然对齐有助于避免结构跨度:

struct alignas(std::hardware_constructive_interference_size) together
{
  int a;
  int b;
};

但是,仅在结构尺寸上对齐即可实现相同的效果:

struct alignas(std::bit_ceil(2*sizeof(int))) together
{
  int a;
  int b;
};

如果结构大小大于 std::hardware_constructive_interference_size,将其与结构大小对齐可能仍然有帮助,因为:

  • 这是编译时提示,随着编译后的程序运行在更高版本的 CPU 上,该提示可能会变得过时
  • 它是缓存级别缓存线大小之一,如果有多个,超过一级缓存线仍可能为其他级别缓存线提供有用的共享
  • 调整结构大小不会产生超过两倍的开销。如果缓存行大小远大于结构大小,则按缓存行大小对齐可能会导致更多开销。

那么,std::hardware_constructive_interference_size还有什么意义吗?

最佳答案

考虑 std::deque<T> 。它通常使用给定大小的 block 来实现。但是每个 block 存储多少个 T?合理的答案是 std::hardware_constructive_interference_size/sizeof(T) ,如果sizeof(T)很小。

类似地,具有小字符串优化的字符串类的目标可能是 std::hardware_constructive_interference_size 的大小。 。一般来说,当您可以拥有具有高引用局部性的运行时可变数量的数据时,该大小很有用。

关于c++ - std::hardware_constructive_interference_size 有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61610761/

相关文章:

c++ - `STRSAFE_NO_TRUNCATION` 和 `STRSAFE_NULL_ON_FAILURE` 值有什么区别?

c++ - 具有不同数据类型的 std::move()

c++ - 什么是内联函数?

html - 在列内水平对齐 div

html - 导航栏中的元素对齐

c - 内存性能/缓存难题

c++ - 与 Visual Studio 兼容的免费/开源 Windows Fortran 编译器

c# - 收据打印的中心文本

linux - 堆栈内存在 Linux 中物理上是连续的吗?

arrays - 链表、数组和硬件内存缓存