如何解决为了避免错误共享,每个单独的 unique_ptr 向量项缓存行对齐的 std::vector<std::unique_ptr<T>> 是否有意义?
假设这样的向量是 std::vector<T,boost::alignment::aligned_allocator<T,64>>
将被多个内核同时读/写访问并在每个内核的基础上分配它(即向量索引 0 仅由 CPU 内核 0 使用,1 由内核 1 ,等等),如果想要避免错误共享,则必须将此处的底层 T
声明为 alignas(64)
或仅确保将其正确填充到标准的 x86 缓存行大小(即 64 字节)。但是如果向量的 T
是 std::unique_ptr<U>
呢?同样的情况是否仍然成立并有意义,即每个向量项 - 在本例中为 std::unique_ptr
- 需要 64 个字节的大小?
解决方法
如果您希望能够修改指针,那么是的,您应该确保指针本身对齐。但是,如果在并行代码运行时指针从未更改,则它们不必更改(即使线程共享缓存行,也可以在线程之间共享只读数据)。但是,您必须确保 U
正确对齐。
注意:不要假设 64 字节缓存行大小,而是使用 std::hardware_destuctive_interference_size
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。