-
Notifications
You must be signed in to change notification settings - Fork 0
MPICH
MPI CHameleon?
-
[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.
-
- クラスタで実行するときは,-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
- Chameleon interface(チャネルインタフェース) .
さまざまなデバイスに対応するためのポータビリティレイヤ.
=== 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). }}}