std::vector<std::unique_ptr<T>> 与每个 unique_ptr 向量项缓存行对齐是否有意义以避免错误共享?
Does a std::vector<std::unique_ptr<T>> with each individual unique_ptr vector item cache-line aligned make sense in order to avoid false sharing?
假设这样的向量 std::vector<T, boost::alignment::aligned_allocator<T, 64>>
将被多个内核同时访问 read/write 并在每个内核的基础上分配它(即 CPU 内核使用的向量索引 0仅 0,1 由核心 1,依此类推),如果要避免虚假共享,则必须将此处的基础 T
声明为 alignas(64)
或仅确保正确使用它填充到标准的 x86 缓存行大小(即 64 字节)。但是如果向量的 T
是 std::unique_ptr<U>
呢?这是否仍然成立并有意义,即每个向量项 - 在本例中 std::unique_ptr
- 大小必须为 64 字节?
如果您希望能够修改指针,那么是的,您应该确保指针本身对齐。但是,如果在您的并行代码为 运行 时指针从未更改,则它们不必更改(即使线程共享高速缓存行,也可以在线程之间共享只读数据)。但是你必须确保 U
正确对齐。
注意:不要假定 64 字节缓存行大小,请改用 std::hardware_destuctive_interference_size
。
假设这样的向量 std::vector<T, boost::alignment::aligned_allocator<T, 64>>
将被多个内核同时访问 read/write 并在每个内核的基础上分配它(即 CPU 内核使用的向量索引 0仅 0,1 由核心 1,依此类推),如果要避免虚假共享,则必须将此处的基础 T
声明为 alignas(64)
或仅确保正确使用它填充到标准的 x86 缓存行大小(即 64 字节)。但是如果向量的 T
是 std::unique_ptr<U>
呢?这是否仍然成立并有意义,即每个向量项 - 在本例中 std::unique_ptr
- 大小必须为 64 字节?
如果您希望能够修改指针,那么是的,您应该确保指针本身对齐。但是,如果在您的并行代码为 运行 时指针从未更改,则它们不必更改(即使线程共享高速缓存行,也可以在线程之间共享只读数据)。但是你必须确保 U
正确对齐。
注意:不要假定 64 字节缓存行大小,请改用 std::hardware_destuctive_interference_size
。