我正在使用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进程测试的不同阶段也编写了内存消耗。
如果有人有任何建议会非常有帮助。此外,如果您甚至可以构建,运行和报告内存消耗,那就太棒了。
答案 0 :(得分:2)
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万双打。