向量的数据如何对齐?

新手上路,请多包涵

如果我想用 SSE 处理 std::vector 中的数据,我需要 16 字节对齐。我怎样才能做到这一点?我需要编写自己的分配器吗?或者默认分配器是否已经与 16 字节边界对齐?

原文由 fredoverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

C++ 标准要求分配函数( malloc()operator new() )为任何 标准 类型分配适当对齐的内存。由于这些函数不接收对齐要求作为参数,实际上这意味着所有分配的对齐方式是相同的,并且是具有最大对齐要求的标准类型,通常是 long double 和/或 long long (参见 boost max_align union )。

向量指令,如 SSE 和 AVX,比标准 C++ 分配函数提供的对齐要求更强(16 字节对齐用于 128 位访问,32 字节对齐用于 256 位访问)。 posix_memalign()memalign() 可用于满足具有更强对齐要求的此类分配。


在 C++17 中, 分配函数 接受 std::align_val_t 类型的附加参数。

您可以像这样使用它:

 #include <immintrin.h>
#include <memory>
#include <new>

int main() {
    std::unique_ptr<__m256i[]> arr{new(std::align_val_t{alignof(__m256i)}) __m256i[32]};
}

此外,在 C++17 中,标准分配器已更新为尊重类型的对齐,因此您可以简单地执行以下操作:

 #include <immintrin.h>
#include <vector>

int main() {
    std::vector<__m256i> arr2(32);
}

或者(在 C++11 中不涉及和支持堆分配):

 #include <immintrin.h>
#include <array>

int main() {
    std::array<__m256i, 32> arr3;
}

原文由 Maxim Egorushkin 发布,翻译遵循 CC BY-SA 4.0 许可协议

对一个过时(但很重要)问题的当代回答。

正如其他人所说,立即想到编写自己的 Allocator 类 [模板]。从 C++11 到 C++17,实现将主要受限于(按标准)使用 alignas 和放置 new 。 C++17提升了C11的 aligned_alloc 很方便。 Furthermore, C++17’s std::pmr namespace (header <memory_resource> ) introduces the polymorphic_allocator class template and the memory_resource abstract interface for polymorphic allocations,深受 Boost 的启发。除了允许真正通用的动态代码之外,这些已被证明在某些情况下可以提高速度;在这种情况下,您的 SIMD 代码将执行得更好。

原文由 terrygarcia 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题