【问题标题】:Why Eigen use Column-Major by default instead of Row-Major?为什么 Eigen 默认使用 Column-Major 而不是 Row-Major?
【发布时间】:2020-04-10 12:48:46
【问题描述】:

虽然 Eigen 是 C++ 库,C/C++ 使用 row-major 存储结构,但为什么 Eigen 更喜欢使用 column-major 存储顺序?从Why does MATLAB use column-major order? 的帖子中,我了解到 MATLAB 使用它是因为历史原因(由于 FORTRAN)。但据我所知,Eigen 一开始是基于 C++ 构建的。

在 Eigen Library 网站上它说:

Eigen 中的默认值是列优先。自然,Eigen 库的大部分开发和测试都是使用列优先矩阵完成的。这意味着,即使我们的目标是透明地支持列优先和行优先存储顺序,Eigen 库也可以很好地处理列优先矩阵。 (取自https://eigen.tuxfamily.org/dox/group__TopicStorageOrders.html

可能由于经常使用 C++ 和 OpenCV,我的大脑倾向于以行优先的形式思考。使用列主矩阵开发和测试 Eigen 库是否有任何性能(缓存位置、加载/存储速度等)原因?

【问题讨论】:

  • This 可能是相关的。简短的回答是没关系。

标签: c++ eigen eigen3


【解决方案1】:

其实你是对的,原来对于row-major storage数据,row-major traversal具有更好的缓存局部性,因此缓存命中率更高。 p>

Eigen 默认以col-major order存储数据。这似乎有点违反直觉,然而,Eigen 默认也以col-major order遍历数据。

另外,你可以在这里找到官方文档Eigen storage order: 由于更好的数据局部性,当矩阵以行优先顺序存储时,逐行遍历矩阵的算法将运行得更快。同样,对于列主矩阵,逐列遍历更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 2019-02-26
    • 2013-01-13
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    相关资源
    最近更新 更多