SlideShare ist ein Scribd-Unternehmen logo
1 von 32
並列処理・MPIの第一歩
Introduction to
Message Passing Interface
23 October 2015 /
田名部 誠一, Sei-Ichi Tanabe-Tanabu
※本資料内容および本自己紹介は所属組織の統一的見解ではなく、個人的見解によるものです。
@n_scattering .
seiichi.tanabetanabu .
JAWS-UG HPC専門支部 #2 LT
自己紹介
田名部 誠一 (たなべ/たなぶ せいいち)
• 所属:
– ビジュアルテクノロジー株式会社
HPC事業本部 テクニカル&サポート部
• 役割:
– HPCに有用な(?)技術の調査、プログラムの開発
社内情報システム管理、極端に広く浅く
• 好きなAWSサービス:
– Amazon EC2 (というか、それしか使ったことがない)
• 参加JAWS-UG:
– 初心者 ・中央線 に、JAWS Days 2015以降参加
2015/10/23 2 /30
AWS Summit Tokyo 2015
After party - JAWS DAYSにて
JAWS-UG HPC専門支部 #2 LT
趣味(?)にしていること
頻度が高めな順に
• Ingress (#0の自己紹介参照)
– 運動療法として始めたが、歩き過ぎに注意
• 各種IT勉強会 (JAWS-UGなども含む)
• 発達障害(自閉症スペクトラム)・双極性障害の
当事者会への参加
• 乗り鉄 (なかなかできない)
• 研究所・研究施設等の一般公開の見学
2015/10/23 3 /30
JAWS-UG HPC専門支部 #2 LT
• 学部・大学院での研究:
– 理論系 物理学(原子衝突)・化学(分子ダイナミクス)
→大規模計算…じゃなかった。
– Pentium !!!, Pentium4 計算機1台でできる小規模な計算
– 一応プログラム(主にFortran, Cなど)や
シェルスクリプト(#シェル芸, CLI)は理解できる
• 最初の職場、前職など:
– 全くもってHPCとは無縁な職場だった(Ex. 回路設計、PG)
• 研究室と師匠との縁で、今の職場に:
– http://v-t.jp/jp/profile/shain-ta.php (行儀の良い社員紹介)
2015/10/23 4 /30
JAWS-UG HPC専門支部 #2 LT
私と High-Performance Computing
(HPC) との関わり
なぜHPCか、並列処理か?
• 並列計算の経験がない!これはまずい!
• 計算機周辺の性能の向上
• CPU、メモリ、ストレージ、ネットワーク…
• だけど、ユーザーの要求も高い!
• そこで、並列計算! (計算機の共同作業!)
– 計算時間の短縮
• N並列ならば、1/Nの計算時間になるのが理想
だが、そうはいかないのが実情…(チューニングなどの工夫)
– 大容量のメモリを必要とする計算も可能
• 1台でできないけど、クラスタにすればできる
2015/10/23 5 /30
JAWS-UG HPC専門支部 #2 LT
並列計算機について
• 並列ではない計算機(昔のPC)
• 共有メモリ型並列計算機(最近のPCも)
• 1筐体にプロセッサ■(コア)が複数
• 全プロセッサが1つのメモリ■を共有
• 並列化の手段: MPI、OpenMP
• 分散メモリ型並列計算機(クラスタ構成)
• 筐体(ノード)が複数。ネットワーク接続
• 各筐体が独自にメモリ■を所有
• 並列化の手段: MPI
• →ノード間で通信をすることで、
全ノードのメモリが使えるようになる
2015/10/23 6 /30
JAWS-UG HPC専門支部 #2 LT
メモリー
MPIとは?
• Message Passing Interface
分散メモリ間のメッセージ通信の規格
• 実装としてはMPICH、OpenMPIが有名
https://www.mpich.org/
http://www.open-mpi.org/
• プログラマが細かなチューニングを行える
• 明示的に手続きを記述する必要がある
2015/10/23 7 /30
JAWS-UG HPC専門支部 #2 LT
MPI関数の紹介
• MPI関数は数百種類。必要最低限の関数
• 1. システム関数
– MPI_Init; MPI_Comm_rank; MPI_Comm_size; MPI_Finalize;
• 2. 1対1通信関数
– MPI_Send; MPI_Recv;
• 3-1. 通信の同期
– MPI_Barrier
• 3-2. 時間計測関数
– MPI_Wtime
2015/10/23 8 /30
JAWS-UG HPC専門支部 #2 LT
A. MPI_INIT
2015/10/23 9 /32
JAWS-UG HPC専門支部 #2 LT
• MPI環境の初期化。
• すべてのMPIルーチンの最初に1回だけ必ず
コールする必要がある。
• CALL MPI_INIT(ierr)
– ierr: 完了コードが戻る
B. MPI_FINALIZE
2015/10/23 10 /32
JAWS-UG HPC専門支部 #2 LT
• MPI環境の終了処理。
• すべてのMPIルーチンの最後に1回だけ必ず
コールする必要がある。
• CALL MPI_FINALIZE(ierr)
– ierr: 完了コードが戻る
C. MPI_COMM_RANK
2015/10/23 11 /32
JAWS-UG HPC専門支部 #2 LT
• コミュニケーターcommで指定したグループ(職
場)内での自分(=コールしたプロセス)のランク
(「名前・社員番号」)を取得する。
• CALL MPI_COMM_RANK(comm,rank,ierr)
– comm: コミュニケーター(職場)を指定
(ここではMPI_COMM_WORLD、全体を指定します)
– rank: commで指定したグループ内での自分(=コールした
プロセス)のランク(名前・社員番号)
– ierr: 完了コードが戻る
D. MPI_COMM_SIZE
2015/10/23 12 /32
JAWS-UG HPC専門支部 #2 LT
• コミュニケーターcommで指定したグループ(職
場)に含まれるプロセスの数を得る。
(プロセッサ数、並列数、「従業員数」)
• CALL MPI_COMM_SIZE(comm,procs,ierr)
– comm: コミュニケーター(職場)を指定
(ここではMPI_COMM_WORLD、全体を指定します)
– procs: commで指定したグループ内に含まれるプロセス
の数(「従業員数」)
– ierr: 完了コードが戻る
並列版Helloプログラムの説明(1)
(プログラム1, Fortran)
program main
include "mpif.h"
common /mpienv/myid,numprocs
integer myid, numprocs
integer ierr
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
print *, "Hello parallel world! Myid:", myid
call MPI_FINALIZE(ierr)
stop
end
2015/10/23 13 /32
JAWS-UG HPC専門支部 #2 LT
並列版Helloプログラムの説明(2)
(プログラム1, Fortran)
program main
include "mpif.h"
common /mpienv/myid,numprocs
integer myid, numprocs
integer ierr
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
print *, "Hello parallel world! Myid:", myid
call MPI_FINALIZE(ierr)
stop
end
2015/10/23 14 /32
JAWS-UG HPC専門支部 #2 LT
このプログラムは、全プロセス
(全従業員)で起動される
A. MPIの初期化
C. 自プロセスのID番号「社員番号」
(myid)を取得します。
(各プロセス・従業員で番号が異なります。)
D. 全体のプロセッサ台数「従業員数」
(numprocs)を取得します。
(各プロセス・従業員で値は同じ)
B. MPIの終了
並列版Helloプログラムの説明
(C言語、参考)
#include <stdio.h>
#include "mpi.h"
int main(int argc, char* argv[]) {
int myid, numprocs;
int ierr, rc;
ierr = MPI_Init(&argc, &argv);
ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid);
ierr = MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
printf("Hello parallel world! Myid:%d n", myid);
rc = MPI_Finalize();
}
2015/10/23 15 /32
JAWS-UG HPC専門支部 #2 LT
C言語では、関数名(MPI_Initなど)の
大文字・小文字の使い方が異なります
C言語では、完了コード(ierr)を得る方法が異なります
並列版Hello実行結果
2015/10/23 16 /32
JAWS-UG HPC専門支部 #2 LT
[tanabe@tanabe sample]$ mpif90 sample1.f90 -o sample1
(コンパイル)
[tanabe@tanabe sample]$ mpirun -n 2 sample1
(2並列「従業員数2名」で実行)
Hello parallel world! Myid: 0
Hello parallel world! Myid: 1
[tanabe@tanabe sample]$
(全プロセス「従業員」に対してHello parallel world!
と、ランク「名前・社員番号」を表示する。
同じ処理を実行しているが、Myidの値で結果が変わる。)
E. MPI_SEND
2015/10/23 17 /32
JAWS-UG HPC専門支部 #2 LT
• 1対1ブロッキング通信サブルーチン(送信)
• 送信メッセージを宛先プロセスに送信。
– 特定の従業員に「仕事を指示する」作業
• ただし、その人が聞いているとは限らない。
→指示した従業員に案件番号を指定し指示を聞いてもらう作業が必要
• 送信したメッセージはMPI_RECVで受信する。
Myid=0
Myid=1
Myid=2
MPI_SEND!!
MPI_RECVで
受信!!
メッセージ
E. MPI_SEND
2015/10/23 18 /32
JAWS-UG HPC専門支部 #2 LT
• CALL MPI_SEND(buf,count,datatype,
dest,tag,comm,ierr)
– buf: 送信バッファーの先頭アドレス(変数)
– count: 送信メッセージの要素数 (※バイト数ではない)
– datatype: 送信メッセージのデータ型
– dest: 宛先プロセスのcomm内のランク(名前・社員番号)
– tag: 送信メッセージの種類を区別するタグ
メッセージの「案件番号」
– comm: コミュニケーター「職場」を指定
(ここではMPI_COMM_WORLD、全体を指定します)
– ierr: 完了コードが戻る
F. MPI_RECV
2015/10/23 19 /32
JAWS-UG HPC専門支部 #2 LT
• 1対1ブロッキング通信サブルーチン(受信)
• 送信元プロセスから送信されたメッセージを受
信する。
– 特定の誰かから「仕事の依頼を受ける」作業
• ただし、その人への指示、受けるべき依頼とは限らない。
→受けるべき特定の誰かからの指示、案件内容が必要
• MPI_SENDで送信したメッセージを受信する。
Myid=0
Myid=1
Myid=2
MPI_SENDで
送信した!!
MPI_RECVで
受信!!
メッセージ
F. MPI_RECV
2015/10/23 20 /32
JAWS-UG HPC専門支部 #2 LT
• CALL MPI_RECV(buf,count,datatype,
source,tag,comm,status,ierr)
– buf: 受信バッファーの先頭アドレス(変数)
– count: 受信バッファーの要素数 (※バイト数ではない)
– datatype: 受信メッセージのデータ型
– source: 送信するプロセスのcomm内のランク(名前・社員番号)
– tag: 送信メッセージの種類を区別するタグ「案件番号」
– comm: コミュニケーター「職場」を指定
(ここではMPI_COMM_WORLD、全体を指定します)
– status: 受信状況に関する情報(整数配列)
– ierr: 完了コードが戻る
並列版送受信プログラムの説明(1)
(プログラム2, Fortran)
program main
include “mpif.h”
common /mpienv/myid,numprocs
integer myid, numprocs
integer isbuf, irbuf, ierr
integer istatus(MPI_STATUS_SIZE)
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
if (myid.eq.0) then
isbuf = 19750617
endif
(続く)
2015/10/23 21 /32
JAWS-UG HPC専門支部 #2 LT
myid(ランク・社員番号)が0のプロセスの
変数isbufの変数を代入
MPI_RECVの処理で
必要な変数
受信状況に関する
情報(整数配列)
準
備
並列版送受信プログラムの説明(2)
(プログラム2, Fortran)
(続く)
if (myid.eq.0) then
call MPI_SEND (isbuf,1,MPI_INTEGER,1,1,MPI_COMM_WORLD,ierr)
elseif (myid.eq.1) then
call MPI_RECV (irbuf,1,MPI_INTEGER,0,1,MPI_COMM_WORLD,
istatus, ierr)
endif
if (myid.eq.1) then
write(*,*) "IRBUF =",irbuf
endif
call MPI_FINALIZE(ierr)
stop
end
2015/10/23 22 /32
JAWS-UG HPC専門支部 #2 LT
Myid(ランク・社員番号)が1のプロセス
の変数irbufの内容を確認する。
Myid=0のプロセス(従業員)から、
Myid=1のプロセス(従業員)にデータが
送信されている!
0から1に送信!!
0から来たメッセージ
を1が受信!!
処
理
の
決
定
「案件番号」は1
並列版送受信実行結果
2015/10/23 23 /32
JAWS-UG HPC専門支部 #2 LT
[tanabe@tanabe sample]$ mpif90 sample2.f90 -o sample2
(コンパイル)
[tanabe@tanabe sample]$ mpirun -n 2 sample2
(2並列、従業員数2名で実行)
IRBUF = 19750617
(従業員Myid=1に対して、従業員Myid=0から送信された整数値
を受信できたことを確認する。)
Myid=0
Myid=1
MPI_SENDで
送信した!!
MPI_RECVで
受信!!
19750617 確認
G. MPI_BARRIER
2015/10/23 24 /32
JAWS-UG HPC専門支部 #2 LT
• コミュニケーターcomm「職場」内の全プロセス
「全従業員」間で同期をとる関数
– ある職場の共同作業で、全部の結果が揃わないと
次の作業ができない場合に、最後まで待つ
• CALL MPI_BARRIER(comm, ierr)
– comm:コミュニケーター「職場」を指定
(ここではMPI_COMM_WORLD、全体を指定します)
– ierr: 完了コードが戻る
H. MPI_WTIME
2015/10/23 25 /32
JAWS-UG HPC専門支部 #2 LT
• 時刻を得る関数。 (※たぶんUnix時間)
• 経過時間の測定をしたい部分の前後で実行し、
得られた値elpの差を取ると、その部分の実行
時間が得られる。
• elp = MPI_WTIME ()
– elp: ある過去の時点からの経過時間(秒)
時刻同期プログラムの説明(1)
(プログラム3, Fortran)
program main
implicit none
include "mpif.h"
common /mpienv/myid,numprocs
integer myid, numprocs
integer ierr
integer*8 i, j, iinput, ioutput
real*8 elp1, elp2
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
(続く)
2015/10/23 26 /32
JAWS-UG HPC専門支部 #2 LT
計算で必要な変数
時間計測で必要な変数
心
の
準
備
時刻同期プログラムの説明(2)
(プログラム3, Fortran)
(承前)
! preparation
elp1 = MPI_WTIME()
iinput=0
do i=1, 50000*(myid+1)
do j=1, 50000
iinput = iinput + 1
enddo
enddo
! mpi_barrier
call MPI_BARRIER(MPI_COMM_WORLD, ierr)
! summation
ioutput=0
do i=1, 50000
do j=1, 50000
ioutput = ioutput + 1
enddo
enddo
write(*,*) iinput, ioutput, 'myid=' , myid
(続く)
2015/10/23 27 /32
JAWS-UG HPC専門支部 #2 LT
(作業1) Myid(ランク)の値に応じた回数
だけ足し算を行う。
(従業員により、かかる時間が異なる)
(作業2) 決まった回数だけ足し算を行う。
(従業員間でかかる時間はあまり変わらない)
結果の確認
全プロセスの同期を取る
(全従業員の作業が終わるまで待つ)
時間の測定(計算前)
作
業
1
作
業
2
時刻同期プログラムの説明(3)
(プログラム3, Fortran)
2015/10/23 28 /32
JAWS-UG HPC専門支部 #2 LT
• MPI_BARRIERで同期
• 同期しない場合
Myid=0
Myid=1
Myid=2
MPI_BARRIERで
全プロセスの同期を取る
(全従業員の作業が終わ
るまで待つ)
作業1
作業2経過時間
Myid=0
Myid=1
Myid=2
作業2を行うためには、作
業1を終わらせなくてはい
けない!
そのために、同期が必要
なはず。
意図した動作が行われな
い!!
(承前)
elp2 = MPI_WTIME()
write(*,*) 'ELAPSE=', elp2-elp1, 'myid=',myid
call MPI_FINALIZE(ierr)
stop
end
時間の測定(計算後)
時刻同期プログラムの説明(4)
(プログラム3, Fortran)
2015/10/23 29 /32
JAWS-UG HPC専門支部 #2 LT
計算前後時間の差を取る(経過時間)
並列版時刻同期実行結果
2015/10/23 30 /32
JAWS-UG HPC専門支部 #2 LT
[tanabe@tanabe sample]$ mpif90 sample3.f90 –o sample3
(コンパイル)
[tanabe@tanabe sample]$ mpirun –n 2 sample3
(2並列、「従業員数2名」で実行)
5000000000 2500000000 myid= 1
ELAPSE= 31.489058017730713 myid= 1
2500000000 2500000000 myid= 0
ELAPSE= 33.371865987777710 myid= 0
MPI_BARRIERをしなかった場合
2500000000 2500000000 myid= 0
ELAPSE= 19.314102172851563 myid= 0
5000000000 2500000000 myid= 1
ELAPSE= 28.772753953933716 myid= 1
同期がとれていて、
プロセス間で経過時間の違
いは(そんなに)ない。
同期がとれていないので、
プロセスごとに経過時間が
バラバラ。
最後に
2015/10/23 31 /32
JAWS-UG HPC専門支部 #2 LT
• HPC、大規模計算のためには並列化、特にメ
モリ分散型計算機(クラスター)を使います。
• メモリ分散型計算機で並列計算を行うために
はMPIによる実装が(今のところ)必須です。
• MPIのサブルーチンの数は多いが、少数の基
礎的なもので入門可能です。
• この業界にいながら、職種の関係で
クラスター構築の経験がほぼないのが悩み。
参考となりそうな文献など
2015/10/23 32 /32
JAWS-UG HPC専門支部 #2 LT
• スパコンプログラミング入門: 並列処理とMPIの学習
(片桐 孝洋 著、東京大学出版会)
※他にも、OpenMPなどに着目した著書などもあり
• 並列プログラミング虎の巻MPI版
(青山 幸也 著、高度情報科学技術研究機構)
※OpenMP、チューニングのテキストもあり
http://www.hpci-office.jp/pages/seminar_text
• MPICHサイト
https://www.mpich.org/
• OpenMPIサイト
http://www.open-mpi.org/ などなど
• サンプルプログラムは、Githubにあります
https://github.com/sittncs/hpcstudy/

Weitere ähnliche Inhalte

Ähnlich wie JAWS-UG HPC #2 LT 並列処理・MPIの第一歩

Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Developers Summit
 
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Takashi Sogabe
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMFAtomu Hidaka
 
Mbed祭り 2017@春の新横浜 20170225 竹之下
Mbed祭り 2017@春の新横浜 20170225 竹之下Mbed祭り 2017@春の新横浜 20170225 竹之下
Mbed祭り 2017@春の新横浜 20170225 竹之下Koyo Takenoshita
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
Osc10do linux nextstep
Osc10do linux nextstepOsc10do linux nextstep
Osc10do linux nextstepsmokey monkey
 
Rtミドルウェア講習会 第2部資料
Rtミドルウェア講習会 第2部資料Rtミドルウェア講習会 第2部資料
Rtミドルウェア講習会 第2部資料openrtm
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpMasahito Zembutsu
 
171129-irex2017
171129-irex2017171129-irex2017
171129-irex2017openrtm
 
2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMFAtomu Hidaka
 
【招待講演】ICM研究会 - 統合ログ分析技術Lognosisと運用ログ分析の取組
【招待講演】ICM研究会 - 統合ログ分析技術Lognosisと運用ログ分析の取組【招待講演】ICM研究会 - 統合ログ分析技術Lognosisと運用ログ分析の取組
【招待講演】ICM研究会 - 統合ログ分析技術Lognosisと運用ログ分析の取組NTT Software Innovation Center
 
Kubernetes1.9でWindowsコンテナーをクラスタ化
Kubernetes1.9でWindowsコンテナーをクラスタ化Kubernetes1.9でWindowsコンテナーをクラスタ化
Kubernetes1.9でWindowsコンテナーをクラスタ化Takashi Kanai
 
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐CODE BLUE
 
クラウド時代のネットワーク再入門
クラウド時代のネットワーク再入門クラウド時代のネットワーク再入門
クラウド時代のネットワーク再入門Naoto MATSUMOTO
 
IBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみたIBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみたYou&I
 

Ähnlich wie JAWS-UG HPC #2 LT 並列処理・MPIの第一歩 (20)

Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
 
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF
 
Mbed祭り 2017@春の新横浜 20170225 竹之下
Mbed祭り 2017@春の新横浜 20170225 竹之下Mbed祭り 2017@春の新横浜 20170225 竹之下
Mbed祭り 2017@春の新横浜 20170225 竹之下
 
GTC Japan 2017
GTC Japan 2017GTC Japan 2017
GTC Japan 2017
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
Osc10do linux nextstep
Osc10do linux nextstepOsc10do linux nextstep
Osc10do linux nextstep
 
Rtミドルウェア講習会 第2部資料
Rtミドルウェア講習会 第2部資料Rtミドルウェア講習会 第2部資料
Rtミドルウェア講習会 第2部資料
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorp
 
Netmf-180224
Netmf-180224Netmf-180224
Netmf-180224
 
171129-irex2017
171129-irex2017171129-irex2017
171129-irex2017
 
2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF
 
【招待講演】ICM研究会 - 統合ログ分析技術Lognosisと運用ログ分析の取組
【招待講演】ICM研究会 - 統合ログ分析技術Lognosisと運用ログ分析の取組【招待講演】ICM研究会 - 統合ログ分析技術Lognosisと運用ログ分析の取組
【招待講演】ICM研究会 - 統合ログ分析技術Lognosisと運用ログ分析の取組
 
Kubernetes1.9でWindowsコンテナーをクラスタ化
Kubernetes1.9でWindowsコンテナーをクラスタ化Kubernetes1.9でWindowsコンテナーをクラスタ化
Kubernetes1.9でWindowsコンテナーをクラスタ化
 
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
 
クラウド時代のネットワーク再入門
クラウド時代のネットワーク再入門クラウド時代のネットワーク再入門
クラウド時代のネットワーク再入門
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
IBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみたIBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみた
 
Lpicl304 20170318
Lpicl304 20170318Lpicl304 20170318
Lpicl304 20170318
 

Mehr von HPCシステムズ株式会社

20170604 Dentoo.Lt #17 飛び入り枠: 手話のすすめ
20170604 Dentoo.Lt #17 飛び入り枠: 手話のすすめ20170604 Dentoo.Lt #17 飛び入り枠: 手話のすすめ
20170604 Dentoo.Lt #17 飛び入り枠: 手話のすすめHPCシステムズ株式会社
 
20170604 Dentoo.Lt #17 静音ガジェットの検証試験
20170604 Dentoo.Lt #17 静音ガジェットの検証試験20170604 Dentoo.Lt #17 静音ガジェットの検証試験
20170604 Dentoo.Lt #17 静音ガジェットの検証試験HPCシステムズ株式会社
 
HPC で使えそうな FPGA 搭載 AWS F1 インスタンス 20170127
HPC で使えそうな FPGA 搭載 AWS F1 インスタンス 20170127HPC で使えそうな FPGA 搭載 AWS F1 インスタンス 20170127
HPC で使えそうな FPGA 搭載 AWS F1 インスタンス 20170127HPCシステムズ株式会社
 
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218HPCシステムズ株式会社
 
劇場版「ガールズ&パンツァー」のすすめ
劇場版「ガールズ&パンツァー」のすすめ劇場版「ガールズ&パンツァー」のすすめ
劇場版「ガールズ&パンツァー」のすすめHPCシステムズ株式会社
 
自宅ラック勉強会20150328 LT自己紹介「自宅ラックと私」
自宅ラック勉強会20150328 LT自己紹介「自宅ラックと私」自宅ラック勉強会20150328 LT自己紹介「自宅ラックと私」
自宅ラック勉強会20150328 LT自己紹介「自宅ラックと私」HPCシステムズ株式会社
 

Mehr von HPCシステムズ株式会社 (20)

20170604 Dentoo.Lt #17 飛び入り枠: 手話のすすめ
20170604 Dentoo.Lt #17 飛び入り枠: 手話のすすめ20170604 Dentoo.Lt #17 飛び入り枠: 手話のすすめ
20170604 Dentoo.Lt #17 飛び入り枠: 手話のすすめ
 
20170604 Dentoo.Lt #17 静音ガジェットの検証試験
20170604 Dentoo.Lt #17 静音ガジェットの検証試験20170604 Dentoo.Lt #17 静音ガジェットの検証試験
20170604 Dentoo.Lt #17 静音ガジェットの検証試験
 
HPC で使えそうな FPGA 搭載 AWS F1 インスタンス 20170127
HPC で使えそうな FPGA 搭載 AWS F1 インスタンス 20170127HPC で使えそうな FPGA 搭載 AWS F1 インスタンス 20170127
HPC で使えそうな FPGA 搭載 AWS F1 インスタンス 20170127
 
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218
 
自称IQ診断 --- いわゆる頭の体操
自称IQ診断 --- いわゆる頭の体操自称IQ診断 --- いわゆる頭の体操
自称IQ診断 --- いわゆる頭の体操
 
20161120_HPCでFPGAを使ってみたい_fpgastartup
20161120_HPCでFPGAを使ってみたい_fpgastartup20161120_HPCでFPGAを使ってみたい_fpgastartup
20161120_HPCでFPGAを使ってみたい_fpgastartup
 
40代になって無理できなくなったこと
40代になって無理できなくなったこと40代になって無理できなくなったこと
40代になって無理できなくなったこと
 
Lt_5Sと5定のすすめ_20160129
Lt_5Sと5定のすすめ_20160129Lt_5Sと5定のすすめ_20160129
Lt_5Sと5定のすすめ_20160129
 
劇場版「ガールズ&パンツァー」のすすめ
劇場版「ガールズ&パンツァー」のすすめ劇場版「ガールズ&パンツァー」のすすめ
劇場版「ガールズ&パンツァー」のすすめ
 
Lt 鉄道の日 20151014
Lt 鉄道の日 20151014Lt 鉄道の日 20151014
Lt 鉄道の日 20151014
 
LT KYT危険予知トレーニング 20150820
LT KYT危険予知トレーニング 20150820LT KYT危険予知トレーニング 20150820
LT KYT危険予知トレーニング 20150820
 
Lt東北巡礼入門 20150630
Lt東北巡礼入門 20150630Lt東北巡礼入門 20150630
Lt東北巡礼入門 20150630
 
物理学から見た健康診断Lt20150515
物理学から見た健康診断Lt20150515物理学から見た健康診断Lt20150515
物理学から見た健康診断Lt20150515
 
Ingressを用いたエンジニアの健康管理
Ingressを用いたエンジニアの健康管理Ingressを用いたエンジニアの健康管理
Ingressを用いたエンジニアの健康管理
 
世界自閉症啓発デーに寄せて20150402LT
世界自閉症啓発デーに寄せて20150402LT世界自閉症啓発デーに寄せて20150402LT
世界自閉症啓発デーに寄せて20150402LT
 
自宅ラック勉強会20150328 LT自己紹介「自宅ラックと私」
自宅ラック勉強会20150328 LT自己紹介「自宅ラックと私」自宅ラック勉強会20150328 LT自己紹介「自宅ラックと私」
自宅ラック勉強会20150328 LT自己紹介「自宅ラックと私」
 
健康管理とIngress改
健康管理とIngress改健康管理とIngress改
健康管理とIngress改
 
健康管理とINGRESS
健康管理とINGRESS健康管理とINGRESS
健康管理とINGRESS
 
量子情報勉強会 |3> 資料
量子情報勉強会 |3> 資料量子情報勉強会 |3> 資料
量子情報勉強会 |3> 資料
 
きょうのライトニングトーク
きょうのライトニングトークきょうのライトニングトーク
きょうのライトニングトーク
 

JAWS-UG HPC #2 LT 並列処理・MPIの第一歩

  • 1. 並列処理・MPIの第一歩 Introduction to Message Passing Interface 23 October 2015 / 田名部 誠一, Sei-Ichi Tanabe-Tanabu ※本資料内容および本自己紹介は所属組織の統一的見解ではなく、個人的見解によるものです。 @n_scattering . seiichi.tanabetanabu . JAWS-UG HPC専門支部 #2 LT
  • 2. 自己紹介 田名部 誠一 (たなべ/たなぶ せいいち) • 所属: – ビジュアルテクノロジー株式会社 HPC事業本部 テクニカル&サポート部 • 役割: – HPCに有用な(?)技術の調査、プログラムの開発 社内情報システム管理、極端に広く浅く • 好きなAWSサービス: – Amazon EC2 (というか、それしか使ったことがない) • 参加JAWS-UG: – 初心者 ・中央線 に、JAWS Days 2015以降参加 2015/10/23 2 /30 AWS Summit Tokyo 2015 After party - JAWS DAYSにて JAWS-UG HPC専門支部 #2 LT
  • 3. 趣味(?)にしていること 頻度が高めな順に • Ingress (#0の自己紹介参照) – 運動療法として始めたが、歩き過ぎに注意 • 各種IT勉強会 (JAWS-UGなども含む) • 発達障害(自閉症スペクトラム)・双極性障害の 当事者会への参加 • 乗り鉄 (なかなかできない) • 研究所・研究施設等の一般公開の見学 2015/10/23 3 /30 JAWS-UG HPC専門支部 #2 LT
  • 4. • 学部・大学院での研究: – 理論系 物理学(原子衝突)・化学(分子ダイナミクス) →大規模計算…じゃなかった。 – Pentium !!!, Pentium4 計算機1台でできる小規模な計算 – 一応プログラム(主にFortran, Cなど)や シェルスクリプト(#シェル芸, CLI)は理解できる • 最初の職場、前職など: – 全くもってHPCとは無縁な職場だった(Ex. 回路設計、PG) • 研究室と師匠との縁で、今の職場に: – http://v-t.jp/jp/profile/shain-ta.php (行儀の良い社員紹介) 2015/10/23 4 /30 JAWS-UG HPC専門支部 #2 LT 私と High-Performance Computing (HPC) との関わり
  • 5. なぜHPCか、並列処理か? • 並列計算の経験がない!これはまずい! • 計算機周辺の性能の向上 • CPU、メモリ、ストレージ、ネットワーク… • だけど、ユーザーの要求も高い! • そこで、並列計算! (計算機の共同作業!) – 計算時間の短縮 • N並列ならば、1/Nの計算時間になるのが理想 だが、そうはいかないのが実情…(チューニングなどの工夫) – 大容量のメモリを必要とする計算も可能 • 1台でできないけど、クラスタにすればできる 2015/10/23 5 /30 JAWS-UG HPC専門支部 #2 LT
  • 6. 並列計算機について • 並列ではない計算機(昔のPC) • 共有メモリ型並列計算機(最近のPCも) • 1筐体にプロセッサ■(コア)が複数 • 全プロセッサが1つのメモリ■を共有 • 並列化の手段: MPI、OpenMP • 分散メモリ型並列計算機(クラスタ構成) • 筐体(ノード)が複数。ネットワーク接続 • 各筐体が独自にメモリ■を所有 • 並列化の手段: MPI • →ノード間で通信をすることで、 全ノードのメモリが使えるようになる 2015/10/23 6 /30 JAWS-UG HPC専門支部 #2 LT メモリー
  • 7. MPIとは? • Message Passing Interface 分散メモリ間のメッセージ通信の規格 • 実装としてはMPICH、OpenMPIが有名 https://www.mpich.org/ http://www.open-mpi.org/ • プログラマが細かなチューニングを行える • 明示的に手続きを記述する必要がある 2015/10/23 7 /30 JAWS-UG HPC専門支部 #2 LT
  • 8. MPI関数の紹介 • MPI関数は数百種類。必要最低限の関数 • 1. システム関数 – MPI_Init; MPI_Comm_rank; MPI_Comm_size; MPI_Finalize; • 2. 1対1通信関数 – MPI_Send; MPI_Recv; • 3-1. 通信の同期 – MPI_Barrier • 3-2. 時間計測関数 – MPI_Wtime 2015/10/23 8 /30 JAWS-UG HPC専門支部 #2 LT
  • 9. A. MPI_INIT 2015/10/23 9 /32 JAWS-UG HPC専門支部 #2 LT • MPI環境の初期化。 • すべてのMPIルーチンの最初に1回だけ必ず コールする必要がある。 • CALL MPI_INIT(ierr) – ierr: 完了コードが戻る
  • 10. B. MPI_FINALIZE 2015/10/23 10 /32 JAWS-UG HPC専門支部 #2 LT • MPI環境の終了処理。 • すべてのMPIルーチンの最後に1回だけ必ず コールする必要がある。 • CALL MPI_FINALIZE(ierr) – ierr: 完了コードが戻る
  • 11. C. MPI_COMM_RANK 2015/10/23 11 /32 JAWS-UG HPC専門支部 #2 LT • コミュニケーターcommで指定したグループ(職 場)内での自分(=コールしたプロセス)のランク (「名前・社員番号」)を取得する。 • CALL MPI_COMM_RANK(comm,rank,ierr) – comm: コミュニケーター(職場)を指定 (ここではMPI_COMM_WORLD、全体を指定します) – rank: commで指定したグループ内での自分(=コールした プロセス)のランク(名前・社員番号) – ierr: 完了コードが戻る
  • 12. D. MPI_COMM_SIZE 2015/10/23 12 /32 JAWS-UG HPC専門支部 #2 LT • コミュニケーターcommで指定したグループ(職 場)に含まれるプロセスの数を得る。 (プロセッサ数、並列数、「従業員数」) • CALL MPI_COMM_SIZE(comm,procs,ierr) – comm: コミュニケーター(職場)を指定 (ここではMPI_COMM_WORLD、全体を指定します) – procs: commで指定したグループ内に含まれるプロセス の数(「従業員数」) – ierr: 完了コードが戻る
  • 13. 並列版Helloプログラムの説明(1) (プログラム1, Fortran) program main include "mpif.h" common /mpienv/myid,numprocs integer myid, numprocs integer ierr call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr) print *, "Hello parallel world! Myid:", myid call MPI_FINALIZE(ierr) stop end 2015/10/23 13 /32 JAWS-UG HPC専門支部 #2 LT
  • 14. 並列版Helloプログラムの説明(2) (プログラム1, Fortran) program main include "mpif.h" common /mpienv/myid,numprocs integer myid, numprocs integer ierr call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr) print *, "Hello parallel world! Myid:", myid call MPI_FINALIZE(ierr) stop end 2015/10/23 14 /32 JAWS-UG HPC専門支部 #2 LT このプログラムは、全プロセス (全従業員)で起動される A. MPIの初期化 C. 自プロセスのID番号「社員番号」 (myid)を取得します。 (各プロセス・従業員で番号が異なります。) D. 全体のプロセッサ台数「従業員数」 (numprocs)を取得します。 (各プロセス・従業員で値は同じ) B. MPIの終了
  • 15. 並列版Helloプログラムの説明 (C言語、参考) #include <stdio.h> #include "mpi.h" int main(int argc, char* argv[]) { int myid, numprocs; int ierr, rc; ierr = MPI_Init(&argc, &argv); ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid); ierr = MPI_Comm_size(MPI_COMM_WORLD, &numprocs); printf("Hello parallel world! Myid:%d n", myid); rc = MPI_Finalize(); } 2015/10/23 15 /32 JAWS-UG HPC専門支部 #2 LT C言語では、関数名(MPI_Initなど)の 大文字・小文字の使い方が異なります C言語では、完了コード(ierr)を得る方法が異なります
  • 16. 並列版Hello実行結果 2015/10/23 16 /32 JAWS-UG HPC専門支部 #2 LT [tanabe@tanabe sample]$ mpif90 sample1.f90 -o sample1 (コンパイル) [tanabe@tanabe sample]$ mpirun -n 2 sample1 (2並列「従業員数2名」で実行) Hello parallel world! Myid: 0 Hello parallel world! Myid: 1 [tanabe@tanabe sample]$ (全プロセス「従業員」に対してHello parallel world! と、ランク「名前・社員番号」を表示する。 同じ処理を実行しているが、Myidの値で結果が変わる。)
  • 17. E. MPI_SEND 2015/10/23 17 /32 JAWS-UG HPC専門支部 #2 LT • 1対1ブロッキング通信サブルーチン(送信) • 送信メッセージを宛先プロセスに送信。 – 特定の従業員に「仕事を指示する」作業 • ただし、その人が聞いているとは限らない。 →指示した従業員に案件番号を指定し指示を聞いてもらう作業が必要 • 送信したメッセージはMPI_RECVで受信する。 Myid=0 Myid=1 Myid=2 MPI_SEND!! MPI_RECVで 受信!! メッセージ
  • 18. E. MPI_SEND 2015/10/23 18 /32 JAWS-UG HPC専門支部 #2 LT • CALL MPI_SEND(buf,count,datatype, dest,tag,comm,ierr) – buf: 送信バッファーの先頭アドレス(変数) – count: 送信メッセージの要素数 (※バイト数ではない) – datatype: 送信メッセージのデータ型 – dest: 宛先プロセスのcomm内のランク(名前・社員番号) – tag: 送信メッセージの種類を区別するタグ メッセージの「案件番号」 – comm: コミュニケーター「職場」を指定 (ここではMPI_COMM_WORLD、全体を指定します) – ierr: 完了コードが戻る
  • 19. F. MPI_RECV 2015/10/23 19 /32 JAWS-UG HPC専門支部 #2 LT • 1対1ブロッキング通信サブルーチン(受信) • 送信元プロセスから送信されたメッセージを受 信する。 – 特定の誰かから「仕事の依頼を受ける」作業 • ただし、その人への指示、受けるべき依頼とは限らない。 →受けるべき特定の誰かからの指示、案件内容が必要 • MPI_SENDで送信したメッセージを受信する。 Myid=0 Myid=1 Myid=2 MPI_SENDで 送信した!! MPI_RECVで 受信!! メッセージ
  • 20. F. MPI_RECV 2015/10/23 20 /32 JAWS-UG HPC専門支部 #2 LT • CALL MPI_RECV(buf,count,datatype, source,tag,comm,status,ierr) – buf: 受信バッファーの先頭アドレス(変数) – count: 受信バッファーの要素数 (※バイト数ではない) – datatype: 受信メッセージのデータ型 – source: 送信するプロセスのcomm内のランク(名前・社員番号) – tag: 送信メッセージの種類を区別するタグ「案件番号」 – comm: コミュニケーター「職場」を指定 (ここではMPI_COMM_WORLD、全体を指定します) – status: 受信状況に関する情報(整数配列) – ierr: 完了コードが戻る
  • 21. 並列版送受信プログラムの説明(1) (プログラム2, Fortran) program main include “mpif.h” common /mpienv/myid,numprocs integer myid, numprocs integer isbuf, irbuf, ierr integer istatus(MPI_STATUS_SIZE) call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr) if (myid.eq.0) then isbuf = 19750617 endif (続く) 2015/10/23 21 /32 JAWS-UG HPC専門支部 #2 LT myid(ランク・社員番号)が0のプロセスの 変数isbufの変数を代入 MPI_RECVの処理で 必要な変数 受信状況に関する 情報(整数配列) 準 備
  • 22. 並列版送受信プログラムの説明(2) (プログラム2, Fortran) (続く) if (myid.eq.0) then call MPI_SEND (isbuf,1,MPI_INTEGER,1,1,MPI_COMM_WORLD,ierr) elseif (myid.eq.1) then call MPI_RECV (irbuf,1,MPI_INTEGER,0,1,MPI_COMM_WORLD, istatus, ierr) endif if (myid.eq.1) then write(*,*) "IRBUF =",irbuf endif call MPI_FINALIZE(ierr) stop end 2015/10/23 22 /32 JAWS-UG HPC専門支部 #2 LT Myid(ランク・社員番号)が1のプロセス の変数irbufの内容を確認する。 Myid=0のプロセス(従業員)から、 Myid=1のプロセス(従業員)にデータが 送信されている! 0から1に送信!! 0から来たメッセージ を1が受信!! 処 理 の 決 定 「案件番号」は1
  • 23. 並列版送受信実行結果 2015/10/23 23 /32 JAWS-UG HPC専門支部 #2 LT [tanabe@tanabe sample]$ mpif90 sample2.f90 -o sample2 (コンパイル) [tanabe@tanabe sample]$ mpirun -n 2 sample2 (2並列、従業員数2名で実行) IRBUF = 19750617 (従業員Myid=1に対して、従業員Myid=0から送信された整数値 を受信できたことを確認する。) Myid=0 Myid=1 MPI_SENDで 送信した!! MPI_RECVで 受信!! 19750617 確認
  • 24. G. MPI_BARRIER 2015/10/23 24 /32 JAWS-UG HPC専門支部 #2 LT • コミュニケーターcomm「職場」内の全プロセス 「全従業員」間で同期をとる関数 – ある職場の共同作業で、全部の結果が揃わないと 次の作業ができない場合に、最後まで待つ • CALL MPI_BARRIER(comm, ierr) – comm:コミュニケーター「職場」を指定 (ここではMPI_COMM_WORLD、全体を指定します) – ierr: 完了コードが戻る
  • 25. H. MPI_WTIME 2015/10/23 25 /32 JAWS-UG HPC専門支部 #2 LT • 時刻を得る関数。 (※たぶんUnix時間) • 経過時間の測定をしたい部分の前後で実行し、 得られた値elpの差を取ると、その部分の実行 時間が得られる。 • elp = MPI_WTIME () – elp: ある過去の時点からの経過時間(秒)
  • 26. 時刻同期プログラムの説明(1) (プログラム3, Fortran) program main implicit none include "mpif.h" common /mpienv/myid,numprocs integer myid, numprocs integer ierr integer*8 i, j, iinput, ioutput real*8 elp1, elp2 call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr) (続く) 2015/10/23 26 /32 JAWS-UG HPC専門支部 #2 LT 計算で必要な変数 時間計測で必要な変数 心 の 準 備
  • 27. 時刻同期プログラムの説明(2) (プログラム3, Fortran) (承前) ! preparation elp1 = MPI_WTIME() iinput=0 do i=1, 50000*(myid+1) do j=1, 50000 iinput = iinput + 1 enddo enddo ! mpi_barrier call MPI_BARRIER(MPI_COMM_WORLD, ierr) ! summation ioutput=0 do i=1, 50000 do j=1, 50000 ioutput = ioutput + 1 enddo enddo write(*,*) iinput, ioutput, 'myid=' , myid (続く) 2015/10/23 27 /32 JAWS-UG HPC専門支部 #2 LT (作業1) Myid(ランク)の値に応じた回数 だけ足し算を行う。 (従業員により、かかる時間が異なる) (作業2) 決まった回数だけ足し算を行う。 (従業員間でかかる時間はあまり変わらない) 結果の確認 全プロセスの同期を取る (全従業員の作業が終わるまで待つ) 時間の測定(計算前) 作 業 1 作 業 2
  • 28. 時刻同期プログラムの説明(3) (プログラム3, Fortran) 2015/10/23 28 /32 JAWS-UG HPC専門支部 #2 LT • MPI_BARRIERで同期 • 同期しない場合 Myid=0 Myid=1 Myid=2 MPI_BARRIERで 全プロセスの同期を取る (全従業員の作業が終わ るまで待つ) 作業1 作業2経過時間 Myid=0 Myid=1 Myid=2 作業2を行うためには、作 業1を終わらせなくてはい けない! そのために、同期が必要 なはず。 意図した動作が行われな い!!
  • 29. (承前) elp2 = MPI_WTIME() write(*,*) 'ELAPSE=', elp2-elp1, 'myid=',myid call MPI_FINALIZE(ierr) stop end 時間の測定(計算後) 時刻同期プログラムの説明(4) (プログラム3, Fortran) 2015/10/23 29 /32 JAWS-UG HPC専門支部 #2 LT 計算前後時間の差を取る(経過時間)
  • 30. 並列版時刻同期実行結果 2015/10/23 30 /32 JAWS-UG HPC専門支部 #2 LT [tanabe@tanabe sample]$ mpif90 sample3.f90 –o sample3 (コンパイル) [tanabe@tanabe sample]$ mpirun –n 2 sample3 (2並列、「従業員数2名」で実行) 5000000000 2500000000 myid= 1 ELAPSE= 31.489058017730713 myid= 1 2500000000 2500000000 myid= 0 ELAPSE= 33.371865987777710 myid= 0 MPI_BARRIERをしなかった場合 2500000000 2500000000 myid= 0 ELAPSE= 19.314102172851563 myid= 0 5000000000 2500000000 myid= 1 ELAPSE= 28.772753953933716 myid= 1 同期がとれていて、 プロセス間で経過時間の違 いは(そんなに)ない。 同期がとれていないので、 プロセスごとに経過時間が バラバラ。
  • 31. 最後に 2015/10/23 31 /32 JAWS-UG HPC専門支部 #2 LT • HPC、大規模計算のためには並列化、特にメ モリ分散型計算機(クラスター)を使います。 • メモリ分散型計算機で並列計算を行うために はMPIによる実装が(今のところ)必須です。 • MPIのサブルーチンの数は多いが、少数の基 礎的なもので入門可能です。 • この業界にいながら、職種の関係で クラスター構築の経験がほぼないのが悩み。
  • 32. 参考となりそうな文献など 2015/10/23 32 /32 JAWS-UG HPC専門支部 #2 LT • スパコンプログラミング入門: 並列処理とMPIの学習 (片桐 孝洋 著、東京大学出版会) ※他にも、OpenMPなどに着目した著書などもあり • 並列プログラミング虎の巻MPI版 (青山 幸也 著、高度情報科学技術研究機構) ※OpenMP、チューニングのテキストもあり http://www.hpci-office.jp/pages/seminar_text • MPICHサイト https://www.mpich.org/ • OpenMPIサイト http://www.open-mpi.org/ などなど • サンプルプログラムは、Githubにあります https://github.com/sittncs/hpcstudy/