我使用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
感谢您的帮助
答案 0 :(得分:2)
文档已过时,内部Eigen :: aligned_allocator是Eigen::internal::aligned_malloc
的包装器,它返回按照定义there对齐的内存:
EIGEN_MAX_ALIGN_BYTES - 必须是2的幂,或0.定义上限 绑定在内存边界上的字节,动态和 静态分配的数据可以通过Eigen对齐。如果没有定义,a 默认值是根据体系结构自动计算的, 编译器和操作系统。此选项通常用于强制执行二进制文件 使用不同SIMD编译的代码/库之间的兼容性 选项。例如,可以编译AVX代码并强制执行ABI 通过定义与现有SSE代码的兼容性 EIGEN_MAX_ALIGN_BYTES = 16。在另一方面,因为默认AVX 意味着32字节对齐以获得最佳性能,可以编译SSE 通过定义,代码与AVX代码兼容 EIGEN_MAX_ALIGN_BYTES = 32
基本上,如果使用-mavx
进行编译,则会得到32个字节的对齐指针。