Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 避免本征';内存分配_C++_Performance_Memory Management_Eigen - Fatal编程技术网

C++ 避免本征';内存分配

C++ 避免本征';内存分配,c++,performance,memory-management,eigen,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,以及这样做是否能加快速度。我附加了一段代码片段,这在某种程度上是我的程序的特征

#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);

}
#定义特征(运行时)否(MALLOC)
#包括
使用名称空间std;
使用名称空间特征;
#定义未约束(t,c,uc)特征::矩阵基&uc=const_cast(c);
模板
无效乘法(常数矩阵基&A、常数矩阵基&C){
MatrixB;
B.setOnes(500500);
未约束(派生,常量C,C);
Eigen::internal::set_是_malloc_允许的(false);
C=A*B;
Eigen::internal::set_是允许的(true);
}
int main(int argc,字符**argv)
{ 
矩阵,C;
A.setOnes(500500);
C.刚毛(500500);
乘(A,C);
}
我在调试模式下编译此代码,当我执行它时,会出现以下错误:

断言失败:(is_malloc_allowed()&“禁止堆分配(定义了EIGEN_RUNTIME_NO_malloc,并且g_is_malloc_allowed为false)”),函数检查_malloc_是否被允许,文件../3rdparty/EIGEN/src/Core/util/Memory.h,第189行

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

非常感谢您抽出时间

最好的


Ashish

您可以使用noalias

C.noalias() = A * B;

如文件所述。

如果不是动态地为大型矩阵分配内存,您将如何分配内存?很可能它们放不下。你能再澄清一下吗?理想情况下,我不希望在该语句中分配新内存,因为我永远不会使用对表达式C=a*B具有错误维数的“C”矩阵。我要说的是,即使您设法禁用动态分配,我也不知道如何为500 x 500矩阵分配内存。它放不下了。哦,对不起。我的第一个问题措辞不正确。我不应该说“停止动态分配内存”。我将其更改为“停止Eigen自动分配新内存”。@vsoftco矩阵不必适合堆栈,您可以将它们作为全局变量静态分配。谢谢!我试过了,我得到了一个非常相似的错误:断言失败:(is_malloc_allowed()&“堆分配被禁止(EIGEN_RUNTIME_NO_malloc已定义,g_is_malloc_allowed为false)”),函数检查_malloc_是否被允许,文件../3rdparty/EIGEN/src/Core/util/Memory.h,第206行。中止陷阱:6对,我忘了补充一点,noalias删除了临时保存A*B结果的文件,但仍有内存分配在进行,以分配一些工作空间缓冲区。这些都是加速矩阵积并使其缓存友好所必需的。您可以使用系数乘积(
C.noalias()=a.lazydroduct(B)
)忽略它们,但是对于这样的矩阵大小,它会慢一到两个数量级。谢谢!我想这解决了我的担忧。我分析了我的代码,似乎大部分时间都被来自Eigen的malloc调用占用。如果适用,我会将noalias()添加到表达式中。这是我能做的最好的缩短执行时间的方法吗?(1)noalias只对产品表达式有意义。(2) 如果malloc看起来非常昂贵,这可能意味着您的实际矩阵非常小(如