避免特征内存分配

Avoiding Eigen's Memory allocation

本文关键字:分配 内存 特征      更新时间:2023-10-16

我想知道我是否可以自动从新内存中停止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"堆分配被禁止(定义了EIGEN_RUNTIME_NO_MALLOC并且g_is_MALLOC_allow为false)"),函数check_that_malloc_is_allowed,文件/3rdparty/Eigen/src/Core/util/Memory.h,第189行。

有没有办法关闭内存分配?

我很小心地确保作业左侧的矩阵具有正确的维度。我处理大矩阵,并重复使用类似multiply()的函数。如果我停止这些malloc调用,代码中会有加速吗?

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

C.noalias() = A * B;

如文件所示。