MPIの片方向通信(one-sided communications)とか少し眺めてた

MPIの1対1通信では送受信にMPI用に確保されたメモリ領域を介して通信が行われるようで、一度のデータの送受信につき4回のデータのコピーが発生するらしい

  1. (send側)プログラム用に確保されたメモリ上のbufferにコピー
  2. (send側)MPI用に確保されたメモリ上のどこかにコピー
  3. (send-recv)MPI用に確保されたメモリ上でsend側からrecv側に対してデータのコピーを行う
  4. (recv側)MPI用に確保されたメモリからプログラム用に確保されたメモリ上のbufferにコピー

それに対してMPIの片方向通信はデータの送受信の際にMPI用に確保されたメモリ領域を経由する必要がないみたいで、MPI_Put、MPI_Getを使うと内部でデータのコピーが4回必要だったことが1回で済む。

コピー回数が減るとそれだけで高速化が期待できるから、使えるところがあればどんどん使っていきたい。

ほかのノード(PC)のメモリを(あたかも)直接触れるように見せかける技術はRMA(リモートメモリアクセス)というらしく、MPIであるにもかかわらずメモリ共有しているっぽくデータの操作が可能になる。デメリットとしては共有メモリっぽく扱うということは、スレッド並列型の並列計算と同じようにほかのプロセスとのデータレース(複数のプロセス/スレッドが一つのデータに対して読み書きすることでデータが壊れるやつ)を起こす可能性も高まる気がする。Sendrecvはそのあたりのミスは起きにくい(その前にデッドロックとかする)。

使いどころとしては一部のプロセスが異なる動作をするコードなんかに使うといいんじゃないでしょうか。空間的に非周期的な境界条件をもつシミュレーションとか相性いい気がします。

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to top