並列処理論2

Size: px
Start display at page:

Download "並列処理論2"

Transcription

1 並列処理のためのプログラミング環境 1

2 並列処理プログラミング 解くべき問題 アルゴリズム 逐次型 並列型 プログラミング 逐次言語 拡張言語 並列言語 逐次言語 + 並列化ライブラリ 言語 並列化 コンパイラ 並列性解析 抽出 タスクスケジューリング マシンコード生成 OS 並列コンピュータ 2

3 並列処理プログラミング 解くべき問題 アルゴリズム 逐次型 並列型 プログラミング言語並列化コンパイラ 逐次言語拡張言語並列言語 並列化は行われていない 並列性解析 抽出タスクスケジューリング 逐次言語 + 並列化ライブラリ マシンコード生成 OS 並列コンピュータ 3

4 並列処理プログラミング 解くべき問題 アルゴリズム 逐次型 並列型 人手による 並列化が必要 プログラミング 逐次言語 拡張言語 並列言語 逐次言語 + 並列化ライブラリ 言語 並列化 コンパイラ 並列性解析 抽出 タスクスケジューリング マシンコード生成 OS 並列コンピュータ 4

5 並列処理プログラミング 解くべき問題 並列型アルゴリズムが必要 アルゴリズム 逐次型 並列型 プログラミング言語並列化コンパイラ 逐次言語拡張言語並列性解析 抽出タスクスケジューリング 並列言語逐次言語 + 並列化ライブラリ アルゴリズムの並列性以外の並列化は必要 マシンコード生成 OS 並列コンピュータ 5

6 並列処理プログラミング 解くべき問題 アルゴリズム 逐次型 並列型 並列化は行われていない プログラミング言語並列化コンパイラ 逐次言語拡張言語並列言語逐次言語 + 並列化ライブラリ 並列性解析 抽出 タスクスケジューリング 並列化のすべてをコンパイラが行う マシンコード生成 OS 並列コンピュータ 6

7 並列処理プログラミング 解くべき問題 アルゴリズムプログラミング言語並列化コンパイラ 逐次型逐次言語 並列性解析 抽出タスクスケジューリング 並列型 並列化が行われている 拡張言語並列言語逐次言語 + 並列化ライブラリ 残された並列化をコンパイラが行う マシンコード生成 OS 並列コンピュータ 7

8 並列処理プログラミング 解くべき問題 ( 一部 ) 並列化が行われている アルゴリズム 逐次型 並列化のための書換え 並列型 プログラミング 逐次言語 拡張言語 並列言語 逐次言語 + 並列化ライブラリ 言語 並列化 コンパイラ 並列性解析 抽出 タスクスケジューリング マシンコード生成 OS 並列コンピュータ 8

9 並列処理プログラミングモデル プログラミングモデル ( ソフトウェア的な通信モデル ) の観点からは次の二つに分類される. 共有変数型 ( 単一メモリ空間型 ) メッセージ転送型 9

10 共有変数型 異なるプロセッサ上のプロセス間で変数を共有共有変数を介してプロセス間通信 ポインタ変数などの扱いが楽 共有メモリ型や分散共有メモリ型並列計算機上で用いられることが多い物理的にメモリを共有する必要は必ずしも無い OS サポートなど 分散メモリ型並列計算機での実装では性能低下は大 代入 P0 P1 参照 共有変数 10

11 メッセージ転送型 異なるプロセッサ上のプロセス間での通信手段 メッセージ転送のみ変数のパッキングなどが必要 送信側と受信側のプロセッサが協調してデータ転送 分散メモリ型並列計算機上で用いられることが多い共有メモリ型並列計算機でも実現可能 共有メモリ上に通信チャネルを用意する P0 P1 send receive 11

12 プログラミングモデルと H/W の構成 ハードウェア構成とプログラミングモデルを無関係にしたい. ハードのメモリ制御 ( キャッシュ制御を含む ) 機構や通信制御機構 通信ライブラリ ソフトウェア分散共有メモリ コンパイラ パフォーマンス向上には H/W 構成に適したプログラミングが必要. -PGAS: Partitioned Global Address Space モデル例 ) UPC(Unified Parallel C), CAF(co-Array Fortran) 12

13 並列処理を可能とする OS 環境 並列コンピュータ上での並列処理を実現する OS 機能 プロセス間並列 ( マルチタスキング ) 単一 PE での複数プロセスの並行処理の発展形 プログラム中のタスク群を複数のプロセスに割り当て, それらを複数プロセッサで実行する. スレッド間並列 ( マルチスレッディング ) ひとつのプロセスをさらにスレッドに分割しそれらを複数 PE で実行する. プログラム中のタスク群はスレッド群に割り当て, それらを複数 PE で実行する. 13

14 プロセス間並列 例 ) 1PE での複数プロセスの並行処理 プロセス b プロセス a2 プロセス a1 時間 実行中 アイドルコンテキストスイッチ プロセス生成 14

15 プロセス間並列 例 ) 1PE での複数プロセスの並行処理 プロセス b プロセス a2 プロセス a1 時間 例 ) 2PE での複数プロセスの並列 / 並行処理 プロセス b プロセス a3 PE1 実行中 アイドルコンテキストスイッチ プロセス生成 プロセス a2 プロセス a1 時間 PE2 15

16 プロセス間並列 プロセスの生成 終了 待合せのための機能 fork(), exit(), wait() などの関数 プロセス間データ授受 (IPC) のための機能 データ転送 パイプ, ソケット, メッセージキュー など データ共有共有メモリ領域 : 複数プロセスのメモリ空間の一部をオーバーラップ 同期 シグナル, セマフォ など 各種操作のコストが大きい. プロセス生成, コンテキストスイッチ, 同期, 通信 16

17 スレッド間並列 ( マルチスレッド :MT) スレッド : 同一プロセス内で複数制御フロー ( スレッド ) を用意. 個別の制御フローを個別のスレッドに対応させる. スレッドを PE へのスケジュール単位とする. 同一プロセスのスレッドはアドレス空間を共有. メモリ管理の負荷が小さい 通信 同期のコストが小さい スレッド固有情報 ( プログラムカウンタ, スタックポインタ, レジスタセット ) がプロセス情報 ( アドレス空間, ユーザ ID,etc.) より少ない. スレッド生成や各種操作のコストが小さい. 17

18 スレッド間並列 ( マルチスレッド :MT) スレッド : プロセス b プロセス a スレッド1 スレッド3 スレッド2 スレッド1 PE1 PE2 時間 実行中 アイドルコンテキストスイッチ スレッド生成 18

19 並列プログラミング環境 逐次言語 + マルチタスキング 逐次言語 + マルチスレッド 逐次言語 + メッセージ通信ライブラリ例 ) MPI (Message Passing Interface) 逐次言語 + コンパイラディレクティブ (+α) 例 ) OpenMP,OpenACC 並列言語例 ) HPF (High Performance Fortran) 逐次言語 + 自動並列化コンパイラ 19

20 並列プログラミング環境 参考書 / 例題プログラムの出典 はじめての並列プログラミング 20

21 マルチタスキングによる並列処理 fork システムコールにより複数プロセスを立ち上げての並列処理 ( 並行処理 ) ( 親 ) プロセスが fork 関数を呼び出すと, 子プロセスが生成される. 子プロセス環境は親プロセスの環境が複製される. 親プロセスと子プロセスは fork 関数呼出しから戻ったところからそれぞれ実行を再開. fork 関数の戻り値は, 子プロセスでは 0 となり, 親プロセスでは子プロセスのプロセス ID となる. 子プロセスでは, 処理終了後 exit() システムコールなどでプロセスを終了する. 親プロセス, 子プロセス間では共有変数などを用いてデータの授受を行う. 21

22 マルチタスキング - 例題プログラム #include <sys/shm.h> #include <sys/types.h> #include <sys/ipc.h> #include <stdio.h> pid_t pid1, pid2; int shared_mem_id; int *shared_mem_ptr; int main() { int *rc1, *rc2; int arg1[2] = {1,5}, arg2[2] = {6,10}; int status; 和を部分和として二つのプロセスで求めるプログラム shared_mem_id=shmget(ipc_private, 2*sizeof(int),0666); shared_mem_ptr=shmat(shared_mem_id,0,0); rc1 = shared_mem_ptr; rc2 = (shared_mem_ptr+1); 続く 22

23 マルチタスキング - 例題プログラム if((pid1=fork())==0){ *rc1=sum(&arg1); exit(0); } if((pid2=fork())==0){ *rc2=sum(&arg2); exit(0); } } waitpid(pid1, status, 0); waitpid(pid2, status, 0); 和を部分和として二つのプロセスで求めるプログラム int sum(int *arg_ptr) { int min = *arg_ptr; int max = *(arg_ptr+1); int i, sum; for (i=min,sum =0;i<=max;i++) sum += i; return sum; } printf("%d %d n", *rc1,*rc2); printf("%d+..+%d=%d n", arg1[0],arg2[1], *rc1 + *rc2); 続く 23

24 マルチタスキング - 例題プログラム #include <sys/shm.h> #include <sys/types.h> #include <sys/ipc.h> #include <stdio.h> pid_t pid1, pid2; プロセスID 変数 int shared_mem_id; int *shared_mem_ptr; int main() { int *rc1, *rc2; int arg1[2] = {1,5}, arg2[2] = {6,10}; int status; 和を部分和として二つのプロセスで求めるプログラム ヘッダファイルの読み込み 共有変数管理のための変数 共有変数へのポインタ変数 共有変数領域 ID の確保 shared_mem_id=shmget(ipc_private, 2*sizeof(int),0666); shared_mem_ptr=shmat(shared_mem_id,0,0); rc1 = shared_mem_ptr; rc2 = (shared_mem_ptr+1); 共有変数領域開始アドレス 続く 24

25 マルチタスキング - 例題プログラム 子プロセスを生成 : 戻り値は子プロセスには 0 親プロセスには子プロセス ID if((pid1=fork())==0){ *rc1=sum(&arg1); exit(0); } 和を部分和として二つのプロセスで求めるプログラム 子プロセスなら sum を実行し結果を共有変数へ代入親プロセスは子プロセス ID を得る } if((pid2=fork())==0){ *rc2=sum(&arg2); exit(0); } waitpid(pid1, status, 0); waitpid(pid2, status, 0); 子プロセスなら sum を実行し結果を共有変数へ代入親プロセスは子プロセス ID を得る 子プロセスの終了を待つ 子プロセスの終了を待つ printf("%d %d n", *rc1,*rc2); printf("%d+..+%d=%d n", arg1[0],arg2[1], *rc1 + *rc2); 共有変数を参照する続く 25

26 マルチタスキング - 例題プログラム int sum(int *arg_ptr) { int min = *arg_ptr; int max = *(arg_ptr+1); int i, sum; 和を部分和として二つのプロセスで求めるプログラム } for (i=min, sum =0; i<= max; i++) sum += i; return sum; 26

27 マルチタスキングによる並列処理 プロセス間での 同期 ( セマフォ ): semop 関数など データ授受 : msgsnd/msgrcv 関数など 27

28 マルチスレッディングによる並列処理 スレッドライブラリを使用しスレッドコントロール スレッドライブラリはスレッドコントロールのための API を提供している. 28

29 MT- 例題プログラム #include <pthread.h> #include <stdio.h> extern int *sum(int *); pthread_t th1, th2; 和を部分和として二つのスレッドで求めるプログラム int main() { int *ps1, *ps2; int arg1[2]={1,5}, arg2[2] = {6,10}; pthread_create(&th1,null,(void*(*)(void*))sum,&arg1); pthread_create(&th2,null,(void*(*)(void*))sum,&arg2); pthread_join(th1, (void**)&ps1); pthread_join(th2, (void**)&ps2); } printf("%d+..+%d=%d n", arg1[0], arg2[1], *ps1+*ps2); free(ps1); free(ps2); 続く 29

30 MT- 例題プログラム int *sum(int *arg_ptr) { int lb = *arg_ptr; int ub = *(arg_ptr+1); int i, sum; int *p; 和を部分和として二つのスレッドで求めるプログラム for (i=lb, sum =0; i<= ub; i++) { sum += i;} } p =(int *)malloc(sizeof(int)); *p = sum; return p; 30

31 MT- 例題プログラム #include <pthread.h> #include <stdio.h> extern int *sum(int *); pthread_t th1, th2; スレッド ID 変数 int main() { int *ps1, *ps2; int arg1[2]={1,5}, arg2[2] = {6,10}; 和を部分和として二つのスレッドで求めるプログラム ヘッダファイルの読み込み スレッド開始関数への引数 二つのスレッド生成 スレッド開始関数 pthread_create(&th1,null,(void*(*)(void*))sum,&arg1); pthread_create(&th2,null,(void*(*)(void*))sum,&arg2); } pthread_join(th1, (void**)&ps1); pthread_join(th2, (void**)&ps2); スレッドの終了待ち スレッド終了状態 printf("%d+..+%d=%d n", arg1[0], arg2[1], *ps1+*ps2); free(ps1); free(ps2); 続く 31

32 MT- 例題プログラム int *sum(int *arg_ptr) { int lb = *arg_ptr; int ub = *(arg_ptr+1); int i, sum; int *p; 和を部分和として二つのスレッドで求めるプログラム スレッドローカルな変数 for (i=lb, sum =0; i<= ub; i++) { sum += i;} } p =(int *)malloc(sizeof(int)); *p = sum; return p; p が終了ステータスとして通知される pthread_exit(p); でも OK スレッド外からもアクセスできるように 32

33 マルチスレッディングによる並列処理 スレッド間の同期 相互排除 pthread_mutex_lock(&mt) pthread_mutex_unlock(&mt) pthread_mutex_trylock(&mt) mt は同期変数 : pthread_mutex_t mt 条件同期 pthread_cond_wait(&ct, &mt) pthread_cond_signal(&mt) pthread_cond_broadcast(&mt) ct は同期変数 : pthread_cond_t ct など 33

34 MT- 相互排除 #include <pthread.h> #include <stdio.h> extern int *sum(int *); pthread_t th1, th2; pthread_mutex_t mt = PTHREAD_MUTEX_INITIALIZER; int gsum; int main() { int *ps1, *ps2; int arg1[2]={1,5}, arg2[2] = {6,10}; 和を部分和として二つのスレッドで求めるプログラム または pthread_mutex_init(&mt, NULL); } pthread_create(&th1,null,(void*(*)(void*))sum,&arg1); pthread_create(&th2,null,(void*(*)(void*))sum,&arg2); pthread_join(th1, (void**)&ps1); pthread_join(th2, (void**)&ps2); printf("%d+..+%d=%d n", arg1[0], arg2[1], gsum); free(ps1); free(ps2); 続く 34

35 MT- 相互排除 int *sum(int *arg_ptr) { int lb = *arg_ptr; int ub = *(arg_ptr+1); int i, sum; 和を部分和として二つのスレッドで求めるプログラム for (i=lb, sum =0; i<= ub; i++) { sum += i;} pthread_mutex_lock(&mt); gsum=gsum+sum; pthread_mutex_unlock(&mt); } return 0; 35

36 MPI(Message-Passing Interface) メッセージ通信ライブラリ ( の API 仕様 ) プロセス間でのデータ授受のための通信関数のライブラリ ( 百数十 ) [1]. バージョン 1994 May MPI June MPI 3.1 MPI 4.0 複数プロセスが協調して動作する並列実行モデルプログラム開始時に複数プロセスが一斉に実行を開始し, 一斉に終了する (MPI-1) 例 ) mpirun np 8 my_program [1] MPI Forum 36

37 MPI(Message-Passing Interface) メッセージは次の三つの組で指定される 通信範囲を示すプロセスグループ ( コミュニケータ ) プロセスグループ中でのプロセスID( ランク ) 通信の識別子 ( タグ ) 37

38 MPI ー例題プログラム #include mpi.h int main(int argc, char **argv) { int myrank, error, buffer MPI_Status status; MPI_Init(&argc, &argv); プロセス間でデータを授受するプログラム MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank == 0) { error = MPI_Send(&buffer, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD); } else if (myrank == 1) { error = MPI_Recv(&buffer, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD, &status); } MPI_Finalize(); } 38

39 MPI ー例題プログラム #include mpi.h int main(int argc, char **argv) { int myrank, error, buffer } MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank == 0) { MPI プログラムの全体の枠組み ヘッダファイルの読み込み MPI ライブラリの初期化 error = MPI_Send(&buffer, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD); } else if (myrank == 1) { error = MPI_Recv(&buffer, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD, &status); } MPI_Finalize(); MPIライブラリの終了処理 39

40 MPI ー例題プログラム #include mpi.h int main(int argc, char **argv) { int myrank, error, buffer MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank == 0) { error = MPI_Send(&buffer, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD); } else if (myrank == 1) { メッセージの送受信送受信で指定する情報 バッファの指定 : 先頭アドレス, 個数, 型 相手と文脈の指定 : ランク, タグ, コミュニケータ error = MPI_Recv(&buffer, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD, &status); } MPI_Finalize(); } 40

41 MPI ー例題プログラム #include mpi.h int main(int argc, char **argv) { int myrank, error, buffer MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank == 0) { error = MPI_Send(&buffer, 1, MPI_INT, } } else if (myrank == 1) { } 1, 1234, MPI_COMM_WORLD); error = MPI_Recv(&buffer, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD, &status); MPI_Finalize(); メッセージの送受信送受信で指定する情報 バッファの指定 : 先頭アドレス, 個数, 型 相手と文脈の指定 : ランク, タグ, コミュニケータ 受信状態 受信メッセージのランクやタグ ( ワイルドカード受信の際に利用 ) など 41

42 MPI ー例題プログラム #include mpi.h int main(int argc, char **argv) { int myrank, error, buffer MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank == 0) { error = MPI_Send(&buffer, 1, MPI_INT, } else if (myrank == 1) { プロセスの識別プログラム中の各プロセスにランクが付加されそれで区別する 自プロセスのランクの取得 自分のランクが 0 の場合 1, 1234, MPI_COMM_WORLD); 自分のランクが 1 の場合 error = MPI_Recv(&buffer, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD, &status); } MPI_Finalize(); } 42

43 MPI ー双方向通信例題プログラム 双方向送受信をしたい. 次のコードは動作するか? if (myrank == 0) { MPI_Send(&sb, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD); MPI_Recv(&rb, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD, &status); } else if (myrank == 1) { MPI_Send(&sb, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD); MPI_Recv(&rb, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD, &status); } ブロッキング send/receive のためデッドロック! 43

44 MPI ー双方向通信例題プログラム 双方向送受信をしたい. 次のコードは動作するか? if (myrank == 0) { MPI_Recv(&rb, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD, &status); MPI_Send(&sb, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD); } else if (myrank == 1) { MPI_Recv(&rb, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD, &status); MPI_Send(&sb, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD); } send/receive の順序を入れ替えてもだめ 44

45 MPI ー双方向通信例題プログラム 双方向送受信をしたい. 次のコードは動作するか? if (myrank == 0) { MPI_Send(&sb, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD); MPI_Recv(&rb, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD, &status); } else if (myrank == 1) { MPI_Recv(&rb, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD, &status); MPI_Send(&sb, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD); } 双方の順序を逆にする必要 45

46 MPI ー双方向通信例題プログラム ノンブロッキングの Isend と Wait if (myrank == 0) { MPI_Isend(&sb, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD, &id); MPI_Recv(&rb, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD, &rstatus); MPI_Wait(&id, &wstatus); } else if (myrank == 1) { MPI_Isend(&sb, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD, &id); MPI_Recv(&rb, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD, &status); MPI_Wait(&id, &wstatus); } Isend ではブロッキングせずに receive に移行 46

47 MPI ー双方向通信例題プログラム 双方向送受信を指示する関数 if (myrank == 0) { MPI_Sendrecv(&sb, 1, MPI_INT, 1, 1234, &rb, 1, MPI_INT, 1, 1234, MPI_COMM_WORLD, &status); } else if (myrank == 1) { } MPI_Sendrecv(&sb, 1, MPI_INT, 0, 1234, &rb, 1, MPI_INT, 0, 1234, MPI_COMM_WORLD, &status); 47

48 MPI ー集団通信関数 典型的な通信パターンに対応する集団通信関数 交換 MPI_Sendrecv ブロードキャスト MPI_Bcast gather MPI_Gather

49 MPI ー集団通信関数 典型的な通信パターンに対応する集団通信関数 scatter MPI_Scatter all gather MPI_Allgather all to all MPI_Alltoall 1234 abcd 1aA@ 2bB! 3cC% 4dD 49

50 MPI ー集団通信関数 集団通信関数の利点 send/receive の組み合わせより プログラムの意図が明確になる ハードウェアで集団通信の機能がある場合, それを利用し MPI 実装であれば通信効率が良い バリア同期関数 MPI_Barrier 50

51 MPI ーまとめ 分散メモリ型並列計算機向きの並列プログラムAPI MPICH2 [3],Open MPI [2] の実装が有名 参考書 MPI 並列プログラミング : P.Pacheco 著, 秋葉博訳 実践 MPI-2: W. Groppほか著畑崎隆雄訳 参考サイト [1] MPI Forum [2] [3] [4] 51

52 OpenMP 共有メモリ型並列計算機上での並列プログラミングのために, コンパイラ指示文, 実行時ライブラリ, 環境変数でベース言語 (C/C++, Fortran) を拡張する. バージョン 1997 Oct. Fortran ver Oct. C/C++ ver July ver Nov. ver. 4.5 並列実行 ( 同期 ) はコンパイラ指示文として記述 ループなどに対しては自動的な負荷分散が可能 52

53 OpenMP コンパイラ指示文 Fortran では directive!$omp... C では pragma #pragma omp... 指示文を無視すれば逐次実行可能 インクリメンタルに並列化が可能 プログラム開発が容易 逐次版と並列版が同じソースで管理できる 53

54 OpenMP ー実行モデル マルチスレッド上での fork-join モデル Parallel Region 複数のスレッドで重複して実行する部分を指定する #pragma omp parallel { sub(); マスタスレッド } fork マスタスレッド スレーブスレッド call sub() call sub() call sub() call sub() join マスタスレッド 54

55 OpenMP ー Parallel Region #pragma omp parallel { 和計算のプログラムスレッドプライベート変数 int chunk,start,end,psum; chunk = 100/omp_get_num_threads(); start = chunk*omp_get_thread_num(); end = start + chunk; psum = 0; for(i=start; i < end; i++) psum += a[i]; #pragma omp atomic sum += psum; } 55

56 OpenMP ー Parallel Region 和計算のプログラム #pragma omp parallel { int chunk,start,end,psum; スレッド数を得る関数 chunk = 100/omp_get_num_threads(); start = chunk*omp_get_thread_num(); end = start + chunk; スレッドIDを得る関数 psum = 0; for(i=start; i < end; i++) psum += a[i]; #pragma omp atomic sum += psum; } k = ceil(n/np) lb= k*(p-1)+1 ub= min(k*p,n) do i=lb,ub ループボディ enddo 56

57 OpenMP ー Parallel Region 和計算のプログラム #pragma omp parallel { int chunk,start,end,psum,i; chunk = ceil((float)100/omp_get_num_threads()); start = chunk*omp_get_thread_num(); end = start + chunk <100? start + chunk : 100; psum = 0; for(i=start; i < end; i++) psum += a[i]; #pragma omp atomic sum += psum; } k = ceil(n/np) lb= k*(p-1)+1 ub= min(k*p,n) do i=lb,ub ループボディ enddo 57

58 OpenMP ー変数の共有 int i; int j; #pragma omp parallel { int k; i =.. j =.. k =.. スレッド間シェアード変数 } スレッドプライベート変数 58

59 OpenMP ー変数の共有 int i; int j; #pragma omp parallel private(j) { int k; スレッド間シェアード変数 i =.. j =.. k =.. } スレッドプライベート変数 59

60 OpenMP ー Work sharing Parallel region 内で複数のスレッドで分担して実行する部分を指定する #pragma omp sections { #pragma omp section { sub1(); } #pragma omp section } { sub2(); } sections の最後でバリア同期 60

61 OpenMP ー Work sharing Parallel region 内で複数のスレッドで分担して実行する部分を指定する 並列ループ #pragma omp for for ( ; ; ) { } スケジューリング : スタティック, ダイナミック (chunk, guided) を指定可 schedule(static, チャンクサイズ ) schedule(dynamic, チャンクサイズ ) schedule(guided, チャンクサイズ ) schedule(runtime) for の最後でバリア同期 61

62 OpenMP ー Work sharing 並列ループ ループの制御変数は自動的にスレッドプライベート変数に #pragma omp for for (i=0; i<n; i++) a[i]=b[i]+c[i]; スレッドプライベート変数の明示が必要 #pragma omp for private(t) for (i=0; i<n; i++){ t=b[i]+c[i]; a[i]=t/2; } 62

63 OpenMP ー Work sharing 並列ループ ループの制御変数は自動的にスレッドプライベート変数に #pragma omp for for (i=0; i<n; i++) a[i]=b[i]+c[i]; #pragma omp for for (i=0; i<n; i++) for (j=0; j<n; j++) スレッドプライベート変数の明示が必要 private(j) a[i][j]=b[i][j]+c[i][j]; 63

64 OpenMP ー同期 バリア同期チーム内のスレッドがバリアに到達するまで待つ #pragma omp barrier クリティカルセクション #pragma omp critical { } アトミック命令メモリの更新をアトミックに行う #pragma omp atomic 文 (x++, x+=..., など ) マスタスレッドのみ実行他のスレッドは素通り #pragma omp master { } 64

65 OpenMP ー同期 単一のスレッドのみ実行他のスレッドはバリア同期で待っている #pragma omp single { } paralle for のボディの一部を逐次と同順で実行 #pragma omp for ordered... #pragma omp ordered { } メモリの一貫性保障 #pragma omp flush( 変数名 ) メモリコンシステンシモデルは weak consistency 65

66 OpenMP ー実行時ライブラリ ( 逐次内で ) 次の parallel region でのスレッド数を指定 omp_set_num_threads(int) parallel region 内で動作中のスレッド数を返す omp_get_num_threads() 利用できるスレッド数を返す omp_get_max_threads() スレッド id を返す omp_get_thread_num() 利用できるプロセッサ数を返す omp_get_num_procs() lock 関数 omp_set_lock(omp_lock_t) omp_unset_lock(omp_lock_t) 66

67 OpenMP ー環境変数 parallel region でのスレッド数を指定 OMP_NUM_THREADS 並列ループのスケジューリング方法を指定 OMP_SCHEDULE 67

68 OpenMP 共有メモリ型並列計算機向きの並列実行モデルと API インクリメンタルな並列化をサポート 参考書 OpenMP 入門北山洋幸著 C/C++ フ ロク ラマーのための OpenMP 並列フ ロク ラミンク ( 第 2 版 ) 菅原清文著 並列フ ロク ラミンク 入門 : サンフ ルフ ロク ラムで学ぶ OpenMP と OpenACC 片桐孝洋著 gcc(ver. 4.2~) でもサポート 68

69 OpenACC 主にアクセラレータ ( 例 :GPU) の並列プログラミングのために, コンパイラ指示文, 実行時ライブラリ, 環境変数でベース言語 (C/C++,Fortran) を拡張する. バージョン ( 原型 :PGI Accelerator Programming Model) 2011 Nov. ver Oct. ver Nov. ver. 2.6 並列実行 ( 同期 ) はコンパイラ指示文として記述 ループなどに対しては自動的な負荷分散が可能 69

70 OpenACC OpenMPと同じアプローチ コンパイラ指示文 指示文を無視すれば逐次実行可能 GPU 等のアクセラレータ特有の性質に対応 並列ループをオフロード ( アクセラレータに任す ) CPUメモリとGPUメモリ間でのデータ転送 CPU GPU メインメモリ デバイスモリ 70

71 OpenACC オフロードしたい並列ループの指定 while(err > s) { #pragma acc kernels for (i=0; i<n; i++){ } t[i]= a[i] ; #pragma acc kernels for (i=0:, i<n; i++){ } } a[i]= t[i] ; GPU 用コードの生成データ転送コードの生成 CPU->GPU: a[] GPU->CPU: t[] GPU 用コードの生成データ転送コードの生成 CPU->GPU: t[] GPU->CPU: a[] 71

72 OpenACC 明示的なデータ転送指定 #pragma acc data copy(a), create(t) while(err > s) { #pragma acc kernels for (i=0; i<n; i++){ } t[i]= a[i] ; #pragma acc kernels for (i=0:, i<n; i++){ } } a[i]= t[i] ; データ転送コードの生成 CPU->GPU: a[] while 前 GPU->CPU: a[] while 後 GPU 内に配置する t[] 72

73 OpenACC アクセラレータ用の並列実行モデルと API CUDA,OpenCL といった低レベルでの GPU プログラミングが不要 プログラムのポータビリティの向上 gcc(ver. 5.1~) でもサポート 73

74 HPF(High Performance Fortran) 分散メモリ並列計算機での科学技術計算を対象 分散メモリ上へのデータ分割配置に主眼を置く. データアクセスの局所性を高める. プロセッサ間通信を減らす. データ分割をプログラマが明示的に指示する. プログラムの SPMD 化や通信コードの挿入はコンパイラが行う. SPMD(Single Program Multiple Data Stream) : 各プロセッサは同一プログラムを実行するが, プロセッサIDなどに基づき異なるコード ( 異なるイタレーションや異なるプログラム部分など ) を実行するモデル. 74

75 HPF ーデータの分割配置 分散メモリ並列計算機でのデータの分散配置例 ) 配列変数 X(100) ブロック分割プロセッサ 1 X(1)~X(25) プロセッサ 2 X(26)~X(50) プロセッサ 3 X(51)~X(75) プロセッサ 4 X(76)~X(100) サイクリック分割プロセッサ 1 X(1),X(5)...X(97) プロセッサ 2 X(2),X(6)...X(98) プロセッサ 3 X(3),X(7)...X(99) プロセッサ 4 X(4),X(8)...X(100) データの分割方法の違いによって並列処理の効率に大きな影響が現れる. 75

76 HPF ーデータの分割配置 PROGRAM EXAMPLE1 PARAMETER(N=100) REAL X(N), Y(N)!HPF$ PROCESSORS P(4)!HPF$ DISTRIBUTE X(BLOCK) ONTO P!HPF$ DISTRIBUTE Y(BLOCK) ONTO P DO I=2,N-1 Y(I) = X(I-1)+X(I)+X(I+1) ENDDO プロセッサ 1 X(1:25) Y(1:25) プロセッサ 2 X(26:50) Y(26:50) 抽象プロセッサ配列宣言 抽象プロセッサへの データレイアウト指定 プロセッサ 3 X(51:75) Y(51:75) プロセッサ 4 X(76:100) Y(76:100) 76

77 HPF ー計算処理のプロセッサへの割り当て owner computes rule: 変数 X へ代入を行う代入文の計算は, その変数がローカルメモリに配置されているプロセッサ (X のオーナー ) が担当するという計算モデル. 先の例示プログラムでは : DO I=2,N-1 Y(I) = X(I-1)+X(I)+X(I+1) END DO プロセッサ 1 が I=2,25 を実行プロセッサ 2 が I=26,50 を実行プロセッサ 3 が I=51,75 を実行プロセッサ 4 が I=76,99 を実行 77

78 HPF ー SPMD コード コンパイラが IF 文からなる実行ガードを挿入し SPMD コードを生成. 各プロセッサは同一プログラムを実行しながら, 実際には異なる処理を行う. 先の例示プログラムでは, コンパイラが以下のようなコードを生成する. DO I=2,N-1 IF( Y(I) のオーナー ) THEN Y(I) = X(I-1)+X(I)+X(I+1) END DO 78

79 HPF ーデータの分割配置 ( 多次元配列 ) PROGRAM EXAMPLE2 PARAMETER(N=100) REAL Z(N,N)!HPF$ PROCESSORS P(4) 抽象プロセッサ配列宣言!HPF$ DISTRIBUTE Z(BLOCK,*) ONTO P 配列変数 Z 抽象プロセッサへの データレイアウト指定 プロセッサ 1 プロセッサ 2 プロセッサ 3 プロセッサ 4 79

80 HPF ーデータの分割配置 ( 多次元配列 )!HPF$ PROCESSORS P(4)!HPF$ PROCESSORS P(2,2) (BLOCK,*) (*,BLOCK) (BLOCK,BLOCK) (SYCLIC,*) (*,SYCLIC) (SYCLIC,BLOCK) 80

81 HPF ーデータの分割配置 ( 相互関係 )!HPF$ ALIGN A(I) WITH B(I) A B!HPF$ ALIGN A(I) WITH B(I+1) A B!HPF$ ALIGN A(I,J) WITH B(J,I) 転置!HPF$ ALIGN A(I,*) WITH C(I) 縮退!HPF$ ALIGN C(I) WITH B(I,*) 複製 81

82 HPF ープロセッサ間通信 先のプログラムで必要な通信 プロセッサ1が, Y(25) = X(24)+X(25)+X(26) プロセッサ2からを実行する際にプロセッサ間でデータの通信が必要データ配置プロセッサ1 X(1)~X(25) プロセッサ2 X(26)~X(50) プロセッサ3 X(51)~X(75) プロセッサ4 X(76)~X(100) プロセッサ2,3,4でも同様プロセッサ2が Y(26) = X(25)+X(26)+X(27) Y(50) = X(49)+X(50)+X(51) プロセッサ 3 が DO I=2,N-1 Y(I)=X(I-1)+X(I)+X(I+1) END DO Y(51) = X(50)+X(51)+X(52) Y(75) = X(74)+X(75)+X(76) プロセッサ4が Y(76) = X(75)+X(76)+X(77) 合計 6 回の通信が必要 82

83 HPF ープロセッサ間通信 DO I=2,N-1 Y(I)=X(I-1)+X(I)+X(I+1) END DO 例示プログラムで, データ分割配置がサイクリックの場合どのような通信が必要か? プロセッサ 1 X(1),X(5)...X(97) プロセッサ 2 X(2),X(6)...X(98) プロセッサ 3 X(3),X(7)...X(99) プロセッサ 4 X(4),X(8)...X(100) 非常に多くの通信が必要となる!!! 全てのプロセッサが一つの代入文で 2 回づつ (98X2 回!) Y(I) = X(I-1)+X(I)+X(I+1) データの分割配置の形態によって通信回数が大きく異なる. 実行効率に多大な影響 83

84 HPF ープロセッサ間での計算負荷の均等化 負荷分散の面からはサイクリック分割の方が良い場合 DO I = 1,100 ENDDO DO J = I,100 X(I,J) = X(I,J)/2 ENDDO J J I I ブロック分割 サイクリック分割 84

85 HPF データの分割配置はプログラマの知的作業とし, 残りの部分 (SPMD 化など ) をコンパイラに任せる. 科学技術計算分野ではそれなりの普及の兆し. 参考となるサイト HPF 推進協議会 XcalableMP 85

NUMAの構成

NUMAの構成 メッセージパッシング プログラミング 天野 共有メモリ対メッセージパッシング 共有メモリモデル 共有変数を用いた単純な記述自動並列化コンパイラ簡単なディレクティブによる並列化 :OpenMP メッセージパッシング 形式検証が可能 ( ブロッキング ) 副作用がない ( 共有変数は副作用そのもの ) コストが小さい メッセージパッシングモデル 共有変数は使わない 共有メモリがないマシンでも実装可能 クラスタ

More information

1.overview

1.overview 村井均 ( 理研 ) 2 はじめに 規模シミュレーションなどの計算を うためには クラスタのような分散メモリシステムの利 が 般的 並列プログラミングの現状 半は MPI (Message Passing Interface) を利 MPI はプログラミングコストが きい 標 性能と 産性を兼ね備えた並列プログラミング 語の開発 3 並列プログラミング 語 XcalableMP 次世代並列プログラミング

More information

Microsoft PowerPoint - OpenMP入門.pptx

Microsoft PowerPoint - OpenMP入門.pptx OpenMP 入門 須田礼仁 2009/10/30 初版 OpenMP 共有メモリ並列処理の標準化 API http://openmp.org/ 最新版は 30 3.0 バージョンによる違いはあまり大きくない サポートしているバージョンはともかく csp で動きます gcc も対応しています やっぱり SPMD Single Program Multiple Data プログラム #pragma omp

More information

Microsoft Word - openmp-txt.doc

Microsoft Word - openmp-txt.doc ( 付録 A) OpenMP チュートリアル OepnMP は 共有メモリマルチプロセッサ上のマルチスレッドプログラミングのための API です 本稿では OpenMP の簡単な解説とともにプログラム例をつかって説明します 詳しくは OpenMP の規約を決めている OpenMP ARB の http://www.openmp.org/ にある仕様書を参照してください 日本語訳は http://www.hpcc.jp/omni/spec.ja/

More information

Microsoft PowerPoint - 講義:片方向通信.pptx

Microsoft PowerPoint - 講義:片方向通信.pptx MPI( 片方向通信 ) 09 年 3 月 5 日 神戸大学大学院システム情報学研究科計算科学専攻横川三津夫 09/3/5 KOBE HPC Spring School 09 分散メモリ型並列計算機 複数のプロセッサがネットワークで接続されており, れぞれのプロセッサ (PE) が, メモリを持っている. 各 PE が自分のメモリ領域のみアクセス可能 特徴数千から数万 PE 規模の並列システムが可能

More information

Microsoft PowerPoint - KHPCSS pptx

Microsoft PowerPoint - KHPCSS pptx KOBE HPC サマースクール 2018( 初級 ) 9. 1 対 1 通信関数, 集団通信関数 2018/8/8 KOBE HPC サマースクール 2018 1 2018/8/8 KOBE HPC サマースクール 2018 2 MPI プログラム (M-2):1 対 1 通信関数 問題 1 から 100 までの整数の和を 2 並列で求めなさい. プログラムの方針 プロセス0: 1から50までの和を求める.

More information

NUMAの構成

NUMAの構成 共有メモリを使ったデータ交換と同期 慶應義塾大学理工学部 天野英晴 hunga@am.ics.keio.ac.jp 同期の必要性 あるプロセッサが共有メモリに書いても 別のプロセッサにはそのことが分からない 同時に同じ共有変数に書き込みすると 結果がどうなるか分からない そもそも共有メモリって結構危険な代物 多くのプロセッサが並列に動くには何かの制御機構が要る 不可分命令 同期用メモリ バリア同期機構

More information

研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並

研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並 XcalableMPによる NAS Parallel Benchmarksの実装と評価 中尾 昌広 李 珍泌 朴 泰祐 佐藤 三久 筑波大学 計算科学研究センター 筑波大学大学院 システム情報工学研究科 研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI,

More information

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx)

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx) AICS 村井均 RIKEN AICS HPC Summer School 2012 8/7/2012 1 背景 OpenMP とは OpenMP の基本 OpenMP プログラミングにおける注意点 やや高度な話題 2 共有メモリマルチプロセッサシステムの普及 共有メモリマルチプロセッサシステムのための並列化指示文を共通化する必要性 各社で仕様が異なり 移植性がない そして いまやマルチコア プロセッサが主流となり

More information

Microsoft PowerPoint - 演習1:並列化と評価.pptx

Microsoft PowerPoint - 演習1:並列化と評価.pptx 講義 2& 演習 1 プログラム並列化と性能評価 神戸大学大学院システム情報学研究科横川三津夫 yokokawa@port.kobe-u.ac.jp 2014/3/5 RIKEN AICS HPC Spring School 2014: プログラム並列化と性能評価 1 2014/3/5 RIKEN AICS HPC Spring School 2014: プログラム並列化と性能評価 2 2 次元温度分布の計算

More information

コードのチューニング

コードのチューニング ハイブリッド並列 八木学 ( 理化学研究所計算科学研究機構 ) 謝辞 松本洋介氏 ( 千葉大学 ) KOBE HPC Spring School 2017 2017 年 3 月 14 日神戸大学計算科学教育センター MPI とは Message Passing Interface 分散メモリのプロセス間の通信規格(API) SPMD(Single Program Multi Data) が基本 -

More information

スライド 1

スライド 1 目次 2.MPI プログラミング入門 この資料は, スーパーコン 10 で使用したものである. ごく基本的な内容なので, 現在でも十分利用できると思われるものなので, ここに紹介させて頂く. ただし, 古い情報も含まれているので注意が必要である. 今年度版の解説は, 本選の初日に配布する予定である. 1/20 2.MPI プログラミング入門 (1) 基本 説明 MPI (message passing

More information

Microsoft PowerPoint - compsys2-06.ppt

Microsoft PowerPoint - compsys2-06.ppt 情報基盤センター天野浩文 前回のおさらい (1) 並列処理のやり方 何と何を並列に行うのか コントロール並列プログラミング 同時に実行できる多数の処理を, 多数のノードに分配して同時に処理させる しかし, 同時に実行できる多数の処理 を見つけるのは難しい データ並列プログラミング 大量のデータを多数の演算ノードに分配して, それらに同じ演算を同時に適用する コントロール並列よりも, 多数の演算ノードを利用しやすい

More information

02_C-C++_osx.indd

02_C-C++_osx.indd C/C++ OpenMP* / 2 C/C++ OpenMP* OpenMP* 9.0 1... 2 2... 3 3OpenMP*... 5 3.1... 5 3.2 OpenMP*... 6 3.3 OpenMP*... 8 4OpenMP*... 9 4.1... 9 4.2 OpenMP*... 9 4.3 OpenMP*... 10 4.4... 10 5OpenMP*... 11 5.1

More information

chap2.ppt

chap2.ppt 2. メッセージ通信計算 2.1 メッセージ通信プログラミングの基本 プログラミングの選択肢 特別な並列プログラミング言語を設計する occam (Inmos, 1984, 1986) 既存の逐次言語の文法 / 予約語をメッセージ通信を処理できるように拡張する 既存の逐次言語を用い メッセージ通信のための拡張手続のライブラリを用意する どのプロセスを実行するのか メッセージ通信のタイミング 中身を明示的に指定する必要がある

More information

MPI usage

MPI usage MPI (Version 0.99 2006 11 8 ) 1 1 MPI ( Message Passing Interface ) 1 1.1 MPI................................. 1 1.2............................... 2 1.2.1 MPI GATHER.......................... 2 1.2.2

More information

XcalableMP入門

XcalableMP入門 XcalableMP 1 HPC-Phys@, 2018 8 22 XcalableMP XMP XMP Lattice QCD!2 XMP MPI MPI!3 XMP 1/2 PCXMP MPI Fortran CCoarray C++ MPIMPI XMP OpenMP http://xcalablemp.org!4 XMP 2/2 SPMD (Single Program Multiple Data)

More information

about MPI

about MPI 本日 (4/16) の内容 1 並列計算の概要 並列化計算の目的 並列コンピュータ環境 並列プログラミングの方法 MPI を用いた並列プログラミング 並列化効率 2 並列計算の実行方法 Hello world モンテカルロ法による円周率計算 並列計算のはじまり 並列計算の最初の構想を イギリスの科学者リチャードソンが 1922 年に発表 < リチャードソンの夢 > 64000 人を円形の劇場に集めて

More information

スライド 1

スライド 1 本日 (4/25) の内容 1 並列計算の概要 並列化計算の目的 並列コンピュータ環境 並列プログラミングの方法 MPI を用いた並列プログラミング 並列化効率 2 並列計算の実行方法 Hello world モンテカルロ法による円周率計算 並列計算のはじまり 並列計算の最初の構想を イギリスの科学者リチャードソンが 1922 年に発表 < リチャードソンの夢 > 64000 人を円形の劇場に集めて

More information

OpenMPプログラミング

OpenMPプログラミング OpenMP 基礎 岩下武史 ( 学術情報メディアセンター ) 1 2013/9/13 並列処理とは 逐次処理 CPU1 並列処理 CPU1 CPU2 CPU3 CPU4 処理 1 処理 1 処理 2 処理 3 処理 4 処理 2 処理 3 処理 4 時間 2 2 種類の並列処理方法 プロセス並列 スレッド並列 並列プログラム 並列プログラム プロセス プロセス 0 プロセス 1 プロセス間通信 スレッド

More information

AICS 村井均 RIKEN AICS HPC Summer School /6/2013 1

AICS 村井均 RIKEN AICS HPC Summer School /6/2013 1 AICS 村井均 RIKEN AICS HPC Summer School 2013 8/6/2013 1 背景 OpenMP とは OpenMP の基本 OpenMP プログラミングにおける注意点 やや高度な話題 2 共有メモリマルチプロセッサシステムの普及 共有メモリマルチプロセッサシステムのための並列化指示文を共通化する必要性 各社で仕様が異なり 移植性がない そして いまやマルチコア プロセッサが主流となり

More information

Microsoft PowerPoint - sps14_kogi6.pptx

Microsoft PowerPoint - sps14_kogi6.pptx Xcalable MP 並列プログラミング言語入門 1 村井均 (AICS) 2 はじめに 大規模シミュレーションなどの計算を うためには クラスタのような分散メモリシステムの利 が 般的 並列プログラミングの現状 大半は MPI (Message Passing Interface) を利 MPI はプログラミングコストが大きい 目標 高性能と高 産性を兼ね備えた並列プログラミング言語の開発 3

More information

コードのチューニング

コードのチューニング OpenMP による並列化実装 八木学 ( 理化学研究所計算科学研究センター ) KOBE HPC Spring School 2019 2019 年 3 月 14 日 スレッド並列とプロセス並列 スレッド並列 OpenMP 自動並列化 プロセス並列 MPI プロセス プロセス プロセス スレッドスレッドスレッドスレッド メモリ メモリ プロセス間通信 Private Private Private

More information

並列計算導入.pptx

並列計算導入.pptx 並列計算の基礎 MPI を用いた並列計算 並列計算の環境 並列計算 複数の計算ユニット(PU, ore, Pなど を使用して 一つの問題 計算 を行わせる 近年 並列計算を手軽に使用できる環境が急速に整いつつある >通常のP PU(entral Processing Unit)上に計算装置であるoreが 複数含まれている Intel ore i7 シリーズ: 4つの計算装置(ore) 通常のプログラム

More information

<4D F736F F F696E74202D C097F B A E B93C782DD8EE682E890EA97705D>

<4D F736F F F696E74202D C097F B A E B93C782DD8EE682E890EA97705D> 並列アルゴリズム 2005 年後期火曜 2 限 青柳睦 Aoyagi@cc.kyushu-u.ac.jp http://server-500.cc.kyushu-u.ac.jp/ 10 月 11 日 ( 火 ) 1. 序並列計算機の現状 2. 計算方式およびアーキテクチュアの分類 ( 途中から ) 3. 並列計算の目的と課題 4. 数値計算における各種の並列化 1 講義の概要 並列計算機や計算機クラスターなどの分散環境における並列処理の概論

More information

Microsoft PowerPoint - 講義:コミュニケータ.pptx

Microsoft PowerPoint - 講義:コミュニケータ.pptx コミュニケータとデータタイプ (Communicator and Datatype) 2019 年 3 月 15 日 神戸大学大学院システム情報学研究科横川三津夫 2019/3/15 Kobe HPC Spring School 2019 1 講義の内容 コミュニケータ (Communicator) データタイプ (Datatype) 演習問題 2019/3/15 Kobe HPC Spring School

More information

XACC講習会

XACC講習会 www.xcalablemp.org 1 4, int array[max]; #pragma xmp nodes p(*) #pragma xmp template t(0:max-1) #pragma xmp distribute t(block) onto p #pragma xmp align array[i] with t(i) int array[max]; main(int argc,

More information

Microsoft PowerPoint 並列アルゴリズム04.ppt

Microsoft PowerPoint 並列アルゴリズム04.ppt 並列アルゴリズム 2005 年後期火曜 2 限 青柳睦 Aoyagi@cc.kyushu-u.ac.jp http://server-500.cc.kyushu-u.ac.jp/ 11 月 8 日 ( 火 ) 5. MPI の基礎 6. 並列処理の性能評価 1 もくじ 1. 序並列計算機の現状 2. 計算方式およびアーキテクチュアの分類 3. 並列計算の目的と課題 4. 数値計算における各種の並列化

More information

演習準備 2014 年 3 月 5 日神戸大学大学院システム情報学研究科森下浩二 1 RIKEN AICS HPC Spring School /3/5

演習準備 2014 年 3 月 5 日神戸大学大学院システム情報学研究科森下浩二 1 RIKEN AICS HPC Spring School /3/5 演習準備 2014 年 3 月 5 日神戸大学大学院システム情報学研究科森下浩二 1 演習準備の内容 神戸大 FX10(π-Computer) 利用準備 システム概要 ログイン方法 コンパイルとジョブ実行方法 MPI 復習 1. MPIプログラムの基本構成 2. 並列実行 3. 1 対 1 通信 集団通信 4. データ 処理分割 5. 計算時間計測 2 神戸大 FX10(π-Computer) 利用準備

More information

Microsoft PowerPoint _MPI-03.pptx

Microsoft PowerPoint _MPI-03.pptx 計算科学演習 Ⅰ ( 第 11 回 ) MPI を いた並列計算 (III) 神戸大学大学院システム情報学研究科横川三津夫 yokokawa@port.kobe-u.ac.jp 2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 1 2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 2 今週の講義の概要 1. 前回課題の解説 2. 部分配列とローカルインデックス

More information

HPC143

HPC143 研究背景 GPUクラスタ 高性能 高いエネルギー効率 低価格 様々なHPCアプリケーションで用いられている TCA (Tightly Coupled Accelerators) 密結合並列演算加速機構 筑波大学HA-PACSクラスタ アクセラレータ GPU 間の直接通信 低レイテンシ 今後のHPCアプリは強スケーリングも重要 TCAとアクセラレータを搭載したシステムに おけるプログラミングモデル 例

More information

<4D F736F F F696E74202D C097F B A E B93C782DD8EE682E890EA97705D>

<4D F736F F F696E74202D C097F B A E B93C782DD8EE682E890EA97705D> 並列アルゴリズム 2005 年後期火曜 2 限 青柳睦 Aoyagi@cc.kyushu-u.ac.jp http://server-500.cc.kyushu-u.ac.jp/ 10 月 18( 火 ) 4. 数値計算における各種の並列化 5. MPI の基礎 1 講義の概要 並列計算機や計算機クラスターなどの分散環境における並列処理の概論 MPI および OpenMP による並列計算 理工学分野の並列計算アルゴリズム

More information

WinHPC ppt

WinHPC ppt MPI.NET C# 2 2009 1 20 MPI.NET MPI.NET C# MPI.NET C# MPI MPI.NET 1 1 MPI.NET C# Hello World MPI.NET.NET Framework.NET C# API C# Microsoft.NET java.net (Visual Basic.NET Visual C++) C# class Helloworld

More information

2. OpenMP OpenMP OpenMP OpenMP #pragma#pragma omp #pragma omp parallel #pragma omp single #pragma omp master #pragma omp for #pragma omp critica

2. OpenMP OpenMP OpenMP OpenMP #pragma#pragma omp #pragma omp parallel #pragma omp single #pragma omp master #pragma omp for #pragma omp critica C OpenMP 1. OpenMP OpenMP Architecture Review BoardARB OpenMP OpenMP OpenMP OpenMP OpenMP Version 2.0 Version 2.0 OpenMP Fortran C/C++ C C++ 1997 10 OpenMP Fortran API 1.0 1998 10 OpenMP C/C++ API 1.0

More information

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18 OpenMP* 4.x における拡張 OpenMP 4.0 と 4.5 の機能拡張 内容 OpenMP* 3.1 から 4.0 への拡張 OpenMP* 4.0 から 4.5 への拡張 2 追加された機能 (3.1 -> 4.0) C/C++ 配列シンタックスの拡張 SIMD と SIMD 対応関数 デバイスオフロード task 構 の依存性 taskgroup 構 cancel 句と cancellation

More information

C/C++ FORTRAN FORTRAN MPI MPI MPI UNIX Windows (SIMD Single Instruction Multipule Data) SMP(Symmetric Multi Processor) MPI (thread) OpenMP[5]

C/C++ FORTRAN FORTRAN MPI MPI MPI UNIX Windows (SIMD Single Instruction Multipule Data) SMP(Symmetric Multi Processor) MPI (thread) OpenMP[5] MPI ( ) snozawa@env.sci.ibaraki.ac.jp 1 ( ) MPI MPI Message Passing Interface[2] MPI MPICH[3],LAM/MPI[4] (MIMDMultiple Instruction Multipule Data) Message Passing ( ) (MPI (rank) PE(Processing Element)

More information

para02-2.dvi

para02-2.dvi 2002 2 2002 4 23 : MPI MPI 1 MPI MPI(Message Passing Interface) MPI UNIX Windows Machintosh OS, MPI 2 1 1 2 2.1 1 1 1 1 1 1 Fig. 1 A B C F Fig. 2 A B F Fig. 1 1 1 Fig. 2 2.2 Fig. 3 1 . Fig. 4 Fig. 3 Fig.

More information

演習 II 2 つの講義の演習 奇数回 : 連続系アルゴリズム 部分 偶数回 : 計算量理論 部分 連続系アルゴリズム部分は全 8 回を予定 前半 2 回 高性能計算 後半 6 回 数値計算 4 回以上の課題提出 ( プログラム + 考察レポート ) で単位

演習 II 2 つの講義の演習 奇数回 : 連続系アルゴリズム 部分 偶数回 : 計算量理論 部分 連続系アルゴリズム部分は全 8 回を予定 前半 2 回 高性能計算 後半 6 回 数値計算 4 回以上の課題提出 ( プログラム + 考察レポート ) で単位 演習 II ( 連続系アルゴリズム ) 第 1 回 : MPI 須田研究室 M2 本谷徹 motoya@is.s.u-tokyo.ac.jp 2012/10/05 2012/10/18 補足 訂正 演習 II 2 つの講義の演習 奇数回 : 連続系アルゴリズム 部分 偶数回 : 計算量理論 部分 連続系アルゴリズム部分は全 8 回を予定 前半 2 回 高性能計算 後半 6 回 数値計算 4 回以上の課題提出

More information

<4D F736F F F696E74202D C097F B A E B93C782DD8EE682E890EA97705D>

<4D F736F F F696E74202D C097F B A E B93C782DD8EE682E890EA97705D> 並列アルゴリズム 2005 年後期火曜 2 限青柳睦 Aoyagi@cc.kyushu-u.ac.jp http//server-500.cc.kyushu-u.ac.jp/ 11 月 29( 火 ) 7. 集団通信 (Collective Communication) 8. 領域分割 (Domain Decomposition) 1 もくじ 1. 序並列計算機の現状 2. 計算方式およびアーキテクチュアの分類

More information

演習1: 演習準備

演習1: 演習準備 演習 1: 演習準備 2013 年 8 月 6 日神戸大学大学院システム情報学研究科森下浩二 1 演習 1 の内容 神戸大 X10(π-omputer) について システム概要 ログイン方法 コンパイルとジョブ実行方法 OpenMP の演習 ( 入門編 ) 1. parallel 構文 実行時ライブラリ関数 2. ループ構文 3. shared 節 private 節 4. reduction 節

More information

Microsoft PowerPoint _MPI-01.pptx

Microsoft PowerPoint _MPI-01.pptx 計算科学演習 Ⅰ MPI を いた並列計算 (I) 神戸大学大学院システム情報学研究科谷口隆晴 yaguchi@pearl.kobe-u.ac.jp この資料は昨年度担当の横川先生の資料を参考にさせて頂いています. 2016/06/23 MPI を用いた並列計算 (I) 1 講義概要 分散メモリ型計算機上のプログラミング メッセージ パシング インターフェイス (Message Passing Interface,MPI)

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 計算科学演習 I 第 8 回講義 MPI を用いた並列計算 (I) 2013 年 6 月 6 日 システム情報学研究科計算科学専攻 山本有作 今回の講義の概要 1. MPI とは 2. 簡単な MPI プログラムの例 (1) 3. 簡単な MPI プログラムの例 (2):1 対 1 通信 4. 簡単な MPI プログラムの例 (3): 集団通信 共有メモリ型並列計算機 ( 復習 ) 共有メモリ型並列計算機

More information

スレッド

スレッド POSIX スレッド システムプログラミング 2007 年 10 月 22 日 建部修見 スレッドとは? プロセス内の独立したプログラム実行 メモリは共有 ファイルディスクリプタなどプロセス資源は共有 一般にスレッド生成はプロセス生成より軽い プロセス vs スレッド 生成 実行オーバヘッド スレッド小 プロセス大 メモリ 共有 別々 プロセス資源 共有 別々 データ共有 メモリのポインタ渡し (

More information

01-introduction.ppt

01-introduction.ppt オペレーティングシステム ~ イントロダクション ~ 山田浩史 hiroshiy @ cc.tuat.ac.jp 2015/04/10 オペレーティングシステム 担当 : 山田浩史 ( やまだひろし ) mail: hiroshiy @ cc.tuat.ac.jp 質問等ありましたら気軽にメールをしてください 専門分野 オペレーティングシステムや仮想マシンモニタといった システムソフトウェア と呼ばれる分野

More information

2 T 1 N n T n α = T 1 nt n (1) α = 1 100% OpenMP MPI OpenMP OpenMP MPI (Message Passing Interface) MPI MPICH OpenMPI 1 OpenMP MPI MPI (trivial p

2 T 1 N n T n α = T 1 nt n (1) α = 1 100% OpenMP MPI OpenMP OpenMP MPI (Message Passing Interface) MPI MPICH OpenMPI 1 OpenMP MPI MPI (trivial p 22 6 22 MPI MPI 1 1 2 2 3 MPI 3 4 7 4.1.................................. 7 4.2 ( )................................ 10 4.3 (Allreduce )................................. 12 5 14 5.1........................................

More information

かし, 異なったプロセス間でデータを共有するためには, プロセス間通信や特殊な共有メモリ領域を 利用する必要がある. このためマルチプロセッサマシンの利点を最大に引き出すことができない. こ の問題はマルチスレッドを用いることで解決できる. マルチスレッドとは,1 つのプロセスの中に複 数のスレッド

かし, 異なったプロセス間でデータを共有するためには, プロセス間通信や特殊な共有メモリ領域を 利用する必要がある. このためマルチプロセッサマシンの利点を最大に引き出すことができない. こ の問題はマルチスレッドを用いることで解決できる. マルチスレッドとは,1 つのプロセスの中に複 数のスレッド 0 並列計算について 0.1 並列プログラミングライブラリのメッセージパッシングモデル並列プログラムにはメモリモデルで分類すると, 共有メモリモデルと分散メモリモデルの 2 つに分けられる. それぞれ次のような特徴がある. 共有メモリモデル複数のプロセスやスレッドが事項する主体となり, 互いに通信や同期を取りながら計算が継続される. スレッド間の実行順序をプログラマが保証してやらないと, 思った結果が得られない.

More information

44 6 MPI 4 : #LIB=-lmpich -lm 5 : LIB=-lmpi -lm 7 : mpi1: mpi1.c 8 : $(CC) -o mpi1 mpi1.c $(LIB) 9 : 10 : clean: 11 : -$(DEL) mpi1 make mpi1 1 % mpiru

44 6 MPI 4 : #LIB=-lmpich -lm 5 : LIB=-lmpi -lm 7 : mpi1: mpi1.c 8 : $(CC) -o mpi1 mpi1.c $(LIB) 9 : 10 : clean: 11 : -$(DEL) mpi1 make mpi1 1 % mpiru 43 6 MPI MPI(Message Passing Interface) MPI 1CPU/1 PC Cluster MPICH[5] 6.1 MPI MPI MPI 1 : #include 2 : #include 3 : #include 4 : 5 : #include "mpi.h" 7 : int main(int argc,

More information

演算増幅器

演算増幅器 ネットワークプログラミングの続き前回はチャットを行うプログラムを作成し ネットワークを利用したプログラミングの基本について学んだ 本日は 前回作成したプログラムを改良していく 具体的には 以下の2つの項目について習っていく ホスト名や IP アドレスの取得の方法 fork() システムコールを使い 子プロセスを作成する方法 チャットプログラムの改良 前回のプログラムを以下のように改良していく 太字部分が変更部分である

More information

04-process_thread_2.ppt

04-process_thread_2.ppt オペレーティングシステム ~ 保護とシステムコール ~ 山田浩史 hiroshiy @ cc.tuat.ac.jp 2015/05/08 復習 : OS の目的 ( 今回の話題 ) 裸のコンピュータを抽象化 (abstraction) し より使いやすく安全なコンピュータとして見せること OS はハードウェアを制御し アプリケーションの効率的な動作や容易な開発を支援する OS がないと 1 つしかプログラムが動作しない

More information

OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a))

OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a)) OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a)) E-mail: {nanri,amano}@cc.kyushu-u.ac.jp 1 ( ) 1. VPP Fortran[6] HPF[3] VPP Fortran 2. MPI[5]

More information

01_OpenMP_osx.indd

01_OpenMP_osx.indd OpenMP* / 1 1... 2 2... 3 3... 5 4... 7 5... 9 5.1... 9 5.2 OpenMP* API... 13 6... 17 7... 19 / 4 1 2 C/C++ OpenMP* 3 Fortran OpenMP* 4 PC 1 1 9.0 Linux* Windows* Xeon Itanium OS 1 2 2 WEB OS OS OS 1 OS

More information

Microsoft PowerPoint - sales2.ppt

Microsoft PowerPoint - sales2.ppt 並列化の基礎 ( 言葉の意味 ) 並列実行には 複数のタスク実行主体が必要 共有メモリ型システム (SMP) での並列 プロセスを使用した並列化 スレッドとは? スレッドを使用した並列化 分散メモリ型システムでの並列 メッセージパッシングによる並列化 並列アーキテクチャ関連の言葉を押さえよう 21 プロセスを使用した並列処理 並列処理を行うためには複数のプロセスの生成必要プロセスとは プログラム実行のための能動実態メモリ空間親プロセス子プロセス

More information

スレッド

スレッド POSIX スレッド (1) システムプログラミング 2009 年 10 月 19 日 建部修見 組込機器における並行処理 GUI における反応性向上 ダイナミックな Wait カーソル 各イベントを別制御で実行 Auto save 機能 サーバの反応性向上 各リクエストを別制御で実行 マルチコア マルチプロセッサでの並列実行 スレッドとは? プロセス内の * 独立した * プログラム実行 同一プロセス

More information

演習準備

演習準備 演習準備 2014 年 3 月 5 日神戸大学大学院システム情報学研究科森下浩二 1 演習準備の内容 神戸大 FX10(π-Computer) 利用準備 システム概要 ログイン方法 コンパイルとジョブ実行方法 MPI 復習 1. MPIプログラムの基本構成 2. 並列実行 3. 1 対 1 通信 集団通信 4. データ 処理分割 5. 計算時間計測 2 神戸大 FX10(π-Computer) 利用準備

More information

Microsoft PowerPoint - 09.pptx

Microsoft PowerPoint - 09.pptx 情報処理 Ⅱ 第 9 回 2014 年 12 月 22 日 ( 月 ) 関数とは なぜ関数 関数の分類 自作関数 : 自分で定義する. ユーザ関数 ユーザ定義関数 などともいう. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする 機能分割 ( モジュール化, 再利用 ) 責任 ( あるいは不具合の発生源

More information

program7app.ppt

program7app.ppt プログラム理論と言語第 7 回 ポインタと配列, 高階関数, まとめ 有村博紀 吉岡真治 公開スライド PDF( 情報知識ネットワーク研 HP/ 授業 ) http://www-ikn.ist.hokudai.ac.jp/~arim/pub/proriron/ 本スライドは,2015 北海道大学吉岡真治 プログラム理論と言語, に基づいて, 現著者の承諾のもとに, 改訂者 ( 有村 ) が加筆修正しています.

More information

cp-7. 配列

cp-7. 配列 cp-7. 配列 (C プログラムの書き方を, パソコン演習で学ぶシリーズ ) https://www.kkaneko.jp/cc/adp/index.html 金子邦彦 1 本日の内容 例題 1. 月の日数配列とは. 配列の宣言. 配列の添え字. 例題 2. ベクトルの内積例題 3. 合計点と平均点例題 4. 棒グラフを描く配列と繰り返し計算の関係例題 5. 行列の和 2 次元配列 2 今日の到達目標

More information

第8回講義(2016年12月6日)

第8回講義(2016年12月6日) 2016/12/6 スパコンプログラミング (1) (Ⅰ) 1 行列 - 行列積 (2) 東京大学情報基盤センター准教授塙敏博 2016 年 12 月 6 日 ( 火 ) 10:25-12:10 2016/11/29 講義日程 ( 工学部共通科目 ) 1. 9 月 27 日 ( 今日 ): ガイダンス 2. 10 月 4 日 l 並列数値処理の基本演算 ( 座学 ) 3. 10 月 11 日 : スパコン利用開始

More information

Microsoft PowerPoint ppt [互換モード]

Microsoft PowerPoint ppt [互換モード] 計算機アーキテクチャ特論 2013 年 10 28 枝廣 前半 ( 並列アーキテクチャの基本 枝廣 ) 10/7, 10/21, 10/28, 11/11, 11/18, (12/2)( 程は予定 ) 内容 ( 変更の可能性あり ) 序論 ( マルチコア= 並列アーキテクチャ概論 ) キャッシュ コヒーレンシ メモリ コンシステンシ 並列アーキテクチャモデル OSモデル 並列プログラミングモデル 語

More information

POSIXプログラミング Pthreads編

POSIXプログラミング Pthreads編 POSIXプログラミング Pthreads 編 デジタルビジョンソリューション 中山一弘佐藤史明 参考図書 Pthreads プログラミング, Bradford Nichols, Dick Buttlar, Jacqeline Proulx Farrell, ISBN4-900900-66-4 Pthreads POSIX スレッド標準を実装したライブラリを Pthreads と呼ぶ C 言語のデータ型

More information

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E >

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E > SX-ACE 並列プログラミング入門 (MPI) ( 演習補足資料 ) 大阪大学サイバーメディアセンター日本電気株式会社 演習問題の構成 ディレクトリ構成 MPI/ -- practice_1 演習問題 1 -- practice_2 演習問題 2 -- practice_3 演習問題 3 -- practice_4 演習問題 4 -- practice_5 演習問題 5 -- practice_6

More information

Gfarm/MPI-IOの 概要と使い方

Gfarm/MPI-IOの 概要と使い方 MPI-IO/Gfarm のご紹介と現在の開発状況 鷹津冬将 2018/3/2 Gfarm ワークショップ 2018 1 目次 MPI-IO/Gfarm 概要 MPI-IO/Gfarm の開発状況 MVAPICH2 向け MPI-IO/Gfarm MPI-IO/Gfarm の使い方 かんたんなサンプルプログラムと動作確認の方法 既知の不具合 まとめと今後の展望 2018/3/2 Gfarm ワークショップ

More information

目 目 用方 用 用 方

目 目 用方 用 用 方 大 生 大 工 目 目 用方 用 用 方 用 方 MS-MPI MPI.NET MPICH MPICH2 LAM/MPI Ver. 2 2 1 2 1 C C++ Fortan.NET C# C C++ Fortan 用 行 用 用 用 行 用 言 言 言 行 生 方 方 一 行 高 行 行 文 用 行 If ( rank == 0 ) { // 0 } else if (rank == 1) {

More information

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 勉強会 @ 理化学研究所 共通コードプロジェクト Contents Hands On 環境について Introduction to GPU computing Introduction

More information

講義の流れ 並列プログラムの概要 通常のプログラムと並列プログラムの違い 並列プログラム作成手段と並列計算機の構造 OpenMP による並列プログラム作成 処理を複数コアに分割して並列実行する方法 MPI による並列プログラム作成 ( 午後 ) プロセス間通信による並列処理 処理の分割 + データの

講義の流れ 並列プログラムの概要 通常のプログラムと並列プログラムの違い 並列プログラム作成手段と並列計算機の構造 OpenMP による並列プログラム作成 処理を複数コアに分割して並列実行する方法 MPI による並列プログラム作成 ( 午後 ) プロセス間通信による並列処理 処理の分割 + データの ( 財 ) 計算科学振興財団 大学院 GP 大学連合による計算科学の最先端人材育成 第 1 回社会人向けスパコン実践セミナー資料 29 年 2 月 17 日 13:15~14:45 九州大学情報基盤研究開発センター 南里豪志 1 講義の流れ 並列プログラムの概要 通常のプログラムと並列プログラムの違い 並列プログラム作成手段と並列計算機の構造 OpenMP による並列プログラム作成 処理を複数コアに分割して並列実行する方法

More information

XMPによる並列化実装2

XMPによる並列化実装2 2 3 C Fortran Exercise 1 Exercise 2 Serial init.c init.f90 XMP xmp_init.c xmp_init.f90 Serial laplace.c laplace.f90 XMP xmp_laplace.c xmp_laplace.f90 #include int a[10]; program init integer

More information

openmp1_Yaguchi_version_170530

openmp1_Yaguchi_version_170530 並列計算とは /OpenMP の初歩 (1) 今 の内容 なぜ並列計算が必要か? スーパーコンピュータの性能動向 1ExaFLOPS 次世代スハ コン 京 1PFLOPS 性能 1TFLOPS 1GFLOPS スカラー機ベクトル機ベクトル並列機並列機 X-MP ncube2 CRAY-1 S-810 SR8000 VPP500 CM-5 ASCI-5 ASCI-4 S3800 T3E-900 SR2201

More information

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科 バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科 ポインタ変数の扱い方 1 ポインタ変数の宣言 int *p; double *q; 2 ポインタ変数へのアドレスの代入 int *p; と宣言した時,p がポインタ変数 int x; と普通に宣言した変数に対して, p = &x; は x のアドレスのポインタ変数 p への代入 ポインタ変数の扱い方 3 間接参照 (

More information

Microsoft PowerPoint - 阪大CMSI pptx

Microsoft PowerPoint - 阪大CMSI pptx 内容に関する質問は katagiri@cc.u-tokyo.ac.jp まで 第 3 回 OpenMP の基礎 東京大学情報基盤センター 片桐孝洋 1 講義日程と内容について (1 学期 : 木曜 3 限 ) 第 1 回 : プログラム高速化の基礎 2013 年 4 月 11 日 イントロダクション ループアンローリング キャッシュブロック化 数値計算ライブラリの利用 その他第 2 回 :MPIの基礎

More information

CUDA 連携とライブラリの活用 2

CUDA 連携とライブラリの活用 2 1 09:30-10:00 受付 10:00-12:00 Reedbush-H ログイン GPU 入門 13:30-15:00 OpenACC 入門 15:15-16:45 OpenACC 最適化入門と演習 17:00-18:00 OpenACC の活用 (CUDA 連携とライブラリの活用 ) CUDA 連携とライブラリの活用 2 3 OpenACC 簡単にGPUプログラムが作成できる それなりの性能が得られる

More information

Microsoft PowerPoint MPI.v...O...~...O.e.L.X.g(...Q..)

Microsoft PowerPoint MPI.v...O...~...O.e.L.X.g(...Q..) MPI プログラミング Information Initiative Center, Hokkaido Univ. MPI ライブラリを利用した分散メモリ型並列プログラミング 分散メモリ型並列処理 : 基礎 分散メモリマルチコンピュータの構成 プロセッサエレメントが専用のメモリ ( ローカルメモリ ) を搭載 スケーラビリティが高い 例 :HITACHI SR8000 Interconnection

More information

Microsoft PowerPoint - 演習2:MPI初歩.pptx

Microsoft PowerPoint - 演習2:MPI初歩.pptx 演習 2:MPI 初歩 - 並列に計算する - 2013 年 8 月 6 日 神戸大学大学院システム情報学研究科計算科学専攻横川三津夫 MPI( メッセージ パッシング インターフェース ) を使おう! [ 演習 2 の内容 ] はじめの一歩課題 1: Hello, world を並列に出力する. 課題 2: プロセス 0 からのメッセージを受け取る (1 対 1 通信 ). 部分に分けて計算しよう課題

More information

生物情報実験法 (オンライン, 4/20)

生物情報実験法 (オンライン, 4/20) 生物情報実験法 (7/23) 笠原雅弘 (mkasa@cb.k.u-tokyo.ac.jp) Table of Contents スレッドの使い方 OpenMP プログラミング Deadline The deadline is Aug 5 23:59 Your e-mail must have reached my e-mail box at the deadline time. It may take

More information

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - CproNt02.ppt [互換モード] 第 2 章 C プログラムの書き方 CPro:02-01 概要 C プログラムの構成要素は関数 ( プログラム = 関数の集まり ) 関数は, ヘッダと本体からなる 使用する関数は, プログラムの先頭 ( 厳密には, 使用場所より前 ) で型宣言 ( プロトタイプ宣言 ) する 関数は仮引数を用いることができる ( なくてもよい ) 関数には戻り値がある ( なくてもよい void 型 ) コメント

More information

POSIXスレッド

POSIXスレッド POSIX スレッド (3) システムプログラミング 2011 年 11 月 7 日 建部修見 同期の戦略 単一大域ロック スレッドセーフ関数 構造的コードロッキング 構造的データロッキング ロックとモジュラリティ デッドロック 単一大域ロック (single global lock) 単一のアプリケーションワイドの mutex スレッドが実行するときに獲得, ブロックする前にリリース どのタイミングでも一つのスレッドが共有データをアクセスする

More information

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx 並列計算の概念 ( プロセスとスレッド ) 長岡技術科学大学電気電子情報工学専攻出川智啓 今回の内容 並列計算の分類 並列アーキテクチャ 並列計算機システム 並列処理 プロセスとスレッド スレッド並列化 OpenMP プロセス並列化 MPI 249 CPU の性能の変化 動作クロックを向上させることで性能を向上 http://pc.watch.impress.co.jp/docs/2003/0227/kaigai01.htm

More information

課題 S1 解説 C 言語編 中島研吾 東京大学情報基盤センター

課題 S1 解説 C 言語編 中島研吾 東京大学情報基盤センター 課題 S1 解説 C 言語編 中島研吾 東京大学情報基盤センター 内容 課題 S1 /a1.0~a1.3, /a2.0~a2.3 から局所ベクトル情報を読み込み, 全体ベクトルのノルム ( x ) を求めるプログラムを作成する (S1-1) file.f,file2.f をそれぞれ参考にする 下記の数値積分の結果を台形公式によって求めるプログラムを作成する

More information

スライド 1

スライド 1 Parallel Programming in MPI part 2 1 1 Today's Topic ノンブロッキング通信 Non-Blocking Communication 通信の完了を待つ間に他の処理を行う Execute other instructions while waiting for the completion of a communication. 集団通信関数の実装 Implementation

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション OpenMP 並列解説 1 人が共同作業を行うわけ 田植えの例 重いものを持ち上げる 田おこし 代かき 苗の準備 植付 共同作業する理由 1. 短時間で作業を行うため 2. 一人ではできない作業を行うため 3. 得意分野が異なる人が協力し合うため ポイント 1. 全員が最大限働く 2. タイミングよく 3. 作業順序に注意 4. オーバーヘッドをなくす 2 倍率 効率 並列化率と並列加速率 並列化効率の関係

More information

プログラミングI第10回

プログラミングI第10回 プログラミング 1 第 10 回 構造体 (3) 応用 リスト操作 この資料にあるサンプルプログラムは /home/course/prog1/public_html/2007/hw/lec/sources/ 下に置いてありますから 各自自分のディレクトリにコピーして コンパイル 実行してみてください Prog1 2007 Lec 101 Programming1 Group 19992007 データ構造

More information

memo

memo 数理情報工学演習第一 C プログラミング演習 ( 第 5 回 ) 2015/05/11 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 課題 : 疎行列 2 プロトタイプ宣言 3 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int

More information

Fujitsu Standard Tool

Fujitsu Standard Tool XcalableMP ワークショップ COARRAY の便利な使い方 2017 年 10 月 31 日富士通株式会社 ) 次世代 TC 開発本部原口正寿 COARRAY 仕様 Fortran 2008 に組み込まれた分散並列機能 指示文とサービスサブルーチンではなく 文法として組み込まれた [, ] ( 角括弧 ) によるプロセス間通信と 同期のための文 アトミックサブルーチンなど組込み手続 SPMDモデル(Single

More information

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用 RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用体型のローカル変数を文字列操作関数で操作する場合の注意事項 (RXC#013) 配列型構造体または共用体の配列型メンバから読み出した値を動的初期化に用いる場合の注意事項

More information

2007年度 計算機システム演習 第3回

2007年度 計算機システム演習 第3回 2014 年度 実践的並列コンピューティング 第 10 回 MPI による分散メモリ並列プログラミング (3) 遠藤敏夫 endo@is.titech.ac.jp 1 MPI プログラムの性能を考える 前回までは MPI プログラムの挙動の正しさを議論 今回は速度性能に注目 MPIプログラムの実行時間 = プロセス内計算時間 + プロセス間通信時間 計算量 ( プロセス内 ) ボトルネック有無メモリアクセス量

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング応用演習 第 4 回再帰的構造体 プログラミングを 余談 : 教えることの難しさ 丁寧に説明しないと分かってもらえない 説明すると 小難しくなる学生が目指すべきところプログラム例を説明されて理解できる違うやり方でも良いので自力で解決できる おっけー 動けば良い という意識でプログラミング 正しく動くことのチェックは必要 解答例と自分のやり方との比較が勉強になる 今日のお題 再帰的構造体

More information

XACCの概要

XACCの概要 2 global void kernel(int a[max], int llimit, int ulimit) {... } : int main(int argc, char *argv[]){ MPI_Int(&argc, &argc); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); dx

More information

120802_MPI.ppt

120802_MPI.ppt CPU CPU CPU CPU CPU SMP Symmetric MultiProcessing CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CP OpenMP MPI MPI CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU MPI MPI+OpenMP CPU CPU CPU CPU CPU CPU CPU CP

More information

Prog1_10th

Prog1_10th 2012 年 6 月 20 日 ( 木 ) 実施ポインタ変数と文字列前回は, ポインタ演算が用いられる典型的な例として, ポインタ変数が 1 次元配列を指す場合を挙げたが, 特に,char 型の配列に格納された文字列に対し, ポインタ変数に配列の 0 番の要素の先頭アドレスを代入して文字列を指すことで, 配列そのものを操作するよりも便利な利用法が存在する なお, 文字列リテラルは, その文字列が格納されている領域の先頭アドレスを表すので,

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング応用演習 第 4 回再帰的構造体 前回の出席確認演習 #include int main() { FILE *fp; int c, linecount, length, maxlength; fp=fopen("/usr/share/dict/words","r"); if (fp == NULL) return 1; linecount=0; length=0;

More information

スライド 1

スライド 1 計算科学演習 MPI 基礎 学術情報メディアセンター情報学研究科 システム科学専攻中島浩 目次 プログラミングモデル SPMD 同期通信 / 非同期通信 MPI 概論 プログラム構造 Communicator & rank データ型 タグ 一対一通信関数 1 次元分割並列化 : 基本 基本的考え方 配列宣言 割付 部分領域交換 結果出力 1 次元分割並列化 : 高速化 通信 計算のオーバーラップ 通信回数削減

More information

プログラミング実習I

プログラミング実習I プログラミング実習 I 05 関数 (1) 人間システム工学科井村誠孝 m.imura@kwansei.ac.jp 関数とは p.162 数学的には入力に対して出力が決まるもの C 言語では入出力が定まったひとまとまりの処理 入力や出力はあるときもないときもある main() も関数の一種 何かの仕事をこなしてくれる魔法のブラックボックス 例 : printf() 関数中で行われている処理の詳細を使う側は知らないが,

More information

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt 計算機言語第 7 回 長宗高樹 目的 関数について理解する. 入力 X 関数 f 出力 Y Y=f(X) 関数の例 関数の型 #include int tasu(int a, int b); main(void) int x1, x2, y; x1 = 2; x2 = 3; y = tasu(x1,x2); 実引数 printf( %d + %d = %d, x1, x2, y);

More information

Microsoft PowerPoint - 阪大CMSI pptx

Microsoft PowerPoint - 阪大CMSI pptx 内容に関する質問は katagiri@cc.u-tokyo.ac.jp まで 第 3 回 OpenMP の基礎 東京大学情報基盤センター 片桐孝洋 1 講義日程と内容について (1 学期 : 木曜 3 限 ) 第 1 回 : プログラム高速化の基礎 2015 年 4 月 9 日 イントロダクション ループアンローリング キャッシュブロック化 数値計算ライブラリの利用 その他第 2 回 :MPIの基礎

More information

スライド 1

スライド 1 計算科学演習 MPI 基礎 学術情報メディアセンター 情報学研究科 システム科学専攻 中島浩 目次 プログラミングモデル SPMD 同期通信 / 非同期通信 MPI 概論 プログラム構造 Communicator & rank データ型 タグ 一対一通信関数 1 次元分割並列化 : 基本 基本的考え方 配列宣言 割付 部分領域交換 結果出力 1 次元分割並列化 : 高速化 通信 計算のオーバーラップ

More information

Microsoft PowerPoint - 高速化WS富山.pptx

Microsoft PowerPoint - 高速化WS富山.pptx 京 における 高速化ワークショップ 性能分析 チューニングの手順について 登録施設利用促進機関 一般財団法人高度情報科学技術研究機構富山栄治 一般財団法人高度情報科学技術研究機構 2 性能分析 チューニング手順 どの程度の並列数が実現可能か把握する インバランスの懸念があるか把握する タイムステップループ I/O 処理など注目すべき箇所を把握する 並列数 並列化率などの目標を設定し チューニング時の指針とする

More information

TFTP serverの実装

TFTP serverの実装 TFTP サーバーの実装 デジタルビジョンソリューション 佐藤史明 1 1 プレゼンのテーマ組み込みソフトのファイル転送を容易に 2 3 4 5 基礎知識 TFTP とは 実践 1 実際に作ってみよう 実践 2 組み込みソフトでの実装案 最後におさらい 2 プレゼンのテーマ 組み込みソフトのファイル転送を容易に テーマ選択の理由 現在従事しているプロジェクトで お客様からファームウェアなどのファイル転送を独自方式からTFTPに変更したいと要望があった

More information

Microsoft Word - Cプログラミング演習(12)

Microsoft Word - Cプログラミング演習(12) 第 12 回 (7/9) 4. いくつかのトピック (5)main 関数の引数を利用したファイル処理 main 関数は, 起動する環境から引数を受け取ることができる 例えば 次に示すように,main 関数に引数を用いたプログラムを作成する 01 /* sample */ 02 /* main 関数の引数 */ 03 #include 04 05 main(int argc, char

More information

第9回 配列(array)型の変数

第9回 配列(array)型の変数 第 12 回 配列型の変数 情報処理演習 ( テキスト : 第 4 章, 第 8 章 ) 今日の内容 1. 配列の必要性 2. 配列の宣言 3. 配列変数のイメージ 4. 配列変数を使用した例 5. 範囲を超えた添字を使うと? 6. 多次元配列変数 7. 多次元配列変数を使用した例 8. データのソーティング 9. 今日の練習問題 多数のデータ処理 1. 配列の必要性 ( テキスト 31 ページ )

More information

2006年10月5日(木)実施

2006年10月5日(木)実施 2010 年 7 月 2 日 ( 金 ) 実施 ファイル処理ファイルとはファイル (file) は日常用語では紙などを綴じたものを表すが, コンピュータ用語ではデータの集合体を指す言葉である ファイルは例えば, 文書ファイルやプログラムファイルのように, 用途によって分類されることもあれば, また, テキストファイルやバイナリファイルのように, ファイルの作り方によって分類されることもある なお,

More information

gengo1-11

gengo1-11 関数の再帰定義 自然数 n の階乗 n! を計算する関数を定義してみる 引数は整数 返却値も整数 n! = 1*2*3*... * (n 1)*n である ただし 0! = 1 とする int factorial(int n) int i, tmp=1; if( n>0 ) for(i=1; i

More information