私はかなりのMPIプログラミングを行っていますが、プロセス間で複雑な状態(あなたが説明しているように)を渡す典型的な方法を知りません。これが私があなたの問題についてどのように考えてきたかです、それはおそらくあなた自身の考えと一致します...
複雑なオブジェクトグラフは、メモリ内で、データのブロックと他のデータのブロックへのポインタによって表されていると思います。これは、グラフの通常の実装です。これらのCOGの1つを(省略形を作成するために)あるプロセスのアドレス空間から別のプロセスのアドレス空間に移動するにはどうすればよいでしょうか。ポインタがメモリアドレスである限り、あるアドレス空間のポインタは別のアドレス空間では役に立たないので、トランスポートのために中立的な形式に変換する必要があります(私は思いますか?)。
したがって、COGを送信するには、受信プロセスがローカルメモリアドレスを指すポインタを使用して、グラフのローカルバージョンを独自のアドレス空間に構築できる形式にする必要があります。これらのCOGをファイルに書き込んだことはありますか?もしそうなら、あなたはすでにそれを輸送することができるフォームを持っています。私はそれを提案するのは嫌ですが、プロセス間で通信するためにファイルを使用することもできます-そしてそれはDとMPIの組み合わせよりも扱いやすいかもしれません。あなたの選択 !
COGのファイル形式がない場合、隣接行列またはリストとして簡単に表すことができますか?言い換えれば、輸送のためのあなた自身の表現を考え出しますか?
ポインタベースから配列やレコードなどのより静的な構造に変換せずにプロセス間でCOGを渡すことができれば、私は非常に驚きます(ただし、学ぶことは喜ばしいことです)。
OPの編集に応じて編集します。MPIは、複雑な状態がポインターではなく値として表される場合、複雑な状態を渡す簡単な方法を提供します。組み込みまたはカスタマイズされたMPIデータ型のいずれかで複雑な状態を渡すことができます。他の答えの1つが示すように、これらは柔軟で有能です。プログラムが複雑な状態をMPIカスタムデータ型が処理できる形式で保持しない場合は、メッセージに適した表現にパック/アンパックする関数を作成する必要があります。それができれば、メッセージ呼び出しは(ほとんどの目的で)関数呼び出しのように見えます。
複雑な状態と並列処理の粗さを取り巻く問題については、私があなたを完全にフォローしているかどうかはわかりません。単一のプロセッサから十分なパフォーマンスを得ることができないため、通常、MPIプログラミングに頼ります(必要に応じて、この抜本的な一般化に参加してください)。待機によって遅延する計算に関してペナルティを支払うことはわかっています。通信については、そのペナルティを最小限に抑えるように努めていますが、最終的には、並列化のコストとしてペナルティを受け入れます。確かに、一部のジョブは小さすぎたり短すぎたりして並列化のメリットを享受できませんが、私たち(つまり並列計算担当者)が行うことの多くは、並列化を回避するには大きすぎて実行時間が長すぎます