Contents
 MPI概要

 MPI-IO

 MPIの歴史

 HPCにおけるIOアーキテクチャ

 MPIライブラリの系譜

 アプリの状況

 1対1通信3.3. MPI
3.3.1. MPIの基本的通信と入出力

 Data Model (HDF5, NetCDF)

 ブロッキング通信とノンブロッキング通信

 MPI-IO規格

 デッドロック ROMIO

 4つの通信モード

 ストライド転送

 1対1通信プロトコル 集団通信関数
 集団通信とは 集団通信の機能 実装アルゴリズムの例

富士通株式会社

志田 直之• Allgather• Alltoall

1

MPIの歴史

MPI概要

1992/04

MPI Forum設立

1994/10

MPI forumよりMPI-1.0がリリースされる。
MPIライブラリの基本的な128関数をサポート。

1995/07

MPI forumよりMPI-1.1がリリースされる。

1995/07

MPI forumよりMPI-2.0(MPI-1.2を含む)がリリースされる。
MPI-IO・動的プロセス生成・片側通信・ Fortran/C++対応などが追加。
MPI-1.2の分類
1対1通信• MPIの歴史• MPIライブラリの系譜

2008/09

MPI forumよりMPI-2.1がリリースされる。
MPI-2.0の曖昧だった規格を修正する

集団通信
派生データ型
コミュニケータ
プロセス・トポロジー
環境管理

現在、MPI-2.2, MPI-3.0が検討されている。
MPI-2.2: MPI-2.0に若干の仕様追加を行う。
MPI-3.0: 将来のMPIに向けて、大きな仕様変更を予定。
2

3

39
16
13
30
16
14

MPIライブラリの系譜
MPICH

LA MPILAM MPI

Argonne National Lab.

Parallelnavi

YAMPII

Los Alamos
National Lab.

Indiana Univ.

Univ. of Tokyo

HP MPI

FUJITSUHP

MVAPICH

Ohio State Univ.

1対1通信

GridMPIMPICH-MX

NAREGI Project

Myricom

MPICH2

Open MPI

Argonne National Lab.

Open MPI Project

MVAPICH2• ブロッキング通信とノンブロッキング通信• デッドロック• 4つの通信モード• 1対1通信プロトコル

MPICH2-MX

Ohio State Univ.

Myricom

MPI over BG/L

Sun Cluster Tools

IBM

Sun Microsystems

MPICH2 over Cray
Cray

非商用

Intel® MPI Library
Intel

進化
派生

系列

Windows Compute
Cluster Server

商用

Microsoft

2009年10月現在
4

5

1対1通信とは1対1通信の種類

 1対1通信とは、送信と受信が一対となり、通信を行います。

 1対1通信のAPI
ブロッキング

test.c$ mpicc test.c$ mpiexec -n 2 -hostfile mpd.hosts ./a.out#include "mpi.h"main(int argc, char *argv[]){
int size, rank;
double d[10], e[10];MPI_Status status;

0

MPI_Init(&argc, &argv);

1

MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

送信
標準モード

MPI_Send

バッファモード

MPI_Bsend

同期モード

MPI_Ssend

レディモードMPI_Rsend

送受信
MPI_Init

switch(rank){case(0):MPI_Send(d, 10, MPI_DOUBLE, 1,
1000, MPI_COMM_WORLD); //to 1
break;case(1):
MPI_Recv(e, 10, MPI_DOUBLE, 0,
1000, MPI_COMM_WORLD, &status); // from 0
break;MPI_Send

MPI_Init

MPI_Finalize

MPI_Recv
MPI_Finalize}
MPI_Finalize();

送信受信

MPI_Isend
MPI_Recv

MPI_Ibsend
MPI_Issend

MPI_Irecv

MPI_Irsend

MPI_Sendrecv
MPI_Sendrecv_replace ブロッキング

d[]
e[]

終了

}

ノンブロッキング
受信• 送信側=送信バッファを解放しても良いタイミング• 受信側=受信バッファを解放しても良いタイミングになるまで、送信関数・受信関数から復帰しません。すなわち、送信の場合はインタコネクト
上にデータがすべて乗った状態、受信の場合はインタコネクトからデータをすべて受け取ったデータが実メモリに書き込まれたことが保証されます。
 ノンブロッキング• 送信処理・受信処理を開始する宣言のみで、送信関数・受信関数から復帰します。実際のデータの同期は、MPI_Test関数やMPI_Wait関数などを利用して、ユーザー自身が保証する必要があります。
6

7

ブロッキング通信

ノンブロッキング通信

send

P0

send側のメモリ空間

MPI_Send

send
bufferA
copy

receive

send

P0

recv側のメモリ空間

send側のメモリ空間

MPI_Isend

P1

send
bufferA

MPI_Recv

copyA
メッセージの送信

送信完了(バッファ解放可能)End

MPI_Irecv

A
End

send

recv
buffer

送信完了(バッファ解放可能)A

MPI_Wait
copy

A

MPI_Wait

copy

End

A

受信完了

End

ブロッキング通信の特徴

A

受信完了

End

ノンブロッキング通信の特徴• 通信処理が終了するまで送受信関数から復帰しない。
• 送受信の対応が簡単になるので、プログラムがわかりやすくなる。
• プログラムの設計次第で、デッドロックの危険性が常にある。

• 通信処理が完了する前に、送受信関数から復帰できるた
め、通信と計算処理をオーバーラップできる可能性がある。
• ユーザー責任で、ノンブロッキング通信の完了を確認する必要がある。

8

9

デッドロック

4つの送信モード(1/4)

 送受信処理が待ち状態のため、完了できない状態

 標準モード デッドロックするプログラムは?
switch(RANK){case 0:MPI_Send(To=1,TAG=100);
MPI_Recv(To=1,TAG=101);
break;
case 1:
MPI_Send(To=0,TAG=101);
MPI_Recv(To=0,TAG=100);
break;}

recv側のメモリ空間

End

メッセージの送信

recv
buffersend

receiveP1 対応する受信の順番に関わらず、送信処理を開始することができる。

switch(RANK){case 0:
MPI_Isend(To=1,TAG=100);
MPI_Wait();MPI_Recv(To=1,TAG=101);
break;
case 1:
MPI_Isend(To=0,TAG=101);
MPI_Wait();MPI_Recv(To=0,TAG=100);
break;}

switch(RANK){case 0:
MPI_Isend(To=1,TAG=100);
MPI_Recv(To=1,TAG=101);
MPI_Wait();break;
case 1:
MPI_Isend(To=0,TAG=101);
MPI_Recv(To=0,TAG=100);
MPI_Wait();break;
}

P0

P1

P0

P1

P0

P1

MPI_Send

MPI_Send

MPI_Isend

MPI_Isend

MPI_Isend

MPI_Isend

MPI_Wait 送信するメッセージがバッファリングされるかどうかは、処理系依存となる。
 送信バッファが再利用可能になった場合に、送信処理を完了することができる。

• メッセージが受信側でバッファリングされる場合対応する受信関数が発行される前に、送信関数を復帰することができる。
• メッセージが受信側でバッファリングされない場合対応する受信関数が発行されると、送信関数を復帰することができる。
(1) 送信側が先に発行された場合
OK

P0

buf

S

MPI_Wait
MPI_Recv
MPI_Wait

MPI_Recv
MPI_Wait

送信バッファ解放OK(2) 受信側が先に発行された場合
P1

×デッドロック

×デッドロック(rendezvous<後述>のときのみ)
10

P1
S

send

buf

buf

E

S

send

S

送信バッファ解放OK

E(rendezvous<後述>のときのみ)

P0

OK

○ OK

buf

E

E

11

send
recv

4つの送信モード(2/4)

4つの送信モード(3/4)

 バッファモード

 同期モード 対応する受信の順番に関わらず、送信処理を開始することができる。

 対応する受信の順番に関わらず、送信処理を開始することができる。

 送信するメッセージは、受信側にバッファリングされる。受信側のバッファアロケーション

 送信処理は、対応する受信が発行され、さらに、受信操作が開始された場合に、は、ユーザーが行う必要がある。(MPI_Buffer_attach)

完了することができる。

 受信バッファに十分な大きさがない場合、送信関数はエラーとなる。
 送信バッファが再利用可能になった場合に、送信処理を完了することができる。
 送信処理は、対応する受信が発行されなくても、送信処理を完了することができる。

(1) 送信側が先に発行された場合
OK

P0

buf

送信バッファ解放OK(2) 受信側が先に発行された場合
P1

S

P0

OK

(1) 送信側が先に発行された場合
P1
S

send

usr
buf

E

buf

S

送信バッファ解放OK

OK

buf

S

(2) 受信側が先に発行された場合
P1

P0

OK

usr
buf

E

受信開始

E

P1

send

buf

S

send

S

受信開始

E

buf

E

E

E

12

13

4つの送信モード(4/4)

1対1通信プロトコル(eager send/recv)

 レディ通信モード
 対応する受信が先に発行されている場合のみ、送信処理を開始することができる。

send

P0

send側のメモリ空間

MPI_Send

それ以外の場合は、エラーとなる。
copy

A

NG

buf

P1

S

P0

OK

P1
S

error

buf

buf

E

S

send

S

送信バッファ解放OK

buf

E

E

14

send

A

End

(2) 受信側が先に発行された場合

receive
recv側のメモリ空間

MPI_Recv

メッセージの送信

P0

P1

send
bufferA(1) 送信側が先に発行された場合

send
recv

S

buf

send

S
E

send
recv

P0

送信完了確認

send
recv

copy

A

End

• 受信バッファを介した通信方式。
• recv側のバッファは固定なので、send側は受信バッファがある限り、いつでも送信することができる。
• 十分な受信バッファを必要とするため、メッセージ長が短い場合に使用される。
15

データの流れ制御用通信の流れ

1対1通信プロトコル(rendezvous send/recv)
send

P0

send側のメモリ空間

MPI_Send

P1

1対1通信プロトコル(RDMA*1 put)

receive

send

P0

recv側のメモリ空間

send側のメモリ空間

MPI_Send

転送先バッファの問い合わせcopy

recv側のメモリ空間

転送先バッファの問い合わせ

send
bufferA

MPI_Recv

A

MPI_Recv

転送先バッファの通知
メッセージの送信

receive

P1

メッセージの送信

send

送信完了フラグの送信

転送先バッファの通知

A

A

send

put

送信完了フラグの送信

End

A

put

End
送信完了確認End• 受信するための領域を、受信先へ問い合わせする方式。
• 送信側は、転送先に受信バッファを要求して、転送先が応えるまで転送しない。
• 最大で往復の制御用通信が必要なため、2回分のレイテンシを隠蔽できるだけのメッセージ長が必要となる。

送信完了確認
送信完了フラグ

データの流れ制御用通信の流れ

16• 転送元メモリから転送先メモリへ直接書き込む方式。
• HCA (Host Connect Adaptor) にRDMA転送する機能が必要。
• CPUを介さないため、高速な転送処理が可能。
• 往復の制御用通信が必要なため、2回分のレイテンシを隠蔽できるだけのメッセージ長が必要となる。

End

送信完了フラグ

データの流れ制御用通信の流れ*1

RDMA (Remote Direct Memory Access)
ホストCPUの割り込みをほとんど発生させることなく、独立したシステムのメインメモリ間のデータ転送を行う技術。

17

1対1通信プロトコル(RDMA get)
send

P0

send側のメモリ空間

MPI_Send

P1

receive
recv側のメモリ空間

転送先バッファの問い合わせA

集団通信関数MPI_Recv

get

メッセージの送信要求

A
put

受信完了フラグ

受信完了フラグの通知

受信完了確認End

End• 転送先のメモリを直接読み込む方式。
• 受信側から送信側へ、転送が完了したことを通知する必要がある。
• 送信側は、受信終了通知を確認するまで、送信処理を完了できない。
18

データの流れ制御用通信の流れ• 集団通信とは• 集団通信の機能• 実装アルゴリズムの例• Allgather• Alltoall19

集団通信とはBarrier (バリア同期)

 あるプロセスグループ内でグループ内に関連した通信を定義しています。
 全てのプロセスグループが、同じ引数を持って呼び出すことが前提となります。
 ブロッキング処理です。
MPIがサポートする集団通信関数
放送

MPI_Bcast

収集

MPI_Gather

0

1

3

MPI_Barrier
MPI_Barrier
MPI_Barrier

MPI_Gatherv
拡散2

MPI_Scatter
MPI_Barrier

MPI_Scatterv
収集データを全メンバで共有

MPI_Allgather

全プロセスが到着したら再開

MPI_Allgatherv
完全交換

MPI_Alltoall
MPI_Alltoallv
MPI_Alltoallw

リダクション

MPI_Reduce

リダクション結果を全メンバで共有

MPI_Allreduce

リダクション結果を全メンバに拡散

MPI_Reduce_scatter

スキャン

MPI_Scanバリア同期

MPI_Barrier

MPI_Barrier(comm)comm

コミュニケータ

20

21

Bcast (放送)

Gather (収集)A0

P0のメモリ空間

P1のメモリ空間
A0

P2のメモリ空間

P3のメモリ空間

MPI_Bcast(buffer, count, datatype, root, comm)buffercount
datatyperoot
commバッファの先頭アドレス
バッファ内の要素数
バッファのデータタイプ
ルートとなるランク
コミュニケータ

A0

P0のメモリ空間

P1のメモリ空間

A0

A0

P2のメモリ空間

P3のメモリ空間A0

B0

P0のメモリ空間

P1のメモリ空間

C0

D0

P2のメモリ空間

P3のメモリ空間

A0

B0

C0

D0

P0のメモリ空間

P1のメモリ空間

P2のメモリ空間

P3のメモリ空間

MPI_Gather(sendbuf, sendcount, sendtype, recvcount,recvtype, root, comm)sendbuf
送信バッファの先頭アドレス
sendcount 送信バッファの要素数
sendtype 送信バッファのデータタイプ
recvbuf
受信バッファの先頭アドレス(rootのみ有効)
recvcount 受信バッファの要素数(rootのみ有効)
recvtype 受信バッファのデータタイプ(rootのみ有効)
root
ルートとなるランク
comm
コミュニケータ

可変長のMPI_Gathervもある
22

23

Scatter (拡散=Gatherと反対の処理)
A0

A1

A2

A3

P0のメモリ空間

P1のメモリ空間
A0

P2のメモリ空間

Allgather

P3のメモリ空間

MPI_Scatter(sendbuf, sendcount, sendtype, recvcount,recvtype, root, comm)sendbuf
送信バッファの先頭アドレス(rootのみ有効)
sendcount 送信バッファの要素数(rootのみ有効)
sendtype 送信バッファのデータタイプ(rootのみ有効)
recvbuf
受信バッファの先頭アドレス
recvcount 受信バッファの要素数
recvtype 受信バッファのデータタイプ
root
ルートとなるランク
comm
コミュニケータ

A1

P0のメモリ空間

P1のメモリ空間

A2

A3

P2のメモリ空間

各プロセスにコピー

A0

B0

P0のメモリ空間

P1のメモリ空間

C0

D0

P2のメモリ空間

B0

A0

B0

C0

D0

C0

D0

P0のメモリ空間

P3のメモリ空間

MPI_Allgather(sendbuf, sendcount, sendtype, recvcount,recvtype,comm)P3のメモリ空間

A0

sendbuf
送信バッファの先頭アドレス
sendcount 送信バッファの要素数
sendtype 送信バッファのデータタイプ
recvbuf
受信バッファの先頭アドレス
recvcount 一プロセスから受信する要素数
recvtype 受信バッファのデータタイプ
comm
コミュニケータ

A0

B0

A0

B0

C0

D0

C0

D0

P2のメモリ空間

P3のメモリ空間(参考) Gather + Bcastと同等の処理

可変長のMPI_Scattervもある
24

25

Alltoall

Reduce

A0

A1

B0

B1

A2

A3

B2

B3

P0のメモリ空間

P1のメモリ空間

C0

C1

D0

D1

A0

B0

A1

B1

C2

C3

D2

D3

C0

D0

C1

D1

P2のメモリ空間

P1のメモリ空間

P0のメモリ空間

P3のメモリ空間

MPI_Alltoall(sendbuf, sendcount, sendtype, recvcount,recvtype, comm)sendbuf
送信バッファの先頭アドレス
sendcount 各プロセスへ送信する要素数
sendtype 送信バッファのデータタイプ
recvbuf
受信バッファの先頭アドレス
recvcount 一プロセスから受信する要素数
recvtype 受信バッファのデータタイプ
comm
コミュニケータ

P1のメモリ空間

A2

B2

A3

B3

C2

D2

C3

D3

P2のメモリ空間

P3のメモリ空間A0

B0

P0のメモリ空間

P1のメモリ空間

C0

D0

P2のメモリ空間

P3のメモリ空間

A0⊕B0⊕
C0⊕D0

⊕ 演算子

P1のメモリ空間

P2のメモリ空間

P3のメモリ空間

MPI_Reduce(sendbuf, recvbuf, count, datatype, op, root,
comm)sendbuf
recvbufcountdatatype
op
root
comm

送信バッファの先頭アドレス
受信バッファの先頭アドレス
送信バッファの要素数
送信バッファのデータタイプ
演算
ルートとなるランク
コミュニケータ

可変長のMPI_AlltoallvやMPI_Alltoallwもある
26

P0のメモリ空間

27

Allreduce
B0

A0

P0のメモリ空間

P1のメモリ空間

C0

D0

A0⊕B0⊕
C0⊕D0

⊕ 演算子

P2のメモリ空間

P3のメモリ空間

MPI_Allreduce(sendbuf, recvbuf, count, datatype, op,root, comm)sendbuf
recvbufcountdatatype
op
commReduce_scatter

演算結果を各プロセスにコピー

送信バッファの先頭アドレス
受信バッファの先頭アドレス
送信バッファの要素数
送信バッファのデータタイプ
演算
コミュニケータ

A0⊕B0⊕C0⊕D0

P0のメモリ空間
A0⊕B0⊕C0⊕D0

P1のメモリ空間
A0⊕B0⊕
C0⊕D0

A0

A1

B0

B1

A2

A3

B2

B3

P0のメモリ空間

P1のメモリ空間

C0

C1

D0

D1

C2

C3

D2

D3

A0⊕B0⊕
C0⊕D0

⊕ 演算子

P3のメモリ空間

P2のメモリ空間

MPI_Reduce_scatter(sendbuf, recvbuf, recvcounts,
datatype, op, root, comm)

A2⊕B2⊕
C2⊕D2

P1のメモリ空間
A3⊕B3⊕
C3⊕D3

sendbuf
recvbuf

P2のメモリ空間

P3のメモリ空間

送信バッファの先頭アドレス
受信バッファの先頭アドレス
recvcounts 各プロセスに分配される要素数の配列
datatype 送信バッファのデータタイプ
op
演算
comm
コミュニケータ

P0のメモリ空間

A1⊕B1⊕C1⊕D1

P2のメモリ空間

P3のメモリ空間(参考) Reduce + Bcastと同等の処理
28

29

Scan

MPIが対応するリダクション演算
Op

Function

対応する型

MPI_MAX

最大値

C整数型・Fortran整数型,実数型,複素数型

MPI_MIN

最小値

C整数型・Fortran整数型,実数型,複素数型

P1のメモリ空間

MPI_SUM和C整数型・Fortran整数型,実数型,複素数型

MPI_PROD

積

C整数型・Fortran整数型,実数型,複素数型

D0

MPI_LAND

論理積

C整数型,論理型

MPI_BAND

ビット演算の積

C整数型・Fortran整数型,バイト型

MPI_LOR

論理和

C整数型,論理型

MPI_BOR

ビット演算の和C整数型・Fortran整数型,バイト型

MPI_LXOR

排他的論理和C整数型,論理型

MPI_BXOR

ビット演算の排他的論理和 C整数型・Fortran整数型,バイト型

MPI_MAXLOC

最大値と位置MPI_MINLOC

最小値と位置B0

A0

P0のメモリ空間
C0

A0
⊕ 演算子

P2のメモリ空間

P3のメモリ空間

MPI_Scan(sendbuf, recvbuf, count, datatype, op, comm)sendbuf
recvbufcountdatatype
opcomm

送信バッファの先頭アドレス
受信バッファの先頭アドレス
送信バッファの要素数
送信バッファのデータタイプ
演算
コミュニケータ

P0のメモリ空間
A0⊕B0⊕C0

P2のメモリ空間

30

A0⊕B0

P1のメモリ空間
A3⊕B3⊕C3⊕D3

P3のメモリ空間

31

集団通信のアルゴリズム例

Algorithm <Allgather> (1/4)

 Allgatherのアルゴリズムの例

Ring Algorithm

 Ring Algorithm

P0 Recursive Doubling Algorithm

P1

0

P2

1

P3

2

P0
3

Step-1

 Bruck Algorithm Neighbor Exchange Algorithm

P0 Alltoallのアルゴリズムの例

0

P1
3

0 1

2 3

0 1

P2

P3

1 2

P0

2 3

Step-2

 Simple Spread Algorithm

P0 Pair-wise Exchange Algorithm

0

P1

P2
3

P3

0 1 2

P0

1 2 3

Step-3
P0

P1

P2

P3

0 1 2 30 1 2 30 1 2 30 1 2 3

P0

一プロセス分のデータを次々と隣に送る。ステップ数=(P-1)
32

33

Algorithm <Allgather> (2/4)

Algorithm <Allgather> (3/4)

Recursive Doubling Algorithm

Bruck Algorithm

P0
0

P1
1

P2

P4

P3

2

4

P0

P1
0 1

P2
2 3

P6

P7

P7

P3

5

P4

P5

6

P6

7

Step-1
P7

P7

4 5

P0

P1

P2

P3

0 1 2 30 1 2 30 1 2 30 1 2 3

Step-3

4 5

6 7

6 7

P4

P5

P6

P7

4 5 6 74 5 6 74 5 6 74 5 6 7

Step-2
P7

P0

P1

P2

P3

P4

P5

P6

P7

P2

P3

P4

P5

P6

P7

P0

P0

P1

P2

P3

P4

P5

P6

P7

P0

P0

P1

P2

P3

P4

P5

P6

P7

P0

P1

P2

P3

P4

P5

P6

P7

P0

0 1 2 34 5 6 7

Step-30 1 2 34 5 6 7P1

0 1 2 34 5 6 7

2 3

Step-2P0
0 1 2 34 5 6 7

3

Step-1
0 1

P5

P7

P0
0 1 2 34 5 6 7sort
0 1 2 34 5 6 7

ステップ数(=log2P)が抑えられるが、 2べきのプロセス数でないと適用できない。
34

非連続データを扱うため、最後でソートが必要になる。ステップ数(=log2P)。
35

Algorithm <Allgather> (4/4)

Algorithm <Alltoall> (1/2)

Neighbor Exchange Algorithm

Simple Spread Algorithm

P7

P0

P1

P2

P3

P4

P5

P6

P7

P0

0 1 2 34 5 6 7

Step-1
P7

P7

P0

P1

P2

P3

P4

P5

P6

P7

P7

P7

P3
D0 D1 D2 D3

P1

P2

P3

A0 B0 C0 D0

B1

C2

D3

Step-2

P0

P1

P2

P3

P4

P5

P6

P7

P0

P0

P1

A0 B0 C0 D0A1 B1 C1 D1

P2

P3

C2

D3

Step-3

P0

P1

P2

P3

P4

P5

P6

P7

P0

P0

P1

P2

A0 B0 C0 D0A1 B1 C1 D1

A2 B2 C2 D2

P3
D3

Step-40 1 2 34 5 6 7

Step-4P2
C0 C1 C2 C3

P0

P0

0 1 2 34 5 6 7

Step-3P1
B0 B1 B2 B3

Step-10 1 2 34 5 6 7

Step-2P0
A0 A1 A2 A3

P0

P1

P2

P3

P4

P5

P6

P7

P0

P0

P1

P2

P3

A0 B0 C0 D0A1 B1 C1 D1

A2 B2 C2 D2

A3 B3 C3 D3

0 1 2 34 5 6 7

ステップ数(=P/2)はRecursive Doublingより多いが、通信は隣接通信のみ。

一ステップで、一つのプロセスにすべてのデータを集める。ステップ数=P。

36

37

Algorithm <Alltoall> (2/2)
Pair-wise Exchange Algorithm
P0

P1

P2

P3

A0 A1 A2 A3

B0 B1 B2 B3

C0 C1 C2 C3

D0 D1 D2 D3

P2

P3

Step-1
P0
A0

P1
D0

A1 B 1C0 D0

A1 B 1B 2 C2MPI-IOP0

C3 D3

Step-2
P0
A0

P1

P2
D1

P3

A 2 B 2 C2

P0P1

B3 C3 D3

Step-3
P0

P1

P2

P3

A0 B0 C0 D0A1 B1 C1 D1

A2 B2 C2 D2

A3 B3 C3 D3

P0

P1

P2

• HPCにおけるIOアーキテクチャ• アプリの状況• Data Model (HDF5, NetCDF)• MPI-IO規格• ROMIO

一要素ずつ近くから遠くのランクへ転送する。ステップ数=P-1。
38

39

HPCにおけるIO

HPCにおけるIOアーキテクチャ

 現在のアプリケーションの傾向

user

1

 1プロセスごとに入力ファイル・出力ファイルが存在
0

in

1

out

in

2

out

in

in

3

NetCDF, Parallel NetCDF
HDF5, CDFなど

Data Model• プロセス数が少ないうちは、高速にファイルへアクセスできるが、プロセス数が増える(作成するファイル数が増える)に連れて、ファイルシステムへの負荷が増大する。

out

4

Application

特徴

3

out

2

IO Middleware

MPI-IO
UFS, NFS, Luster, SRFSなど(POSIX IO I/Fを提供)

File System 将来予測されるアプリケーションの傾向

Interconnect

 1アプリケーション全体で入力ファイルと出力ファイルを管理
0

1

in

2

3

• 分散並列上のアプリケーション全体
から、一つのファイルへの入出力が可能なため、ファイルシステムへの負荷をかけずに入出力ができる。

out

Hardwaresystem特徴

1. POSIX IOでの入出力
2. MPI-IOでの入出力
3. Data ModelがMPI-IOを利用して入出力
4. Data ModelがPOSIX IOを利用して入出力

40

MPI-IOとは、 POSIXインターフェースでは実現できない、• 複数プロセスが共有ファイルを効率的にアクセスする
ためのインターフェースを提供• プロセス間IOのポータビリティ性を提供している、MPI-2規格の一部です。
41

アプリの状況

データモデルの役割
 アメリカでの主要アプリの状況は?
 まだまだ、Fortranが主力

 多様なAPIの提供
 C/C++/Fortranに加えて、最近のトレンドはJavaをサポートしています 高レベルIOは、HDF5とNetCDFが主流
 MPI-IOで記述されたアプリが3本存
在 Parallel NetCDFは間接的にMPIIOを使用しています。
 HDF5は間接的にMPI-IOを使用する可能性があります。
 POSIX IOのジョブもまだまだ多い。

 ランダムアクセス
 ランダムアクセスの提供により、目的のデータを高速に取り出すことができます。

 既存データの読み出し
 データモデルがサポートする処理系ならば、ファイルを読み書きすることができます。
 ファイルの転送先やリモートアクセスでも、ファイルを読み書きすることができます。

⇒ データファイルの一般提供が可能 ファイルの圧縮 zlibによるデータ圧縮をサポートしています。

 並列IOによるアクセス
Application
Data ModelIO Middleware

NCCS High Performance Computing Allocations for FY 2006
Dr. Bronson Messer (Oak Ridge National Laboratory)42

 より高速化するために、並列IOのサポートが開始されています。(Parallel NetCDFとHDF5)

Application
Data ModelIO Middleware

File System

File System

Interconnect

Interconnect

HardwareHardware43

HDF5の特徴

NetCDF・Parallel NetCDFの特徴

 特徴

 特徴

 NCSA(アメリカ国立スーパーコンピュータ応用研究所)で開発された、階層データ

 UCAR (University Corporation for Atmospheric Research)の、Unidata

フォーマット 複雑なデータオブジェクトや大量のメタデータを表現できるデータモデル
 データオブジェクトの数や大きさに制限のない可搬性の高いファイルフォーマット
 C, C++, Fortran 90, JavaにAPIを提供
 Virtual File Layerにより、用途に応じたファイルを出力

Centerが開発したデータモデル
 Network-transparent / Self-Describing• NetCDFファイルは、どの環境(たとえばエンディアンが違っても)であっても、ユーザーは変換することなく、データを取り出すことができます。
• NetCDFファイルをネットワーク転送したり、リモートアクセスすることも可能です。
 C, C++, FOTRAN77, Fortran90, JavaにAPIを提供
 第三者によって、MATLAB, Objective-C, Perl, Python, R, Ruby, Tcl/Tkで利用できるAPIを提供
 Parallel NetCDFは、NetCDFを拡張して、MPI-IOを使用して並列化⇒内部的に並列IOを使用するため、ユーザーが意識することなく、並列ファイルシステムを有効に活用できます。

Application
Data Model 主に気象系データの解析に使用

Application
Data ModelIO Middleware

HDF5 Wins 2002 R&D 100 Award
http://hdf.ncsa.uiuc.edu/HDF5/RD100-2002/All_About_HDF5.pdf

IO Middleware

File System

File System

Interconnect

Interconnect

HardwareHardware

44

45

MPI-IOの概要

MPI-IOの動作イメージ

 集団的操作によるファイルのオープンとクローズ
MPI_FILE_OPEN(comm, filename, amode, info, fh)INcommコミュニケータINfilename
ファイル名
IN
amode
アクセスモードIN
info
infoオブジェクト
OUT
fh
ファイルハンドル
MPI_FILE_CLOSE(fh)
INOUT
fh

一つのファイルに複数のプロセスから書き込みを行うことができます

効率的にアクセスするための情報を、ヒントとして処理系に渡すことができます

MPI_File_open(MPI_COMM_WORLD, “/work/datafile”,
MPI_MODE_CREATE | MPI_MODE_WRONLY,MPI_INFO_NULL, &fh);
MPI_File_seek(fh, rank*bufsize, MPI_SEEK_SET);
0

1

2

3

seek_setseek_setseek_setseek_set

ファイルをオープンして、オフセットを設定する

独立ファイルポインタの設定

ファイルハンドル/work/datafile
bufsize ( elements = bufsize / sizeof(type) )MPI-IOは、プロセス間で共有する一つのファイルにアクセスすることができます。(プロセスごとに別のファイルを作成することも可能です)

MPI_File_write(fh, buf, elements, MPI_INT, &s);
buf

0
buf

1
buf

Application

ファイルへ書き込み

Data ModelIO Middleware
File System/work/datafile

0:buf

write
1:buf

write
2:buf

Interconnect
Hardware

46

2
buf

write

MPI_INT型を
elements個書き込む

write
3:buf

3

Application
Data ModelIO Middleware
File System
Interconnect

MPI_File_close(&fh);

Hardware47

ファイルシーク(明示的オフセット)

ファイルシーク(独立ファイルポインタ) 3種類のファイルシークを提供 (1/3)

 3種類のファイルシークを提供 (2/3)• ファイルの先頭を0としたときのオフセット値を指定して、ファイルへアクセスします。ファイルポイ
ンタは更新されません。ファイルのオープン時に、MPI_MODE_SEQUENTIALモードを指定した場合は、利用できません。
MPI_FILE_WRITE_AT(fh, offset, buf, count,datatype, status)
INOUT
fh
ファイルハンドルINoffsetオフセット
INbuf
バッファの先頭アドレス
IN
count
バッファの要素数
IN
datatype
バッファのデータタイプ
OUT
statusステータスオブジェクト
MPI_FILE_READ_AT(fh, offset, buf, count, datatype,status)INfh
ファイルハンドルINoffset
オフセット
OUT
buf
バッファの先頭アドレス
IN
count
バッファの要素数
IN
datatype
バッファのデータタイプ
OUT
statusステータスオブジェクト

関連API
MPI_FILE_READ_AT
MPI_FILE_WRITE_AT
MPI_FILE_IREAD_AT
MPI_FILE_IWRITE_AT
MPI_FILE_READ_AT_ALL
MPI_FILE_WRITE_AT_ALL
MPI_FILE_READ_AT_ALL_BEGIN
MPI_FILE_READ_AT_ALL_END
MPI_FILE_WRITE_AT_ALL_BEGIN
MPI_FILE_WRITE_AT_ALL_END

Application
Data Model• 各プロセスが独立したファイルポインタを持って、ファイルへアクセスします。共有ファイルポイン
タは更新されません。ファイルのオープン時に、MPI_MODE_SEQUENTIALモードを指定
した場合は、利用できません。
MPI_FILE_WRITE(fh, buf, count, datatype, status)
INOUT
fh
ファイルハンドルIN
buf
バッファの先頭アドレス
IN
count
バッファの要素数
IN
datatype
バッファのデータタイプ
OUT
statusステータスオブジェクト
MPI_FILE_READ(fh, buf, count, datatype, status)
INOUT
fh
ファイルハンドル
OUT
buf
バッファの先頭アドレス
IN
count
バッファの要素数
IN
datatype
バッファのデータタイプ
OUT
statusステータスオブジェクト
MPI_FILE_SEEK(fh, offset, whence)
INOUT
fh
ファイルハンドルINoffsetオフセット
INwhence
更新モード

IO Middleware
File System
Interconnect
Hardware

関連API
MPI_FILE_READ
MPI_FILE_WRITE
MPI_FILE_IREAD
MPI_FILE_IWRITE
MPI_FILE_READ_ALL
MPI_FILE_WRITE_ALL
MPI_FILE_READ_ALL_BEGIN
MPI_FILE_READ_ALL_END
MPI_FILE_WRITE_ALL_BEGIN
MPI_FILE_WRITE_ALL_END

Application
Data ModelIO Middleware

MPI_FILE_GET_POSITION(fh, offset)
IN
fh
ファイルハンドル
OUT
offsetオフセット

48

File System
Interconnect
Hardware49

ファイルシーク(共有ファイルポインタ)

ブロッキングとノンブロッキング ブロッキングIOとノンブロッキングIO

 3種類のファイルシークを提供 (3/3)• 各プロセス間で共通のファイルポインタを持って、ファイルへアクセスします。同時に共有ファイ
ルポインタを使用したデータアクセスをする場合、シリアライズされて実行されますが、その順
序は処理系依存です。順序保証するには、ユーザー自身で同期処理を行う必要があります。
MPI_FILE_WRITE_SHARED(fh, buf, count, datatype,status)
INOUT
fh
ファイルハンドルINoffset
オフセット
IN
count
バッファの要素数
IN
datatype
バッファのデータタイプ
OUT
statusステータスオブジェクト
MPI_FILE_READ_SHARED(fh, buf, count, datatype,status)INfh
ファイルハンドル
OUT
buf
バッファの先頭アドレス
IN
count
バッファの要素数
IN
datatype
バッファのデータタイプ
OUT
statusステータスオブジェクト

関連API
MPI_FILE_READ_SHAREDMPI_FILE_WRITE_SHAREDMPI_FILE_IREAD_SHAREDMPI_FILE_IWRITE_SHAREDMPI_FILE_READ_ORDERED
MPI_FILE_WRITE_ORDERED
MPI_FILE_READ_ORDERED_BEGIN
MPI_FILE_READ_ORDERED_END
MPI_FILE_WRITE_ORDERED_BEGIN
MPI_FILE_WRITE_ORDERED_END

1対1通信と同様に、ブロッキングIOとノンブロッキングIOが提供されています。
• ブロッキングIO
IO要求が完了するまで戻りません。ただし、書き込みバッファを利用するシステムでは、記憶デバイスへの書き込みを保証するものではありません。記憶デバイスへの転送を保証するた
めには、MPI_FILE_SYNCを使用します。
MPI_FILE_SYNC(fh)
INOUT
fh

ファイルハンドル• ノンブロッキングIO
IO操作の開始ルーチンを呼び出しますが、完了するまで待ちません。実際のIO処理を行っている間に、他の演算処理をオーバーラップすることができます。ユーザーバッファが再利用可能かどうかは、ノンブロッキング通信と同様に、MPI_WaitやMPI_Testなどを使用して確認します。

Application

Application

Data Model

Data ModelIO Middleware

50

IO Middleware

File System

File System

Interconnect

Interconnect

HardwareHardware51

集団的データアクセス

ファイル情報 非集団的データアクセスと集団的データアクセス

 ファイル情報

ユーザーは、最適化の指示として、infoを通じてシステム側にヒントを渡すことができます。

1対1通信と同様に、非集団的IOと集団的IOが提供されています。
• 非集団的データアクセス
処理の完了は、呼び出したプロセスのみに依存します。

MPI_FILE_SET_INFO(fh, info)
INOUT
fh
IN
info

• 集団的データアクセス
処理の完了は、集団的呼び出しに参加する全てのプロセスに依存します。しかし、大域的データアクセスの場合、MPIライブラリ内に入出力の最適化の余地が十分にある場合は、性能面で有利になる可能性があります。

Application

ファイルハンドル
infoオブジェクト

MPI_FILE_GET_INFO(fh, info_used)
INOUT
fh
ファイルハンドル
OUT
info_used
infoオブジェクト(参考) Fujitsu MPI(V3系)がサポートするinfoオブジェクトのkey
keyvalue(省略値)意味

cb_buffer_size

4194304

集団的アクセスに使用する
一時バッファの大きさ

cb_nodesコミュニケータの大きさ

集団的アクセスで実際に入出力を行うプロセス数

ind_rd_buffer_size

4194304

プロセス個別読み込み時のバッファ域の大きさ

ind_wr_buffer_size

524288プロセス個別書き込み時のバッファ域の大きさ

Data ModelIO Middleware

Application
Data ModelIO Middleware

File System

File System

Interconnect

Interconnect

HardwareHardware

52

53

MPI-IOにおけるデータ表現(1)MPI-IOにおけるデータ表現(2) 3種類のデータ表現

 3種類のデータ表現の設定と参照• MPI-IOは、データファイルのポータビリティのために、3つのデータ表現を用意しています。
• “native”
データ表現は、メモリ中のバイナリイメージと同じです。同一機種内でデータファイルを使用する場合は、精度が保証され、変換コストが省略できる利点があります。
• “internal”
ファイル形式は、同一システム内(異機種間であっても)で保証されます。データ表現は、
MPIの実装によって決められますが、”external32”として置き換えられる場合があります。
• “external32”
データ表現は、他システムのMPIでも保証されます。データ変換が必要な処理系では、精度が失われたり、実行性能の低下を招きます。”external32”は、MPI-2規格で厳密に定義されていますが、一般的なIEEE754+ビッグエンディアン形式(SPARCのデータフォーマット)がイメージされています。
à 全ての浮動小数点型はIEEE型のビッグエンディアンで表現される。4倍
精度は、16バイト(指数部15ビット、仮数部112ビット)とする。
à 全ての整数型は、2の補数のビッグエンディアンで表現される。
à FortranのLOGICAL型とC++のbool型は、偽を0、真を非零とする。
à FortranのCOMPLEX型とDOUBLE COMPLEX型は、二つの浮動小数点フォーマットの組み合わせとする。
à 文字型はISO 8859-1とし、MPI_WCHARはUnicodeフォーマットとする。
à NaNは伝搬するものとする。

MPI_FILE_SET_VIEW(fh, disp, etype, filetype,
datarep, info)
INOUT
fh
ファイルハンドル
IN
disp
オフセット
IN
etype
基本データ型IN
filetype
ファイル型
IN
datarep
データ表現
IN
info
infoオブジェクト
MPI_FILE_GET_VIEW(fh, disp, etype, filetype,
datarep)INfh
ファイルハンドル
OUT
disp
オフセット
OUT
etype
基本データ型
OUT
filetype
ファイル型
OUT
datarep
データ表現

Application
Data ModelIO Middleware
File System
Interconnect(注意) Fujitsu MPI(V3系)は、”internal”と”external32”は、”native”で解釈されます。
54

Hardware55

独立ファイルポインタ・共有ファイルポ
インタは更新される“native”, “internal”, “external32”のいずれかを指定する

MPIの実装(ROMIO) ROMIO
 対応する豊富なファイルシステム

 Argonne National Laboratoryによって実装されたMPI-IO
 MPI-IO実装のde facto standard• MPICH• LAM-MPI• HP MPI• SGI MPI
• NEC MPI
• 富士通MPI(V3系から)• IBM PIOFS• Intel PFS

などに
採用済み

MPIでのファイル出力• HP/Convex HFS• SGI XFS• NEC SFS
• PVFS• NFS• UFS• MPI-IO方式• Split Files方式• IOマスター方式

 adioレイヤー構成により、ファイルシス

テムの追加が容易
ROMIOのソフトウェア・スタック
Application

MPI-IOadio
ad_ufsad_nfsad_pvfs

Data ModelIO Middleware
File System…

Interconnect
Hardware

56

57

MPI-IO方式によるファイル転送

Split Files方式によるファイル転送

 MPI-IOを利用して一つのファイルに転送(MPI-IO方式)

 プロセスごとにファイルを転送(Split Files方式)

0

1

2

3

0

1

2

3

sprintf(filename, “%s.%03d", BASENAME, this_rank);
unlink(filename);

MPI_FILE_DELETE(fname);
MPI_File_open(MPI_COMM_WORLD, filename,
MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &fh);
MPI_File_seek(fh, myrank * bufsize, MPI_SEEK_SET);MPI_File_write(fh, buf, elements, MPI_DOUBLE, &status);
MPI_File_sync(fh);MPI_File_close(&fh);
 ユーザーはプロセスの同期を取ることなく、一つのファイルを作成することができる。
 多重書き込みをサポートする高速なネットワーク共有ファイルシステムが前提となる。

58

fd = open(filename, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
write(fd, (void *)buf, bufsize);fsync(fd);close(fd); 一般的なPOSIX-IOで実現できるため、わかりやすいプログラムで記述できる。
 ファイルがプロセス数個できるため、プロセス増加に伴い、ファイルシステムに負荷がかかる。

59

IOマスター方式によるファイル転送
 ルートに出力データを集めて、一つのファイルを転送(IOマスター方式)
0

1

2

3
データ転送

MPI-IOでのストライド転送
unlink(filename);
MPI_Gather(buf, (int)elements, MPI_DOUBLE,
allbuf, (int)elements, MPI_DOUBLE, 0, MPI_COMM_WORLD);
if(this_rank == 0){fd = open(filename, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
write(fd, (void *)allbuf, allbufsize);fsync(fd);close(fd);}• ストライドデータの入出力• Data Sieving

 事前にデータ転送が必要なため、通信コストが高い。
 ルートプロセスの負荷が高く、プロセスの負荷バランスが悪くなる。

60

61

ストライドデータの入出力

POSIX-IOとMPI-IOでの違い 非連続ベクトル型データから一つのファイルを作成。

 POSIX-IOでの書き込み

0

A0

B0

C0

D0

1

A1

B1

C1

D1

2

A2

B2

C2

D2

3

A3

B3

C3

D3

BLOCKLENGTHCOUNT=1

file

COUNT=2

COUNT=3

COUNT=4

A0 A1 A2 A3 B0 B1 B2 B3 C0 C1 C2 C3 D0 D1 D2 D3ベクトル宣言型
size = MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Type_contiguous(BLOCKLENGTH, MPI_INT, &type1);
MPI_Type_commit(&type1);
MPI_Type_vector(COUNT, BLOCKLENGTH, BLOCKLENGTH * size, MPI_INT, &type2);
MPI_Type_commit(&type2);

62

y = malloc(BLOCKLENGTH * size * COUNT * sizeof(int));for(j = 0; j < COUNT; j++)
MPI_Gather(x + size * j * BLOCKLENGTH, 1, type1, y + size * j * BLOCKLENGTH,
1, type1, 0, MPI_COMM_WORLD);
if(rank == 0){fd = open(fname, O_CREAT | O_WRONLY, 0666);
write(fd, y, BLOCKLENGTH * size * COUNT * sizeof(int));
fsync(fd);
POSIX-IOは、IOマスター方式
close(fd);}でなければ書き込めない
free(y); MPI-IOでの書き込み
MPI_File_open(MPI_COMM_WORLD, (char *)fname,
MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &fh);
MPI_File_set_view(fh, BLOCKLENGTH * rank * sizeof(int), type1, type2,"native", MPI_INFO_NULL);MPI_File_write_all(fh, x, 1, type2, &status);
MPI-IOは、型を意識した
MPI_File_sync(fh);
入出力が可能MPI_File_close(&fh);

さらに、集団的MPI-IOを用いると、Data Sievingを用いた効率的な入出力を行うことができる
63

Data Sievingとは
 ROMIOの集団的MPI-IOに実装されたデータバッファリング
 不連続データの集団的MPI-IOで使用されます。
 一つ一つのブロックに対する小さいファイル要求でなく、バッファを使用した大きな領域でのファイル要求となるため、性能面で有利に働くことがあります。
 通信フェーズとI/Oフェーズの2つのフェーズがあります。writeの場合は、通信フェーズ→I/Oフェー

ズとなり、readの場合は、I/Oフェーズ→通信フェーズとなります。
 Data Sievingを利用するかどうかとテンポラリバッファの大きさは、ヒントにより変更可能です。

• romio_ds_read / romio_ds_write
Data Sievingを利用するかどうか• ind_rd_buffer_size / ind_wr_buffer_size テンポラリバッファの大きさ
P0
0

1

P1
2

0

P2

1

2

0

2

communication

communication
0 0 0
Temporary buffer of P0

1

1 1 1
Temporary buffer of P1

write

1. 通信フェーズ

2 2 2
Temporary buffer of P2

write

2. I/Oフェーズ

FILE
0 0 0 1 1 1 2 2 264