首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Trilinos稀疏块矩阵异常内存消耗

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

Stack Overflow用户
提问于 2011-03-05 07:19:55
回答 1查看 313关注 0票数 1

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

我已经构建了一个简单的测试用例,用于构建一个Epetra::VbrMatrix,其中150万个双精度分组为500万个3双精度的块,大小约为115MB。

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

我问过trilinos用户的邮件列表,他们说内存使用率看起来太高了,但希望在这里能得到更多的帮助。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-01 01:37:02

Alan Williams的回答来自trilinos users列表,简而言之,VBRmatrix不适合这么小的块,因为存储开销大于数据本身:

与要存储的简单数量的双精度值相比,

VbrMatrix存储格式肯定会产生一些存储开销。

在您的程序中,您将存储5,000,000个X 1 X 3 == 1500万个双精度值。如果每双精度有8个字节,那么就是1.2亿字节。

矩阵类Epetra_VbrMatrix (它是Epetra_FEVbrMatrix的基类)在内部存储一个Epetra_CrsGraph对象,该对象表示稀疏结构。这要求每个block-row有两个整数,而每个block需要1个整数-非零。(您的案例有500万个块-行,每行有1个块-非零,因此总共至少有1500万个整数。)

此外,Epetra_VbrMatrix类为每个非零块存储一个Epetra_SerialDenseMatrix对象。这为每个非零块添加了两个整数,加上一个布尔值和一个指针。在您的例子中,由于块非零值很小(1x3双精度),这是一个很大的开销。块非零值越大,VbrMatrix格式的开销就越小。但在您的例子中,使用1x3的块,VbrMatrix占用的内存确实是1500万个双数据块所需内存的几倍。

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

https://stackoverflow.com/questions/5200357

复制
相关文章

相似问题

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