2017-01-25 7 views
0

私は2つのプロセスp0とp1を持っています。 プロセスの1つは、アレイ上のものです(私はどのプロセスがわかりません)。残念ながら、他のプロセスは(更新配列上で)何かをする必要があります。例:MPIプロセス間で配列を更新

  • P1
  • p1は、アレイ
  • POを「送信」アレイ上のものを行い アレイ上で作業する必要がある - >更新配列を「読み」
  • P1は上で動作する必要があります配列 - > 更新配列を "読み取る"

...などとなります。 私はMPIを使用する必要があるように見える BSENDしかし、MPI SENDRECVもあることがわかりました。 MPI BSENDを使用している場合、何かがバッファに入れられたかどうかをプロセスはどのように知っていますか?

おかげ

答えて

0

だから、あなたが言うあなたがP1上に存在するいくつかの配列を持っていること、です。これが最初のステップで計算された後、P0とP1は両方とも第1ステップで計算されたアレイとは独立して動作する必要があります。

実際これは十分な情報ではありません。

  • 第1ステップのAの計算が小さい場合(通信量よりも小さい場合)、またはP1がAを計算しているときにP0がビジーでない場合、両方のプロセッサでAを計算できます。
  • 第2ステップでの計算は、データを別のプロセッサに送信するのに十分なほど大きくする必要があります。
  • P0とP1の両方の計算がほぼ同じサイズの場合、MPI_Send(ブロッキング)を使うことができます。
  • 本当に必要な部分だけを手動でコピーし、非推奨のMPI_Bsendに対して非同期MPI呼び出し(Isend/Irecv)を使用することをお勧めします。
  • 理由があるのであれば、Bsend、Ssendなどの亜種のみを使用してください。それは実装とネットワークのどちらが最も良いかに大きく依存します。非同期MPIを使用できるかどうかのみを判断する必要があります。もし本当に必要なのであれば、他のMPI呼び出しについて考えるだけです。

しかし、この問題に対してMPI_Sendrecvを使用するのはどのような点でしょうか?これは、p0が何かをp1に鳴らし、同じポイントp1がp0に何かを送るときに便利です。しかしこれはあなたが記述したものではありませんので、間違った関数であることを確かめているので、MPI_Sendで始めることをお勧めします。