用于对齐的特征映射的32字节对齐的分配器

时间:2017-09-19 12:58:47

标签: eigen

我使用Eigen Map<>模板类重新解释C ++数组的块 特征固定大小的数组。似乎Eigen :: allocator提供了 16字节对齐分配。处理AVX的正确方法是什么? 我应该建立自己的分配器吗?

using Block=typedef Eigen::Array<float,8, 1>; using Map=Eigen::Map<BLOCK,Eigen::Aligned32>; template <class T> using allocator=Eigen::aligned_allocator<T>;

std::vector<float,allocator<float> > X(10000); Map myMap(&X[0]); //should be 32 bytes aligned for AVX

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

文档已过时,内部Eigen :: aligned_allocator是Eigen::internal::aligned_malloc的包装器,它返回按照定义there对齐的内存:

  

EIGEN_MAX_ALIGN_BYTES - 必须是2的幂,或0.定义上限   绑定在内存边界上的字节,动态和   静态分配的数据可以通过Eigen对齐。如果没有定义,a   默认值是根据体系结构自动计算的,   编译器和操作系统。此选项通常用于强制执行二进制文件   使用不同SIMD编译的代码/库之间的兼容性   选项。例如,可以编译AVX代码并强制执行A​​BI   通过定义与现有SSE代码的兼容性   EIGEN_MAX_ALIGN_BYTES = 16。在另一方面,因为默认AVX   意味着32字节对齐以获得最佳性能,可以编译SSE   通过定义,代码与AVX代码兼容   EIGEN_MAX_ALIGN_BYTES = 32

基本上,如果使用-mavx进行编译,则会得到32个字节的对齐指针。