申し訳ありませんが、ソースコードを投稿できません...
GS ソルバーのマスター/スレーブ赤黒アルゴリズムを実行するコードがあります。単純なケースでは、行列は 4 つの均等なサイズの計算ピースに分割されます。画像 1 ~ 3 は計算の一部を実行し、結果を含むバッファーを画像 0 に送り返します。問題は次のとおりです。
個々の結果を単一のグリッドにマップできるように、すべてのピースを保持するのに十分な大きさの配列を malloc しました。問題は、イメージ 0 で、MPI_Recv 呼び出しの後、そのプロセスがグリッドが全体を保持するために malloc されたことを認識していないことです。そのグリッドに何かを配置しようとすると、エラーが発生します。私が見つけた唯一の回避策は、すべてのプロセスで malloc を実行し、MPI_Recv の直前のプロセス 0 に対しても malloc を実行することです。
以前に割り当てられたメモリへの参照が失われているように見える理由はありますか?
擬似コード:
Malloc whole[][] Have to have this allocated
Malloc partial[]
Perform compute on whole[]
If(image!= 0) MPI_Send(whole[])
Else (if image==0)
Malloc whole[][] again! and this allocated otherwise the problem happens
Loop over other images
MPI_Recv(partial)
Put partial[] into whole[][] Here is where the problem occurs
Endif
事前に助けてくれてありがとう