我想知道我是否可以自动从新内存中停止 Eigen,以及这样做是否可以提高速度。我附上了一个代码片段,它有点像我的程序所做的那样。

#define EIGEN_RUNTIME_NO_MALLOC


#include <Eigen/Dense>


using namespace std;

using namespace Eigen;

#define UNCONST(t,c,uc) Eigen::MatrixBase<t> &uc = const_cast<Eigen::MatrixBase<t>&>(c);

template <typename Derived>
void multiply (const MatrixBase<Derived> &A, MatrixBase<Derived> const &const_C){
    Matrix<double, Dynamic, Dynamic>B;
    B.setOnes(500,500);

    UNCONST(Derived,const_C,C);

    Eigen::internal::set_is_malloc_allowed(false);
    C = A*B;
    Eigen::internal::set_is_malloc_allowed(true);
}

int main(int argc, char** argv)
{
    Matrix<double,Dynamic,Dynamic>A,C;
    A.setOnes(500,500);
    C.setOnes(500,500);
    multiply(A,C);

}

我在 Debug模式下编译此代码,当我执行它时,出现以下错误:

断言失败:(is_malloc_allowed() &&“堆分配被禁止(EIGEN_RUNTIME_NO_MALLOC 已定义,g_is_malloc_allowed 为假)”),函数check_that_malloc_is_allowed,文件../3rdparty/Eigen/src/Core/util/Memory.h,第189行

有没有办法可以关闭这个内存分配?我很小心地确保作业左侧的矩阵具有正确的维度。如果我停止这些 malloc 调用,代码中会不会有加速?我处理大型矩阵,并重复使用诸如 multiply() 之类的函数。

非常感谢您的时间!

最好的,

阿西什

最佳答案

您可以使用 noalias 避免临时产品:

C.noalias() = A * B;

正如所记录的 there

关于c++ - 避免 Eigen 的内存分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33664976/

10-16 03:40