1

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

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

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

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

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

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

如果有人有任何真正有用的建议。此外,如果您甚至可以构建、运行和报告内存消耗,那就太好了。

4

1 回答 1

2

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

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

在您的程序中,您存储了 5,000,000 X 1 X 3 == 1500 万个双精度数。每个 double 有 8 个字节,即 1.2 亿字节。

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

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

于 2011-03-31T17:37:02.467 回答