对齐数据类型 Eigen::Matrix 的数组或向量声明
Posted
技术标签:
【中文标题】对齐数据类型 Eigen::Matrix 的数组或向量声明【英文标题】:Array or vector declaration for aligned datatype Eigen::Matrix 【发布时间】:2014-06-24 14:46:14 【问题描述】:我有一个类ClusterNode
,其中包含一个Eigen::Matrix4d
作为类变量。我还有一个函数numNodes()
,它告诉我ClusterNode
s 的总数,以便我可以将它们收集到某种数组、列表或向量中。
但是,Eigen::Matrix4d
是对齐的,这意味着我不能将这种类型的对象存储在 std::vector<ClusterNode>
中,根据这个问题的答案 error C2719: '_Val': formal parameter with __declspec(align('16')) won't be aligned?
作为替代方案,我尝试使用数组。
但是,我做不到
const int n = numNodes();
ClusterNode array [n];
因为函数的返回值不被视为常量。
我还有什么其他选择?
【问题讨论】:
ClusterNode* array = new ClusterNode[n];
您是否阅读了该链接问题中的答案? std::vector
不再按值传递元素类型,因此函数参数的非过度对齐不再是问题。
@Ben 我必须有一个旧的编译器版本,因为我仍然得到编译器错误。
你的编译器版本是多少?
@Ben Visual C++ 10,在 Visual C++ 11 中添加了修复
【参考方案1】:
您可以使用 Eigen 的对齐分配器。详情见this page,但基本上你可以做到:
std::vector<ClusterNode, Eigen::aligned_allocator<ClusterNode> >
也不要忘记为你的类重载 operator new。同样,所有细节都在 Eigen 的 documentation 中。
【讨论】:
【参考方案2】:你可以尝试使用 memalign 或 posix_memalign 来分配和对齐一个可变的内存空间
http://man.he.net/man3/memalign
【讨论】:
【参考方案3】:我最终使用了 Alex Faber 的解决方案
ClusterNode* array = new ClusterNode[n];
但我想补充一点,在这种情况下,类还需要返回对齐的指针。它只会在部分时间以一种非常烦人且无法追踪的方式引起问题,但经过多次寻找错误后,我终于收到了一条有用的错误消息,将我指向Eigen's documentation。
文档摘要:Eigen 需要 16 字节对齐的内存。以下情况会导致悲伤。
-
包含特征类型的标准容器
包含特征类型的类或结构
按值将特征类型传递给函数
Windows 上的 gcc 对齐错误(4 字节)
如果我使用 Alex 提出的动态数组解决方案(ClusterNode 作为变量),我还需要使用 Eigen 提供的宏来确保对象对齐。例如,
class ClusterNode
Eigen::Matrix4d M;
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
如果不包含宏,数组声明有时会静默失败。
【讨论】:
以上是关于对齐数据类型 Eigen::Matrix 的数组或向量声明的主要内容,如果未能解决你的问题,请参考以下文章