std::hardware_constructive_interference_size 有用吗?
Is std::hardware_constructive_interference_size ever useful?
这方面的现有问题仍然没有专门问我的问题:
第二个的答案实际上让我问了这个问题。
所以,假设我想要建设性的干涉。我将几个变量放入一个适合 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 中过时编译程序 运行 on
- 它是其中一个缓存级别的缓存行大小,如果有多个,超过一个缓存级别的缓存行可能仍然会给其他级别的缓存行提供有用的共享
- 对齐结构大小不会产生超过两倍的开销。如果缓存行大小变得远远超过结构大小,则对齐缓存行大小可能会导致更多开销。
所以,std::hardware_constructive_interference_size
还有点吗?
考虑 std::deque<T>
。它通常使用给定大小的块来实现。但是每个块存储多少个 T?一个合理的答案是 std::hardware_constructive_interference_size/sizeof(T)
,如果 sizeof(T)
很小。
类似地,具有小字符串优化的字符串 class 的目标可能是 std::hardware_constructive_interference_size
的大小。通常,当您可以拥有 运行 时间可变的数据量且引用位置较高时,该大小很有用。
这方面的现有问题仍然没有专门问我的问题:
第二个的答案实际上让我问了这个问题。
所以,假设我想要建设性的干涉。我将几个变量放入一个适合 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 中过时编译程序 运行 on
- 它是其中一个缓存级别的缓存行大小,如果有多个,超过一个缓存级别的缓存行可能仍然会给其他级别的缓存行提供有用的共享
- 对齐结构大小不会产生超过两倍的开销。如果缓存行大小变得远远超过结构大小,则对齐缓存行大小可能会导致更多开销。
所以,std::hardware_constructive_interference_size
还有点吗?
考虑 std::deque<T>
。它通常使用给定大小的块来实现。但是每个块存储多少个 T?一个合理的答案是 std::hardware_constructive_interference_size/sizeof(T)
,如果 sizeof(T)
很小。
类似地,具有小字符串优化的字符串 class 的目标可能是 std::hardware_constructive_interference_size
的大小。通常,当您可以拥有 运行 时间可变的数据量且引用位置较高时,该大小很有用。