我正在使用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进程测试了不同阶段的内存消耗。
如果有人有任何建议,那将是非常有帮助的。此外,如果您甚至可以构建、运行和报告内存消耗,那就太好了。
发布于 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万个双数据块所需内存的几倍。
https://stackoverflow.com/questions/5200357
复制相似问题