避免特征的内存分配

时间:2015-11-12 05:26:16

标签: c++ performance memory-management eigen

我想知道我是否可以自动阻止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);

}

我在调试模式下编译此代码,当我执行它时,我收到以下错误:

断言失败:(is_malloc_allowed()&amp;&amp;&#34;禁止堆分配(定义了EIGEN_RUNTIME_NO_MALLOC且g_is_malloc_allowed为假)&#34;),函数check_that_malloc_is_allowed,file ../3rdparty/Eigen/src/ Core / util / Memory.h,第189行。

有没有办法可以关掉这个内存分配?我要小心确保作业左侧的矩阵具有正确的尺寸。如果我停止这些malloc调用,代码中会有加速吗?我处理大型矩阵,我反复使用multiply()等函数。

非常感谢你的时间!

最佳,

与Ashish

1 个答案:

答案 0 :(得分:2)

You you avoid the temporary for product using noalias:

C.noalias() = A * B;

As documented there.