0

行列はプロセッサ 0 で作成され、他のプロセッサに分散されます。行列は対称密行列です。そのため、プロセッサ 0 で初期化されます。

マトリックスは次のように作成されます。

A=malloc(sizeof(double)*N*N);
for (i=0; i<N; i++)
    for(j=0; j<N; j++)
     A(i,j)=rand()%10; // The code will be changed.

A(i,j) は次のように定義されます。

#define A(i,j) A[i*N+j]

アルゴリズムをテストするには、N を 100,000 にする必要があります。

ここでの問題は、N=100,000 の場合、必要なメモリが約 76GB になることです。Aマトリックスを保存するために何を提案しますか?

PS: N<20.000 で、クラスタが乱れたメモリ システム (プロセッサあたり 2GB RAM) の場合、アルゴリズムは非常にうまく機能します。

4

3 に答える 3

2

十分な仮想アドレス空間(実際には64ビットシステムを意味します)を備えたPOSIXシステムでプログラミングしている場合は、を使用できますmmap()

必要なサイズの匿名マッピングを作成するか(これはスワップバックされます。つまり、少なくとも76GBのスワップが必要になります)、必要なサイズの実ファイルを作成してマップします。

ファイルに裏打ちされたソリューションには、クラスターに共有ファイルシステムがある場合、マトリックスを各プロセッサーに明示的に転送する必要がないという利点があります。マトリックスをmsync()作成した後で単純に転送し、各プロセッサーに適切な領域をマップできます。

于 2011-05-01T22:41:25.037 に答える
2

コメントに記載されているように、スケーリングテストを行うためにこれを行っている場合、Oli Charlesworth は完全に正しいです。ノードには使用する76GBがないため、何をしても、これはリンゴとオレンジの比較になります。どちらでも構いません。MPI を使用する大きな理由の 1 つは、1 つのノードに収まらない問題に取り組むことです。しかし、76 GB のデータを 1 つのプロセッサに押し込もうとすると、行っている比較は意味をなしません。Oli Charlesworth と caf の両方が述べたように、さまざまな方法で RAM の代わりにディスクを使用できますが、1 プロセッサの答えは、多数のノードから得られる RAM に収まる数値と直接比較することはできません。つまり、実際には何の意味もない数字を取得するために多くの作業を行うことになります。

この種の問題でスケーリング結果が必要な場合は、問題適合する最小数のノードから開始し、プロセッサ数を増やしてデータを取得するか、強力なスケーリングテストではなく弱いスケーリングを実行します。合計作業量を一定にするのではなく、プロセッサ数をスケールアップしながらプロセッサあたりの作業量を一定に保ちます。

ちなみに、どのように測定を行っても、Oli Charlesworth が示唆するように、ランク 0 で行列の生成を実行してから、次の処理を行うことでシリアル ボトルネックが発生するのではなく、各プロセッサに独自のデータを生成させると、より良い結果が得られます。すべてのプロセッサが部品を受け取ります。

于 2011-05-02T01:59:41.807 に答える
1

C++ に切り替えることができる場合は、巨大なデータセット用に特別に設計された STL 実装であり、透過的なディスク バックアップ サポートなどを備えたSTXXLを調べることができます。

于 2011-05-01T21:31:56.173 に答える