首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >eigen3:编译需要很长时间,调试时非常慢

eigen3:编译需要很长时间,调试时非常慢
EN

Stack Overflow用户
提问于 2021-05-14 06:16:52
回答 1查看 895关注 0票数 0

我使用本征做一些矩阵运算,但是使用本征元的src文件的编译时间非常慢,我的意思是,当文件只有300行时,大约需要40多行。我只使用小于Matrix4f的矩阵,甚至不使用动态大小矩阵,只用于一些矩阵乘法和矩阵分解(SVD和FullPivLU)。

在我的另一个项目中,cpp文件是1000行,编译需要几分钟,输出的.so文件非常大,大约为100米。我必须打开-bigobj选项。

这在调试(我将优化设置为-O0)和发布(-O3)模式中都会发生。我尝试在标题中添加#define和EIGEN_NO_DEBUG,而不是帮助。

我在下面编写了这段非常小的代码test.cpp:

代码语言:javascript
运行
复制
#include </home/user/mywork/software/eigen-3.3.9/Eigen/Dense>
#include "iostream"
using namespace std;
using namespace Eigen;

void test() 
{
    Matrix3f A;
    A << 1,2,3,4,2,8,5,4,9;
    BDCSVD<Matrix3f> svd(A, ComputeFullU | ComputeFullV);
    Matrix3f U = svd.matrixU();
    Matrix3f V = svd.matrixV();
    cout << "------Eigen------" << endl;
    cout << "A" << A << endl;
    cout << "U" << U << endl;
    cout << "V" << V << endl;
}

int main()
{
    test();
    return 0;
}

编译命令

代码语言:javascript
运行
复制
g++ test.cpp -o test_eigen

它需要20多个编译,输出'test_eigen‘是5.6m!

我的os是ubuntu16.04,我使用cmake,在CMakelist中,只包含它的目录。特征版本为3.3.9。

有人有线索吗?非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2022-01-07 05:16:24

特征由7.8MB的纯头文件组成。因此,任何.cpp,包括它,都将有一个困难的编译(使用千兆字节的内存和极慢)。此外,由于模板和内联函数的广泛使用,调试版本将非常缓慢,无法用于调试目的。(例如,谷歌的制图员 will 关于调试版本的警告)和我也是做了一些测试

因此,我认为应将特征用于以下几个方面:

  1. 封装了本征。根据自己的需要创建简单的界面。(例如,创建matrix_4x4.hvector4.hstandard_deviation_calculaor.h等)只在.cpp文件中包含特征。公开的.h文件将非常简单,不会传播以减慢其他文件的编译速度。
  2. 真模块化.将库预编译为静态/共享库。并在程序的其他部分使用简单的标头。
  3. 约束只在我程序的性能关键部分使用本征。例如,以下函数将不使用特征,应该内联(在标头中公开): // vector3.h内联Vector3算子+(ConstVector3& l,ConstVector3& r) {返回Vector3(1.x+ r.x,l.y + r.y,l.z +R.Z)}; 但是Matrix4x4::multiplyInplace(const Matrix4x4& r)将在.cpp中实现,并使用特征。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67529835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档