Trilinos稀疏块矩阵异常内存消耗

时间:2011-03-04 23:19:55

标签: c++ parallel-processing mpi cluster-computing trilinos

我正在使用Trilinos构建基于分布式线性代数的应用程序,主要问题是内存消耗远高于预期。

我已经构建了一个简单的测试用例,用于构建一个包含150万个双倍的Epetra :: VbrMatrix,分为500万个3个双块,大约应该是115MB。

在2个处理器上构建矩阵后,每个半数据,每个处理器的内存消耗为500MB,大约是数据的7.5倍,对我来说看起来不合理,矩阵应该只有一些整数数组用于定位非零块。

我在trilinos用户邮件列表上询问过,他们说内存使用情况看起来太高,但希望能在这里获得更多帮助。

我在笔记本电脑上使用Ubuntu + gcc 4.4.5 + Trilinos 10.0进行了测试,在使用PGI编译器和Trilinos 10.4.0的集群上进行了测试,结果大致相同。

我的测试代码在gist https://gist.github.com/848310上,我在笔记本电脑的2个MPI进程测试的不同阶段也编写了内存消耗。

如果有人有任何建议会非常有帮助。此外,如果您甚至可以构建,运行和报告内存消耗,那就太棒了。

1 个答案:

答案 0 :(得分:2)

答案由Alan Williams组成的trilinos用户列表,简而言之,VBRmatrix不适合这样的小块,因为存储开销大于数据本身:

  

VbrMatrix存储格式   肯定会产生一些存储空间   与简单相比,开销   双精度值的数量   存储。

     

在你的程序中,你正在存储   5,000,000 X 1 X 3 == 1500万   双打。每双8个字节,即   是1.2亿字节。

     

矩阵类Epetra_VbrMatrix   (这是基类   Epetra_FEVbrMatrix)内部存储   一个Epetra_CrsGraph对象,它   代表稀疏结构。   这需要几个整数   块行,每个1个整数   块非零。 (你的案子有5个   百万块行与1   每行块非零,所以至少15   总计百万个整数。)

     

此外,还有Epetra_VbrMatrix   班级商店   Epetra_SerialDenseMatrix对象   每个块 - 非零。这增加了几个   整数,加上一个布尔和一个   指针,对于每个块非零。在   你的情况,因为你的块非零   很小(1x3双打),这是一个   大量开销。 VbrMatrix   格式按比例减少   开销越大你的   block-nonzeros是。但在你的情况下,   VbrMatrix是1x3块   确实占据了好几倍   内存比需要的内存   1500万双打。