首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免在带特征的稀疏表达式中分配内存

如何避免在带特征的稀疏表达式中分配内存
EN

Stack Overflow用户
提问于 2016-11-14 16:22:33
回答 1查看 504关注 0票数 2

我有一个应用程序,稀疏模式是常量的。让我们说,我的计算是在形式。

代码语言:javascript
复制
sm3 = sm1 + sm2

但是,即使在所有这些操作数中,我也将稀疏模式设置为相同的模式,我的分析器显示,大部分时间用于分配和释放结果矩阵。

这是我的MWE:

代码语言:javascript
复制
#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;
}

能否避免那些分配操作的人?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-15 20:34:43

目前不可能这样做,因为默认情况下,稀疏矩阵被假定为别名。例如,如果您这样做:

代码语言:javascript
复制
m3 = m3 + m1;

由于m1的模式没有完全包含在m3中,那么在m3中直接计算表达式是不可能的。在未来的中,我们可以强制使用目标内存,语法如下:

代码语言:javascript
复制
m3.noalias() = m1 + m2;

同时,由于您的矩阵很小,您可以通过添加一些显式零来执行m1m2的模式与m3模式相同的操作,从而获得更高的性能。然后,使用本征3.3,您可以将稀疏加法转换为密集向量的加法:

代码语言:javascript
复制
m3.coeffs() = m1.coeffs() + m2.coeffs();

即使m1m2之间的交点很小,您也会得到非常高的速度(可能是一个数量级),因为您摆脱了内存间接,并从向量化中受益(不要忘记启用AVX,例如,-mavx)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40593324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档