Skip to content
oraccha edited this page Jan 14, 2013 · 1 revision

MPI CHameleon?

おそらく MPI で一番ポピュラなオープンソース実装.

  • [http://www-unix.mcs.anl.gov/mpi/mpich/ 本家] (ANL) . MPICH2は,MPI2 にも対応している新しい実装. Intel,IBM (BlueGene/L)、Microsoft の MPI も MPICH2 がベースになっているらしい.

    • [http://www-unix.mcs.anl.gov/mpi/mpich1/ MPICH1]
    • ROMIO: A High-Performance, Portable MPI-IO Implementation
  • [http://www3.niu.edu/mpi/ MPICH-G2] . Globus 対応版.GSI によるセキュリティ対応.

    • クラスタ内はベンダ MPI,外部接続は TCP/IP (Globus I/O) を使うようになっている?
  • [http://www.lri.fr/~gk/MPICH-V/ MPICH-V] (INRIA) . Volatile resources の "V" らしい.

    • V1(Remote pessimistic log protocol designed for Desktop Grids),V2(Sender-based pessimistic log protocol designed for large clusters),V3(Global checkpointing protocol designed for High performance network clusters),V/CL(Hierarchical logging protocol designed for Grids) ってのがある.
    • フォールトトレラントが目的で,ロギングやチェックポイント機能を提供する.MPICH ベースの実装で,MPI アプリケーションの修正は不要.
  • MPICH-GQ . MPICH-G2 + [http://www-fp.mcs.anl.gov/qos/ GARA] (General-purpose Architecture for Reservation and Allocation) QoS フレームワーク

    • MPI レベルで QoS 情報をやりとりするために,attribute (MPI_Attr_get/put) を利用.帯域予約は GARA で(DiffServe が前提?).トラヒックシェーピングは Globus I/O のレベルで実現.
  • [http://nowlab.cis.ohio-state.edu/projects/mpi-iba/ MVAPICH] (Ohio State Univ.) . MPI over InfiniBand Project.

  • ./MX

  • ./インストール

  • TCP/チューニング/MPICH

    • クラスタで実行するときは,-nolocal オプションを必ずつける.
  • ./プロトコル


=== MPICH アーキテクチャ ===

  • MPI collective プリミティブ
    • MPI_BCAST/MPI_REDUCE,...
    • src/coll
  • MPI Point-to-Point プリミティブ
    • MPI_SEND/MPI_RECEIVE,...
    • src/pt2pt
  • ADI(Abstract Device Interface) レイヤ
    • mpid
  • デバイスレイヤ
    • Chameleon interface(チャネルインタフェース) . さまざまなデバイスに対応するためのポータビリティレイヤ.
      • mpid/ch2
    • P4(Portable Programs for Parallel Processor) デバイス . TCP(ノード間通信),shmem(ノード内通信)用のデバイス.
      • mpid/ch_p4
      • mpid/ch2 へのシンボリックリンク + ソケットに対するラッパー.
    • Madeleine

=== MPID の実装 === ./プロトコルの抽象化. struct MPID_Protocol

  • send
  • recv
  • isend
  • wait_send
  • push_send
  • cancel_send
  • irecv
  • wait_recv
  • push_recv
  • cancel_recv
  • unex
  • do_ack
  • delete

デバイスの抽象化.short,long,vlong ごとにプロトコルを設定する. struct MPID_Device

  • short_msg
  • long_msg
  • vlong_msg
  • check_device
  • terminate
  • abort

=== ch_p4 の実装 === ==== 初期化処理 ==== {{{ MPID_Init -> MPID_CH_IntMsgPass -> MPID_P4_Init (PIiInit) -> P4_initenv -> process_args -> P4_socket_control (ソケットバッファの設定) -> MPID_Process_Args (ん,-mpipktsize はちゃんと動かないのでは?) }}}

==== システムコール呼出し ====

  • O_NONBLOCK 使う

    • 例えば write(2) はソケットバッファが足りなくなると,EAGAIN(EWOULDBLOCK) を返すので,select で待って,再度 write する.
    • non blocking と blocking でのシステムコール発行数の違い.メッセージサイズ 10MB で 30 秒+α間 MPI_Send/Recv したときの送信側(ソケットバッファは 2MB). {{{ non blocking blocking writev 696 19 write 9,167 704 select 408 36 }}}
  • TCP_NODELAY,SO_RCVBUF,SO_SNDBUF

  • システムコールのラッピング (SYSCALL_P4)

    • p4_sock_util.c(ソケット関連)
    • write fds に対する select がラッピングされてないのはなぜ? p4_sockets_ready(p4_sock_sr.c)
  • net_conn_to_listner

    • socket(2),connect(2)
  • net_accept

    • accept(2)
  • net_send

    • write(2)

==== MPI_Send ==== MPI_Send/Recv のコールフローを追ってみる.

{{{ MPI_Send (src/pt2pt/send.c) -> MPID_SendDatatype (mpid/ch2/adi2hsend.c) -> MPID_SendContig (mpid/ch2/adi2send.c) メッセージサイズでプロトコルを選択し,プロトコルごとの送信関数を実行する. デフォルトはブロッキングらしい.dev->[short|long|vlong]_msg->send. -> MPID_CH_Eagerb_send (mpid/ch2/chbeager.c) -> MPID_SendControl -> MPID_SendChannel (mpid/ch2/channel.h) -> PIbsend (mpid/ch_p4/chdef.h) -> p4_sendx (mpid/ch_p4/p4/lib/p4_sr.h) -> send_message (mpid/ch_p4/p4/lib/p4_tsr.c) ソケット通信の場合は,コネクションを確立してから(establish_connection), socket_send を呼び出す. -> socket_send (mpid/ch_p4/p4/lib/p4_sock_sr.c) -> net_send2 (mpid/ch_p4/p4/lib/p4_sock_utils.c) writev が使える場合は,ヘッダとデータを iov にセットし, writev する.全データが送れない場合,writev が使えない場合は net_send を呼び出す. -> net_send -> wait_for_ack ACK メッセージが届くのを待つ. -> MPID_CH_Eagerb_send_short (mpid/ch2/chshort.c) -> MPID_CH_Eagern_send (mpid/ch2/chneager.c) -> MPID_CH_Rnvdb_send (mpid/ch2/chbrnvd.c) -> MPID_CH_Rnvdn_send (mpid/ch2/chnrnvd.c) }}}

==== MPI_Recv ==== {{{ MPI_Recv (src/pt2pt/recv.c) -> MPID_RecvDatatype (mpid/ch2/adi2hrecv.c) -> MPID_IrecvDatatype (mpid/ch2/adi2hrecv.c) -> MPID_IrecvContig (mpid/ch2/adi2send.c) -> MPID_RecvComplete dev->check_device によりメッセージ到着をチェックする. -> MPID_CH_Check_incoming (mpid/ch2/chchkdev.c) メッセージサイズごとの受信関数を呼び出す. dev->[short|long|vlong]_msg->recv. -> MPID_CH_Eagerb_recv (mpid/ch2/chbeager.c) -> MPID_RecvFromChannel (mpid/ch2/channel.h) -> PIbrecv (mpid/ch_p4/chdef.h) p4_recv で受信し,受信パケットのデータをユーザバッファにコピー, 最後に 受信パケットを解放する. -> p4_recv (mpid/ch_p4/p4/lib/p4_tsr.c) -> recv_message (mpid/ch_p4/p4/lib/p4_tsr.c) -> socket_recv (mpid/ch_p4/p4/lib/p4_sock_sr.c) -> socket_recv_on_fd . まずヘッダだけを受信し,メッセージ分のバッファを確保する. そして,用意したバッファにデータを受信する. -> net_recv (mpid/ch_p4/p4/lib/p4_sock_util.c) read(2). }}}

Clone this wiki locally