プラズマシミュレーション研究室

MPIサブルーチン概要

ここで説明されているサブルーチンは例題で使用したものだけで,全てを網羅しているわけではありせん.MPIの詳細については,MPI標準の公式文書または各実装(MPICH, Open MPIなど)のマニュアルを参照してください.

mpi_get_address(location,address,ierr)
  • type(*), dimension(..), asynchronous :: location : データの位置
  • integer(kind=mpi_address_kind) intent(out) :: address : バイトアドレス
  • integer, optional, intent(out) :: ierr : エラーコード
locationのバイトアドレスを取得します.
mpi_bcast(buf,count,datatype,root,comm,ierr)
  • type(*), dimension(..) :: buf : 送受信されるデータの先頭位置
  • integer, intent(in) :: count : 送受信されるデータの数
  • type(mpi_datatype), intent(in) :: datatype : 送受信されるデータのデータ型
  • integer, intent(in) :: root : データを送信するプロセッサのランク
  • type(mpi_comm), intent(in) :: comm : コミュニケータ
  • integer, optional, intent(out) :: ierr : エラーコード
rootプロセッサがbufをコミュニケータで定義された全てのプロセッサに送信し,コミュニケータ内の他の全てのプロセッサはデータをbufに受け取ります.
mpi_comm_rank(comm,rank,ierr)
  • type(mpi_comm), intent(in) :: comm : コミュニケータ
  • integer, intent(out) :: rank : プロセッサランク
  • integer, optional, intent(out) :: ierr : エラーコード
コミュニケータに属するプロセッサランクを取得します.
mpi_comm_size(comm,size,ierr)
  • type(mpi_comm), intent(in) :: comm : コミュニケータ
  • integer, intent(out) :: size : プロセッサ数
  • integer, optional, intent(out) :: ierr : エラーコード
コミュニケータに属するプロセッサの数を取得します.
mpi_finalize(ierr)
  • integer, optional, intent(out) :: ierr : エラーコード
MPIを終了します.全てのMPIサブルーチンはこのサブルーチンの前でコールしなければなりません.
mpi_gather(sendbuf,sendcounts,sendtype,recvbuf,recvcounts,recvtype,root,comm,ierr)
  • type(*), dimension(..), intent(in) :: sendbuf : 各プロセッサから送信されるデータの位置
  • integer, intent(in) :: sendcounts : 各プロセッサから送信されるデータの数
  • type(mpi_datatype), intent(in) :: sendtype : 各プロセッサから送信されるデータのデータ型
  • type(*), dimension(..):: recvbuf : rootプロセッサが受信するデータの先頭位置
  • integer, intent(in) :: recvcounts : rootプロセッサが各プロセッサから受信するデータの数
  • type(mpi_datatype), intent(in) :: recvtype : rootプロセッサが受信するデータのデータ型
  • integer, intent(in) :: root : データを集めるプロセッサのランク
  • type(mpi_comm), intent(in) :: comm : コミュニケータ
  • integer, optional, intent(out) :: ierr : エラーコード
各プロセッサから送信されたデータをrootプロセッサに集めます.Ip番プロセッサから送信されたデータは,Ip-1番プロセッサからのデータが保存された位置の隣に保存されます.sendcounts/sendtyperecvcounts/recvtypeは全プロセッサで同じでなければなりません.
mpi_gatherv(sendbuf,sendcounts,sendtype,recvbuf,recvcounts,displs,recvtype,root,comm,ierr)
  • type(*), dimension(..), intent(in) :: sendbuf : 各プロセッサから送信されるデータの位置
  • integer, intent(in) :: sendcounts : 各プロセッサから送信されるデータの数
  • type(mpi_datatype), intent(in) :: sendtype : 各プロセッサから送信されるデータのデータ型
  • type(*), dimension(..) :: recvbuf : rootプロセッサが受信するデータの先頭位置
  • integer, intent(in) :: recvcounts(*) : rootプロセッサが各プロセッサから受信するデータの数をあらわす配列
  • integer, intent(in) :: displs(*) : rootプロセッサが各プロセッサから受信したデータの位置をあらわす配列
  • type(mpi_datatype), intent(in) :: recvtype : rootプロセッサが受信するデータのデータ型
  • integer, intent(in) :: root : データを集めるプロセッサのランク
  • type(mpi_comm), intent(in) :: comm : コミュニケータ
  • integer, optional, intent(out) :: ierr : エラーコード
Mpi_gathervは各プロセッサから異なるサイズのデータを送信できるようにmpi_gatherを機能拡張したものです.Displsrootプロセッサ上に集められたデータの位置を指定します.
mpi_init(ierr)
  • integer, optional, intent(out) :: ierr : エラーコード
MPIを初期化します.全てのMPIサブルーチンはこのサブルーチンの後でコールしなければなりません.
mpi_irecv(buf,count,datatype,source,tag,comm,request,ierr)
  • type(*), dimension(..), asynchronous :: buf : 受信するデータの先頭位置
  • integer, intent(in) :: count : 受信するデータの数
  • type(mpi_datatype), intent(in) :: datatype : 受信するデータのデータ型
  • integer, intent(in) :: source : データ送信元のプロセッサランク
  • integer, intent(in) :: tag : メッセージタグ
  • type(mpi_comm), intent(in) :: comm : コミュニケータ
  • type(mpi_request), intent(out) :: request : mpi_waitで使用するリクエストタグ
  • integer, optional, intent(out) :: ierr : エラーコード
非ブロッキング版mpi_recv
mpi_isend(buf,count,datatype,dest,tag,comm,request,ierr)
  • type(*), dimension(..), intent(in), asynchronous :: buf : 送信するデータの先頭位置
  • integer, intent(in) :: count : 送信するデータの数
  • type(mpi_datatype), intent(in) :: datatype : 送信するデータのデータ型
  • integer, intent(in) :: dest : データ送信先のプロセッサランク
  • integer, intent(in) :: tag : メッセージタグ
  • type(mpi_comm), intent(in) :: comm : コミュニケータ
  • type(mpi_request), intent(out) :: request : mpi_waitで使用するリクエストタグ
  • integer, optional, intent(out) :: ierr : エラーコード
非ブロッキング版mpi_send
mpi_recv(buf,count,datatype,source,tag,comm,status,ierr)
  • type(*), dimension(..) :: buf : 受信するデータの先頭位置
  • integer, intent(in) :: count : 受信するデータの数
  • type(mpi_datatype), intent(in) :: datatype : 受信するデータのデータ型
  • integer, intent(in) :: source : データ送信元のプロセッサのランク
  • integer, intent(in) :: tag : メッセージタグ
  • type(mpi_comm), intent(in) :: comm : コミュニケータ
  • type(mpi_status) :: status : 受信したデータの情報
  • integer, optional, intent(out) :: ierr : エラーコード
sourceプロセッサから送られたデータをbufに受信します.対応するmpi_sendmpi_recvと同じtagを持たなければなりません.Statusには,送信元のプロセッサランク,メッセージタグ,エラーコードなど,受信したデータの情報が記録されます.
mpi_reduce(sendbuf,recvbuf,count,datatype,operator,root,comm,ierr)
  • type(*), dimension(..), intent(in) :: sendbuf : 演算を施すデータ
  • type(*), dimension(..) :: recvbuf : 演算結果
  • integer, intent(in) :: count : sendbuf/recvbufの数
  • type(mpi_datatype), intent(in) :: datatype : sendbuf/recvbufのデータ型
  • type(mpi_op), intent(in) :: operator : リダクション演算
  • integer, intent(in) :: root : 結果を受信するプロセッサのランク
  • type(mpi_comm), intent(in) :: comm : コミュニケータ
  • integer, optional, intent(out) :: ierr : エラーコード
各プロセッサが保持するsendbufoperatorで定義された操作を作用させて結合し,rootプロセッサのrecvbufに値を返します.operatorにはMPIライブラリで定義されているリダクション演算(mpi_sum, mpi_maxmpi_minなど),またはユーザが定義した演算を与えます.
mpi_send(buf,count,datatype,dest,tag,comm,ierr)
  • type(*), dimension(..), intent(in) :: buf : 送信するデータの先頭位置
  • integer, intent(in) :: count : 送信するデータの数
  • type(mpi_datatype), intent(in) :: datatype : 送信するデータのデータ型
  • integer, intent(in) :: dest : データ送信先のプロセッサランク
  • integer, intent(in) :: tag : メッセージタグ
  • type(mpi_comm), intent(in) :: comm : コミュニケータ
  • integer, optional, intent(out) :: ierr : エラーコード
destプロセッサへbufを送信します.対応するmpi_recvmpi_sendと同じtagを持たなければなりません.
mpi_sendrecv(sendbuf,sendcount,sendtype,dest,sendtag,recvbuf,recvcount,recvtype,source,recvtag,comm,status,ierr)
  • type(*), dimension(..), intent(in) :: sendbuf : 送信するデータの先頭位置
  • integer, intent(in) :: sendcount : 送信するデータの数
  • type(mpi_datatype), intent(in) :: sendtype : 送信するデータのデータ型
  • integer, intent(in) :: dest : データ送信先のプロセッサランク
  • integer, intent(in) :: sendtag : メッセージタグ
  • type(*), dimension(..) :: recvbuf : 受信するデータの先頭位置
  • integer, intent(in) :: recvcount : 受信するデータの数
  • type(mpi_datatype), intent(in) :: recvtype : 受信するデータのデータ型
  • integer, intent(in) :: source : データ送信元のプロセッサランク
  • integer, intent(in) :: recvtag : メッセージタグ
  • type(mpi_comm), intent(in) :: comm : コミュニケータ
  • type(mpi_status) :: status : 受信したデータの情報
  • integer, optional, intent(out) :: ierr : エラーコード
mpi_sendmpi_recvの組合せです.
mpi_type_commit(newtype,ierr)
  • type(mpi_datatype), intent(in) :: newtype : 通知される派生型
  • integer, optional, intent(out) :: ierr : エラーコード
newtypeをMPIに通知します.通知後に新しい派生型newtypeが使用可能になります.
mpi_type_create_struct(count,sizes,displacements,types,newtype,ierr)
  • integer, intent(in) :: count : 新しい派生型の要素数
  • integer, intent(in) :: sizes(count) : 新しい派生型の各要素の数
  • integer(kind=mpi_address_kind), intent(in) :: displacements(count) : 新しい派生型の各要素の先頭位置からの変位
  • type(mpi_datatype), intent(in) :: types(count) : 新しい派生型の各要素のデータ型
  • type(mpi_datatype), intent(out) :: newtype : 新しい派生型
  • integer, optional, intent(out) :: ierr : エラーコード
countsizesdisplacementstypesで定義されたデータグループを与える派生型を構築します.
mpi_wait(request,status,ierr)
  • type(mpi_requet), intent(inout) :: request : リクエストタグ
  • type(mpi_status) :: status : 完了した操作に関する情報
  • integer, optional, intent(out) :: ierr : エラーコード
同じリクエストタグを持つ対応する非ブロッキングサブルーチンが終了するのを待ちます.