1

この質問が一般的または些細なことでしたらすみません。私は MPI にあまり詳しくないので、ご容赦ください。

ベクトルの行列があります。各ベクトルは空であるか、いくつかの項目が含まれています。

std::vector<someStruct*>  partitions[matrix_size][matrix_size];

プログラムを開始すると、各プロセスはこのマトリックスに同じデータを持ちますが、コードが進行するにつれて、各プロセスはいくつかのベクトルからいくつかのアイテムを削除し、それらを他のベクトルに配置する可能性があります。

そのため、障壁に到達したときは、各プロセスにこのマトリックスの最新バージョンがあることをどうにかして確認する必要があります。大きな問題は、各プロセスが一部またはすべてのベクトルを操作する可能性があることです。

すべてのプロセスがバリアの後に正しい更新されたマトリックスを持っていることを確認するにはどうすればよいですか?

編集:申し訳ありませんが、明確ではありませんでした。各プロセスは 1 つ以上のオブジェクトを別のベクトルに移動できますが、各オブジェクトを移動できるのは 1 つのプロセスだけです。言い換えれば、各プロセスには移動できるオブジェクトのリストがありますが、マトリックスは誰でも変更できます。そして、2 つのプロセスが同じオブジェクトを移動することはできません。

4

2 に答える 2

1

データを別の方法でレイアウトすることをお勧めします。

各プロセスには、オブジェクトのマップとマトリックス内の位置があります。それがどのように実装されるかは、オブジェクトを識別する方法によって異なります。すべてのローカル オブジェクトに番号が付けられている場合は、vector<pair<int,int>>.

それを、その構造を操作して通信する主要な構造として扱いますMPI_Allgather(各プロセスは他のすべてのプロセスにデータを送信し、最終的に全員がすべてのデータを取得します)。座標による高速検索が必要な場合は、キャッシュを構築できます。

それはうまくいくかもしれないし、うまくいかないかもしれません。他の最適化 (「トランザクション」の共有など) は、オブジェクトとオブジェクトに対して実行する操作に完全に依存します。

于 2013-03-05T13:44:24.927 に答える
1

その場合MPI_Bcast、他のプロセッサにこれを通知し、同じことを行うように指示することを使用してメッセージを送信する必要があります。または、バリアに到達するまで順序が問題にならない場合は、順列を実行するルート プロセスにのみメッセージを送信し、バリアが を使用して他のすべてのプロセスに送信した後にのみ送信できますMPI_Bcast

もう 1 つ: ポインタのベクトルは、メモリを手動で管理する必要があるため、通常は非常に悪い考えです。C++11 を使用できる場合は、代わりにstd::unique_ptrorを使用するかstd::shared_ptr(セマンティクスに応じて)、非常に類似した機能を提供する Boost を使用します。

そして最後に、行列を固定サイズの配列の固定サイズの配列として表現することは、非常に悪いことです。まず、行列のサイズが固定されています。2 つ目: 隣接する行が連続したメモリに格納されるとは限らないため、プログラムが非常に遅くなります (文字通り桁違いになる可能性があります)。代わりに、行列を size の線形配列として表し、Nrows*Ncols要素を次のようにインデックス付けしますNrows*i + j。ここで、 は行Nrows数、iおよびjはそれぞれ行インデックスと列インデックスです。代わりに列優先のストレージが必要ない場合は、要素をi + Ncols*j. このインデックス ジャグリングは、実質的にオーバーヘッドがゼロのインライン関数でラップできます。

于 2013-03-05T13:39:16.320 に答える