我有一个应用程序,稀疏模式是常量的。让我们说,我的计算是在形式。
sm3 = sm1 + sm2但是,即使在所有这些操作数中,我也将稀疏模式设置为相同的模式,我的分析器显示,大部分时间用于分配和释放结果矩阵。
这是我的MWE:
#include <eigen3/Eigen/Sparse>
#include <iostream>
int main(int argc, char *argv[])
{
using namespace Eigen;
SparseMatrix<double> sm1(2, 2), sm2(2, 2), sm3(2, 2);
// Populate sm1 and sm2
sm1.insert(0,0) = 2.0;
sm2.insert(1,1) = 3.0;
// Compute the result pattern
sm3 = sm1 + sm2;
// Copy the augmented pattern into the operands
sm1 = sm2 = sm3;
// This loop triggers a lot of new[] and delete[] calls
for(int i = 0; i < 1000; i++)
sm3 = sm2 + sm1;
}能否避免那些分配操作的人?
发布于 2016-11-15 20:34:43
目前不可能这样做,因为默认情况下,稀疏矩阵被假定为别名。例如,如果您这样做:
m3 = m3 + m1;由于m1的模式没有完全包含在m3中,那么在m3中直接计算表达式是不可能的。在未来的中,我们可以强制使用目标内存,语法如下:
m3.noalias() = m1 + m2;同时,由于您的矩阵很小,您可以通过添加一些显式零来执行m1和m2的模式与m3模式相同的操作,从而获得更高的性能。然后,使用本征3.3,您可以将稀疏加法转换为密集向量的加法:
m3.coeffs() = m1.coeffs() + m2.coeffs();即使m1和m2之间的交点很小,您也会得到非常高的速度(可能是一个数量级),因为您摆脱了内存间接,并从向量化中受益(不要忘记启用AVX,例如,-mavx)。
https://stackoverflow.com/questions/40593324
复制相似问题