1

MPI をインポートする mpi4py を使用して Python コードを作成しています。次に、グローバル コミュニケーター MPI.COMM_WORLD をセットアップし、変数 comm に格納します。

このコードを n > 1 のスレッドで実行していますが、ある時点ですべてのスレッドが for ループに入ります (すべてのコアで反復回数が同じになります)。

for ループ内には、「comm.reduce(...)」呼び出しがあります。これはコアの数が少ない場合は機能するようですが、問題のサイズが大きくなると (たとえば 64 コアの場合)、プログラムが「ハング」することがあります。

これが reduce(...) 呼び出しと関係があるかどうか疑問に思っています。この呼び出しにはすべてのスレッドが必要であることはわかっています (つまり、合計で 2 つのスレッドを実行するとします。1 つのスレッドがループに入り、もう 1 つのスレッドが何らかの理由でループに入らない場合、reduce(...) 呼び出しが待機するため、プログラムはハングします。両方のスレッドに対して)。

私の質問は次のとおり です。reduce 呼び出しは「同期」タスクですか、つまり、「comm.Barrier()」呼び出しのように機能しますか? また、可能であれば、より一般的に、同期タスクは何ですか (バリア以外にある場合)?

4

1 に答える 1

3

はい、標準の MPI reduce 呼び出しがブロックされています (すべてのスレッドが処理を続行するには、すべてのスレッドが root と通信する必要があります)。その他のブロッキング呼び出しには、Allgather、Allreduce、AlltoAll、Barrier、Bsend、Gather、Recv、Reduce、Scatter などがあります。

これらの多くには、I (Isend など) が前に付いているノンブロッキングの同等のものがありますが、mpi4py では全面的に実装されていません。

詳細については、 mpi: ブロッキングと非ブロッキングを参照してください。

ハングアップについてよくわかりません。プロセッサの混雑の問題である可能性があります。4 コアのデスクトップで 64 スレッドのジョブを実行すると、うるさくなることがあります。

于 2014-12-16T18:36:51.817 に答える