4

MPI を使用して Fortran コードを並列化しました。共有ポイントでは、MPI_Isend を使用して、モデル内のすべてのプロセスからすべてのデータをバッファーに送信します。次に、各プロセスは MPI_Recv を使用して必要なデータを収集します。MPI_Recv がブロックされているため、各プロセスが計算に進む前に必要なデータを取得していることがわかります。したがって、MPI_Isend が提供するリクエスト コードを無視しました。保持していない整数に設定しました。MPI_Wait を呼び出すことはありません。コードを実行すると、反復ごとにより多くのメモリを消費していることに気付きます。これは、MPI_Wait を呼び出していないためではないかと考えています。ドキュメントでは、MPI_Wait は次のように述べています。

この要求に関連付けられた通信オブジェクトが非ブロッキングの送信または受信呼び出しによって作成された場合、オブジェクトはMPI_WAIT の呼び出しによって割り当てが解除 され、要求ハンドルは MPI_REQUEST_NULL に設定されます。

これが、実行中に私のプログラムがより多くのメモリを消費する理由だと思いますか?

4

1 に答える 1

4

などのMPI_RequestMPI 通信関数に関連付けられたMPI_ISendにはメモリが割り当てられ、( とは対照的に) MPI を通じてクリーンアップする必要がありますdelete

メモリは、次の 3 つのいずれかが発生するまで返されません。

  • リクエストの完了などの待機MPI_Waitは、リクエストを解放します。
  • AnMPI_Testは成功を返し、それを解放します。
  • リクエストは を使用して解放されMPI_Request_freeます。

アクティブなリクエスト (つまり、MPI_Request送信が完了していないメッセージのリクエスト) を解放することは可能です。このリクエストは引き続き送信されますが、MPI_Requestテストや待機などの用途には無効になります。

于 2013-08-03T13:48:37.367 に答える