Eigen EIGEN_MAKE_ALIGNED_OPERATOR_NEW 的传递效果?

问题描述 投票:0回答:1

最近,我意识到固定大小可矢量化特征对象内存对齐的潜在问题。

文档中所述的正确代码

class Foo { ... Eigen::Vector2d v; ... public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW }; ... Foo *foo = new Foo;
我想知道这个代码是否可以?

class Foo2 { ... Foo foo; ... }; ... Foo2 *foo = new Foo2; //?
或者应该在 

EIGEN_MAKE_ALIGNED_OPERATOR_NEW

 类中再次添加 
Foo2
 吗?
这就是
here的建议,我认为:

如果我们添加 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 这只能解决 Cartographer 库本身的问题。该库的用户还必须将 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 添加到包含矢量化 Cartographer 类的类中。这听起来像是一场维护噩梦。

我没有新运算符重载的经验。我认为这个问题更普遍,并且在某种程度上与 new 运算符在 C++ 中的工作方式有关。例如,

Foo

中的重载new运算符是否会被
Foo2
中的默认new运算符调用?那么继承呢?如果 
Foo2
 继承自 
Foo
,我们是否应该将 
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 也放入 
Foo2
 中?


由于我最近才知道这个话题,所以我做了很多研究并发现以下内容:

    x86-64 上的默认对齐方式是 16 字节,因此没有
  • EIGEN_MAKE_ALIGNED_OPERATOR_NEW
     也可以(如果仅启用 SSE)
  • 除非您的代码是针对更新的 SIMD 集进行编译的(例如带有
  • -march=native
     的 AVX2 以在本地计算机上进行所有优化),否则现在需要 
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    
    
  • 其他架构怎么样?例如对于 ARM,如果我们不声明
  • EIGEN_MAKE_ALIGNED_OPERATOR_NEW
     并且启用了 NEON,会出现什么问题吗?
  • 我发现建议使用
  • template <typename Scalar> using Isometry3 = Eigen::Transform<Scalar, 3, Eigen::Isometry | Eigen::DontAlign>
     而不是 
    Isometry
    
    
  • 仍然需要思考如何能够在代码中轻松使用特征类型(例如
  • Isometry3d
    )而不会出现对齐问题。那么添加一个继承自 
    MyIsometry3d
     的新类型 
    Eigen::Transform<double, 3, Eigen::Isometry | Eigen::DontAlign>
     吗?
更一般地说,我想在固定大小的特征类型中“禁用对齐”(或矢量化):

    我想保留语法,例如在代码中保留
  • Isometry3d
    
    
  • 在课堂上使用
  • Isometry3d
     或使用 
    std::vector<Isometry3d>
     时,不必担心对齐问题
    
  • 告诉 Eigen 对于所有固定大小的 Eigen 类型始终使用未对齐的加载/存储(例如 x86-64 内在函数的
  • _loadu_
    /
    _storeu_
    ,其他架构怎么样,是否有等效的?)?
  • 否则只需禁用固定大小特征类型的矢量化,因为我相信使用矢量化指令和这些类型的 C++ 代码之间的惩罚应该(几乎)为空
  • 所以我想解决方案是使用
  • #define EIGEN_UNALIGNED_VECTORIZE 0
    ,这是正确的吗?所以我必须在任何 
    #define
     包含之前把这个 
    Eigen/Dense
     放在任何地方?
  • 我不想用诸如
  • Matrix<double,2,2,DontAlign>
    或新类之类的东西替换所有地方
最后,查看

固定大小可矢量化特征对象页面,我认为缺少某些类型。对于我正在使用的类型:

  • Eigen::Isometry3d
    Eigen::Isometry3f
  • Eigen::AngleAxisd
    Eigen::AngleAxisf
c++ eigen new-operator memory-alignment
1个回答
2
投票
我在 Eigen 邮件列表上询问了这个问题,一位维护者说这个宏的需求确实是可传递的。

Foo2

 因此也需要宏。

更新:实际上这似乎是不正确的,因为

operator new

 是从基类继承的。

© www.soinside.com 2019 - 2024. All rights reserved.