1

Trilinosを使用して分散線形代数に基づくアプリケーションを構築しています。主な問題は、メモリ消費量が予想よりもはるかに多いことです。

Epetra :: VbrMatrixを構築するための簡単なテストケースを作成しました。150万のdoubleが、3つのdoubleの500万ブロックとしてグループ化されています。これは約115MBです。

それぞれ半分のデータの2つのプロセッサでマトリックスを構築した後、各プロセッサで500MBのメモリ消費が発生します。これは、データの約7.5倍です。私には不合理に見えます。マトリックスには、ゼロ以外のブロックを見つけるための整数配列が必要です。 。

私はtrilinos-usersメーリングリストで尋ねました、彼らはメモリ使用量が高すぎるように見えると言います、しかしここでもう少し助けが欲しいです。

Ubuntu + gcc 4.4.5 + Trilinos 10.0を搭載したラップトップと、PGIコンパイラとTrilinos 10.4.0を搭載したクラスタの両方でテストしたところ、結果はほぼ同じです。

私のテストコードは要点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億2000万バイトです。

マトリックスクラスEpetra_VbrMatrix(Epetra_FEVbrMatrixの基本クラス)は、スパース構造を表すEpetra_CrsGraphオブジェクトを内部に格納します。これには、ブロック行ごとに2つの整数、およびブロックごとに1つの整数(ゼロ以外)が必要です。(あなたのケースには500万のブロック行があり、1行に1つのブロックがゼロではないため、合計で少なくとも1,500万の整数があります。)

さらに、Epetra_VbrMatrixクラスは、ブロックごとにEpetra_SerialDenseMatrixオブジェクトを格納します(ゼロ以外)。これにより、ブロックごとに2つの整数に加えて、ブール値とポインターが追加されます(ゼロ以外)。あなたの場合、ブロック非ゼロは小さい(1x3ダブル)ので、これはかなりのオーバーヘッドです。VbrMatrix形式では、ブロックが大きいほどオーバーヘッドが比例して少なくなります。ゼロ以外の値です。しかし、あなたの場合、1x3ブロックでは、VbrMatrixは実際に1500万のdoubleに必要な数倍のメモリを占有しています。

于 2011-03-31T17:37:02.467 に答える