避免 Eigen 的内存分配
Avoiding Eigen's Memory allocation
我想知道我是否可以从新内存中自动停止 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() && "堆分配被禁止(EIGEN_RUNTIME_NO_MALLOC 已定义且 g_is_malloc_allowed 为假)"),函数 check_that_malloc_is_allowed,文件 ../3rdparty/Eigen/src/Core/util/Memory.h,第 189 行。
有什么方法可以关闭此内存分配?
我小心翼翼地确保赋值左侧的矩阵具有正确的维度。我处理大型矩阵,并反复使用 multiply()
之类的函数。如果我停止这些 malloc 调用,代码中会有加速吗?
您避免使用 noalias
:
的临时产品
C.noalias() = A * B;
如文档所述there。
我想知道我是否可以从新内存中自动停止 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() && "堆分配被禁止(EIGEN_RUNTIME_NO_MALLOC 已定义且 g_is_malloc_allowed 为假)"),函数 check_that_malloc_is_allowed,文件 ../3rdparty/Eigen/src/Core/util/Memory.h,第 189 行。
有什么方法可以关闭此内存分配?
我小心翼翼地确保赋值左侧的矩阵具有正确的维度。我处理大型矩阵,并反复使用 multiply()
之类的函数。如果我停止这些 malloc 调用,代码中会有加速吗?
您避免使用 noalias
:
C.noalias() = A * B;
如文档所述there。