• 検索結果がありません。

Microsoft PowerPoint - scls_biogrid_lecture_v2.pptx

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint - scls_biogrid_lecture_v2.pptx"

Copied!
9
0
0

読み込み中.... (全文を見る)

全文

(1)

スパコン⼊⾨コース

並列プログラミング編

⽊⼾ 善之

E-mail:[email protected] 理化学研究所 HPCI計算⽣命科学推進プログラム 企画調整グループ 企画調整チーム チーム員

1.

計算機の略歴と⽤途

2.

京のアーキテクチャ

3.

並列計算

1.

Message Passing Interface (MPI)

2.

Open MP

3.

ハイブリッド並列

4.

⾏列計算の並列化

⽬次

計算機ってなんだ?

計算機 計算に⽤いる機械(デジタル⼤辞泉) 計算のための機械、器具のこと。コン ピュータや電卓を指すことが多い (Wikipedia) ⼈が不得意な、正確な演算やルーチン ワークを肩代わりするための道具 1.計算機の略歴と⽤途

コンピュータってなんだ?

 パーソナルコンピュータ 主に個⼈で使⽤するために作られ たコンピューター。パソコン、PC  汎⽤機(メインフレーム) 企業の基幹業務に利⽤される⼤規 模なコンピュータ  スーパーコンピュータ ⾼度な数値計算(量⼦物理、ケ モ・バイオインフォマティクス、 天⽂地学...etc)のためのコン ピュータ  数値だけでなく画像、⽂書など 様々な⼊⼒に対し処理を⾏い出⼒ する装置 1.計算機の略歴と⽤途

1939年 – 1945年

第⼆次世界⼤戦!

計算機は気安く触れられるも

のではなかった

世界初の計算機

Atanasoff-Berry Computer (ABC), 1937年,

Iowa, USA

ENIAC, 1946年, Pennsylvania, USA

Zuse Z3, 1941年, Germany

世界初の汎用機

UNIVAC I, 1950年, USA 1930 1940 1950 1960 1970 1980 1990 2000 2010 アポロ11号⽉⾯着陸, 1969年 ⽊⼾の誕⽣⽇, 1975年 APRNET, 1969年, UCLA-SRI, USA TCP/IP採⽤, 1983年 , USA WWW/HTTP, 1990年 , CERN, EU Webサービス, 2000年 , W3C 1.計算機の略歴と⽤途 Grid Computing, 2003年, I. Foster

弾道計算のシミュレーション

真空中の放物運動

ただの放物運動

初期⾓度:

θ

0 初期速度:

v

0 重⼒加速度:

g

時間:

t

v

x

 v

0

cos

0

v

y

 v

0

sin

0

 gt

‐20 ‐10 0 10 20 30 40 50 0 10 20 30 40 50 60 70 80 90 100 t秒後の速度

x

 v

0

cos

0

t

y

 v

0

sin

0

t

 1

2

gt

2 t秒後の座標 1.計算機の略歴と⽤途

(2)

弾道計算のシミュレーション

空気抵抗を⼊れてみよう

速度に⽐例する空気抵抗を持つ放物運動

初期⾓度:

θ

0 初期速度:

v

0 重⼒加速度:

g

時間:

t

空気抵抗:

k

物体の質量:

m

vx v0e  k mtcos

0 vy (v0sin

0

 m kg)e  k mt m kg t秒後の速度 x mv0 k cos

0(1 e  k mt) y m k{(v0sin

0 mkg)(1 e  k mt) gt} t秒後の座標 ‐10 ‐5 0 5 10 15 20 0 10 20 30 40 1.計算機の略歴と⽤途

弾道計算シミュレーション

様々な要因と応⽤

 発射された物体を正確に標的 に当てるため  最初は軍事⽬的 要素 初速 仰⾓ 空気抵抗(湿度、気温、気圧によ り密度が変わり空気抵抗が変化) 弾丸の前⾯投影⾯積、表⾯の摩擦 係数、質量 ⾵⼒、⾵向き コリオリの⼒、重⼒加速度 物体の⾃転(スピン)による揚⼒ ゴルフ、野球などスポーツ科学 ⼈⼯衛星、スペースシャトルの打ち上げ フライトシミュレータ 3Dゲームなどのレンダリング物理演算 分⼦動⼒学によるポリマー合成、ドラッグデ ザイン 天気予報 シミュレーション 現実世界での現象を単純化、簡略化 した数理モデル(⼜は模型)を⽤い て検証を⾏う模擬実験 1.計算機の略歴と⽤途

世界初の◯◯計算機

 世界初の計算機

Atanasoff-Berry Computer (ABC), 1937年,

Iowa, USA

ENIAC, 1946年, Pennsylvania, USA

Zuse Z3, 1941年, Germany  世界初の汎⽤機 UNIVAC I, 1950年, USA  世界初の電卓 Anita Mark8, 1963年, UK CS-10A, 1964年, Japan  世界初のパソコン Altair 8800, 1975年, USA Apple 1, 1976年, USA

世界初?のスーパーコンピュータ

CDC 6600, 1964年, Lawrence

Livermore National Lab., USA.

科学技術計算に特化 計算性能を追求 商業・業務利⽤に特化 可⽤性を追求 3 MFLOPS FLOP = Floating point number Operations Per Second 1.計算機の略歴と⽤途  Linpack 浮動⼩数点のn x n⾏列の線形⽅程式系 Ax = bを解く速度を計測 出⼒ Rmax: 実効性能値(FLOPS) Nmax: 最⼤問題サイズ N問題サイズ1/2: 実効性能値の半分の性能になる時の Rpeak: 理論性能値(FLOPS)  FLOPS

Floating-point Operations Per Second

⼀秒間に浮動⼩数点演算を何回できるか? 京:約10Peta FLOPS(1016回)

性能評価のベンチマーク

LinpackとFLOPS

Ju n , 19 9 3 Nov , 19 9 3 Ju n , 19 9 4 Nov , 19 9 4 Ju n , 19 9 5 De c,  19 9 5 Ju n , 19 9 6 Nov , 19 9 6 Ju n , 19 9 7 Nov , 19 9 7 Ju n , 19 9 8 Nov , 19 9 8 Ju n , 19 9 9 Nov , 19 9 9 Ju n , 20 0 0 Nov , 20 0 0 Ju n , 20 0 1 Nov , 20 0 1 Ju n , 20 0 2 Nov , 20 0 2 Ju n , 20 0 3 Nov , 20 0 3 Ju n , 20 0 4 Nov , 20 0 4 Ju n , 20 0 5 Nov , 20 0 5 Ju n , 20 0 6 Nov , 20 0 6 Ju n , 20 0 7 Nov , 20 0 7 Ju n , 20 0 8 Nov , 20 0 8 Ju n , 20 0 9 Nov , 20 0 9 Ju n , 20 10 Nov , 20 10 Ju n , 20 11 Nov , 20 11 Ju n , 20 12 #1 #500

Top500 Jun. 2012

10PFlop/s 1PFlop/s 100TFlop/s 10TFlop/s 1TFlop/s 100GFlop/s 10GFlop/s 1GFlop/s 100MFlop/s 京, 理化学研究所/富⼠通 天河⼀号A, 中国 地球シミュレータ, JAMSTEC/NEC

*

Core2Quad, 51.2GFLOPS (理論性能値) 1.計算機の略歴と⽤途 CP-PACS, 筑波⼤/⽇⽴ 数値⾵洞, NAL(現 JAXA)/富⼠通

京のハードウェア構成

システムボード ノード×4 5120億回/秒 64GB 計算ラック システムボード×24 IOシステムボード×6 12.3兆回/秒 1.5TB ノード CPU×1 ICC×1 メモリ×8 演算性能:1280億回/秒 メモリ容量:16GB 計算ラック群 計算ラック×8 ディスクラック×2 98.4兆回/秒 12TB システム全体 計算ラック×800以上 1京回/秒=10ペタフロップス 1PB以上 80,000個以上の CPU間を相互に接続する インターコネクト 2.京のアーキテクチャ

(3)

CISC(Complex Instruction Set Computer)  命令語(word)が可変⻑  単⼀の命令で複数の処理 ↓ Intel x86系,680x0系 RISC(Reduced Instruction Set Computer)  Wordが固定⻑  アーキテクチャを単純にして性能 向上、コスト削減を⽬指した(過 去形) ↓ SPARC系,PowerPC系

CPU (Central Processing Unit)と

メモリ・キャッシュ

CPU アキュムレータ(レジ スタ) 演算回路 プログラムカウンタ 命令レジスタ データ 命令 メインメモリ 2.京のアーキテクチャ ⾼性能・省電⼒マルチコアCPU  消費電⼒性能 ピーク性能:128 GFLOPS(16 GFLOPS × 8コア) 消費電⼒:58W マルチコア化による⾼性能化と省電⼒化を両⽴ ⽔冷⽅式を採⽤.CPU温度を下げ,リーク電流を削減  マルチコアを1つのCPUとして扱うVISIMPACTを装備  アプリケーション性能の更なる⾼速化.HPC向けに強化 HPC向け拡張機構を装備 メモリバンド幅:65 GB/s  ⾼信頼性 広範囲なエラー検出・⾃⼰修復機能,命令リトライ機能

SPARC64 VIIIfx(京)

仕様 アーキテクチャ SPARC64tmVIIIfx L1キャッシュ 32KB(D), 32KB(I), 2way L2キャッシュ 6MB, 12way 浮動⼩数点演算器機構 FMA x 4 (2 SIMD) 浮動⼩数点演算同時実⾏数 8 メモリバンド幅 64 GB/s 2.京のアーキテクチャ

Virtual Single Processor by Integrated Multi-core

Parallel Architecture

マルチコアを1つの仮想CPUとして扱う

 コア間でのスレッド並列処理を効率的に実⾏  ⾼効率なハイブリッド並列(⾃動並列+MPI)を実現

CPU

 コア間でのハードウェアバリア機能  ⼤容量共有L2キャッシュ

コンパイラ

 ⾃動ベクトル化による⾃動並列

VISIMPACT

2.京のアーキテクチャ  ノード間(CPU間)の通信技術  アーキテクチャ 6次元メッシュ/トーラストポロジ 3次元メッシュの12ノードを1Tofu Tofu単位を3次元トーラストポロジで接続 バンド幅:5GB/s  特徴 ⾼並列を実現するスケーラビリティ 最⼤約10万ノード規模 (98,304=32x32x8x2x3x2) ⾼い可⽤性 任意にメッシュ分割しても常に3次元 トーラストポロジを構成 故障ノードを回避してトーラストポロジ を構成

Tofu (Torus Fusion)

インターコネクト

1Tofu 3次元メッシュトポロジ 1ノード 3次元トーラストポロジ 2.京のアーキテクチャ

ユーザから⾒た京

京 計算ノード 京 ログインノード ユーザクライアント 学術情報ネットワーク SINET SINETにつながったサイト (⼤学・研究所)からアクセス SSHでリモートログイン ログインノードから 計算ノードへジョブ投⼊

ユーザはログインノードに

てプログラム開発・ジョブ

操作を⾏う

データステージングにてプ

ログラムファイル・データ

ファイルを計算ノードに転

出⼒ファイルもデータス

テージングにて取得

データステージングも含め

ジョブスクリプトに記述

京の論理構成

ログインノード ホーム /home/group/user /data/groupデータ ステージ アウト ステージ イン 計算ノード ワーク領域 (計算ノードローカル) /work 計算ノード ワーク領域 (計算ノードローカル) /work 計算ノード ワーク領域 (計算ノードローカル) /work 計算ノード ワーク領域 (計算ノードローカル) /work

(4)

#!/bin/bash # #PJM --rsc-list "node=1000" #PJM --rsc-list "elapse=01:00:00" #PJM --rsc-list "node-mem=10Gi" #PJM --stg-transfiles all #PJM --stgin "./program.out ./a.out" #PJM --stgin "./input.edf ./"

#PJM --stgout "./output* ./result/ stgout=all" #PJM -s

#

. /work/system/Env_base export PARALLEL=8 export OMP_NUM_THREADS=$PARALLEL

mpiexec -n 1000 ./a.out -y –o output -T 0.05 -L 1 -S linear –i input.edf

サンプルジョブスクリプト

確保するノード数 確保する実⾏時間 1ノード当たりのメモリ ステージインするファイル ステージアウトするファイル プロセス並列数 (確保したノード数と同数) プログラムのパラメータ スレッド並列数 (ノード内のコア数)

klogin1$ pjsub sample.sh [INFO] PJM 0000 pjsub Job 1430000 submitted. klogin1$ pjstat

ACCEPT QUEUED STGIN READY RUNING RUNOUT STGOUT HOLD ERROR TOTAL 0 1 0 0 0 0 0 0 0 1 s 0 1 0 0 0 0 0 0 0 1 JOB_ID JOB_NAME MD ST USER START_DATE ELAPSE_LIM NODE_REQUIRE 1430000 sample NM QUE user00XX - 0001:00:00 1000 klogin1$

1.

計算機の略歴と⽤途

2.

京のアーキテクチャ

3.

並列計算

1.

Message Passing Interface (MPI)

2.

Open MP

3.

ハイブリッド並列

4.

⾏列計算の並列化

⽬次

逐次処理の問題,プログラム(実⾏時間:T)をnに分

割し、n台のプロセッサ(or 計算機)でT/n時間にす

プロセッサに割り当てられるタスクは独⽴

並列化できる問題はデータに依存性のない問題のみに

限られる

通信によるオーバヘッド

 ⽴ち上がり時間  データ転送時間

並列プログラミングとは

時間:T 問題 T/n 分割数:n 並列化 オーバヘッド 3.並列計算 ⽴ち上がり時間 データ転送時間

プロセス並列

メモリ空間は独⽴ 並列タスク間でのデータ通 信は必要に応じて 例:Message Passing Interface (MPI)

スレッド並列

メモリ空間を共有 データ通信の必要性なし 例:OpenMP

プロセス並列とスレッド並列

プロセス1 メモリ 空間 ローカ ル変数 プロセス2 メモリ 空間 ローカ ル変数 プロセス3 メモリ 空間 ローカ ル変数 インターコネクト プロセス メモリ空間 ローカル 変数 スレッド1 ローカル 変数 スレッド2 ローカル 変数 スレッド3 グローバル変数領域 3.並列計算 プロセス並列 スレッド並列  メッセージパッシング/プロセス間通信の規格  分散メモリ型並列計算機での並列実⾏に向く  ⼤規模計算が可能に  スケーラビリティ、性能は⾼  主要な実装例 MPICH LAM OpenMPI(C⾔語,C++,Fortran)  略語 Processor Element:プロセスの単位.MPIプロセスを指す. Rank:PEの識別番号のこと.MPI_Comm_rank関数で設定されるランク ID

Message Passing Interface

(MPI)

3.並列計算

システム関数

MPI_Init, MPI_Comm_rank, MPI_Comm_size,

MPI_Finalize

1対1通信

ブロッキング:MPI_Send, MPI_Recv ノンブロッキング:MPI_Isend, MPI_Irecv

1対全通信

MPI_Bcast

数段通信

MPI_Reduce, MPI_Allreduce, MPI_Barrier

MPI関数

(5)

 ブロッキングして相⼿プロセスからの通信を待ち受けるReciver関数  相⼿プロセスがMPI_sendで送信するまで待ち受ける  buf : 受け取るバッファのアドレス(Output)  count : 受け取るレシーブの最⼤数(Input)  datatype : レシーブのデータタイプ(Input)  source : ソースのランクID(Input)  tag : メッセージタグ(Input)  comm : コミュニケータ(input)  status : ステータスオブジェクト(Output)

基本的なMPI関数 MPI_Recv

#include <mpi.h>

int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)

3.並列計算 相⼿プロセスへの通信を⾏うSend関数 相⼿プロセスがMPI_recvで受信するまで待ち受ける buf : 送信バッファのアドレス(Input) count : 送信する最⼤数(Input) datatype : 送信データのデータタイプ(Input) source : 宛先のランクID(Input) tag : メッセージタグ(Input) comm : コミュニケータ(input)

基本的なMPI関数 MPI_Send

#include <mpi.h>

int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)

3.並列計算 rootのランクID以下のプロセスに対しブロードキャス ト(全送信)する関数 buf : 送信バッファのアドレス(Input) count : 送信する最⼤数(Input) datatype : 送信データのデータタイプ(Input) root : rootのランクID(Input) comm : コミュニケータ(input)

基本的なMPI関数 MPI_Bcast

#include <mpi.h>

int MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm)

3.並列計算  Reducerプロセスがsendするbuffer(sendbuf)に対し,指定の演算 (op)を⾏い,rootに結果を送信する  この演算に加わるプロセス全て(rootも)がMPI_reduceを呼び出す必 要がある  sendbuf : 送信バッファのアドレス(Input)  recvbuf : 演算結果を受信するバッファアドレス(Output)  count : 送信する最⼤数(Input)  datatype : 送信データのデータタイプ(Input)  op : 演算⼦(Input)  root : rootのランクID(Input)  comm : コミュニケータ(input)

基本的なMPI関数 MPI_Reduce

#include <mpi.h>

int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)

3.並列計算  プロセスのrank idの0から順番にsendbufをrecvbufに配列として送信する  受け取るのはroot  sendbuf : 送信バッファのアドレス(Input)  sendcount : 送信する最⼤数(Input)  sendtype : 送信バッファのデータタイプ(Input)  recvbuf : 受信するバッファアドレス(Output)  recvcount : 受信する最⼤数,配列の数(Input)  recvtype : 受信バッファのデータタイプ(Input)  root : root(受信先)のランクID(Input)  comm : コミュニケータ(input)

基本的なMPI関数 MPI_Gather

3.並列計算 #include <mpi.h>

int MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)

 rootプロセスのsendbufからsendcount個ずつ前プロセスのrecvbufに送信する  sendbufには配列,recvbufにはその要素が⼊る  sendbuf : 送信バッファのアドレス(Input)  sendcount : 送信する最⼤数(Input)  sendtype : 送信バッファのデータタイプ(Input)  recvbuf : 受信するバッファアドレス(Output)  recvcount : 受信する最⼤数,配列の数(Input)  recvtype : 受信バッファのデータタイプ(Input)  root : root(送信元)のランクID(Input)  comm : コミュニケータ(input)

基本的なMPI関数 MPI_Scatter

#include <mpi.h>

int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)

(6)

MPI_Datatype C⾔語での型

MPI_CHAR char

MPI_SHORT short

MPI_INT int

MPI_LONG long

MPI_UNSIGNED_CHAR unsigned char MPI_UNSIGNED_SHORT unsigned short MPI_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long

MPI_FLOAT float

MPI_DOUBLE double

MPI_LONG_DOUBLE long double

MPI_BYTE N/A : バイト型 MPI_PACKED N/A : 他のライブラリにおけるパック/ア ンパック処理の互換性を持たせるための型

MPIデータタイプ

3.並列計算 #include <mpi.h> #include <stdio.h> #include <string.h> int main(int argc, char **argv) {

char msg[20]; int myrank, num, i; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank( MPI_COMM_WORLD, &myrank); MPI_Comm_size( MPI_COMM_WORLD, &num); if ( myrank == 0 ) {

strcpy(msg, "Hello, World."); for (i = 1; i < num; i++) {

MPI_Send(msg, strlen(msg) + 1, MPI_CHAR, i, 99, MPI_COMM_WORLD);

}

printf("rank %d send: %s¥n", myrank, msg); } else {

MPI_Recv(msg, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);

printf("rank %d receive: %s¥n", myrank, msg); } MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); return 0; }

MPIでHello, World.

Rank 0は送信側 その他のRankは受信側

$ mpicc hello_mpi.c –o m.out $ mpirun –n 4 ./m.out rank 0 send: Hello, World. rank 1 receive: Hello, World. rank 2 receive: Hello, World. rank 3 receive: Hello, World. $ 3.並列計算 MPI  プログラマが並列化を意識してコードを書く必要がある OpenMP  1ノードの中で閉じた並列処理  コンパイラが⾃動的に並列化(並列化効率はコンパイラに依 存)  ソースコード中にOpenMPディレクティブを挿⼊し、 OpenMP環境下では有効になり,それ以外では無効になる  並列化と⾮並列では同じソースコードとなる

OpenMPによるスレッド並列

#ifdef _OPENMP //OpenMPを使う #else //OpenMPを使わない #endif

#pragma omp parallel for

for (i = 0; i < 1000; i++ ) { // 並列処理させたいコード } 3.並列計算

Parallel Regions (並列実⾏構⽂)

Work Sharing (ワークシェアリング)

Data Environment (データ環境)

Synchronization (同期機構)

Runtime functions, environment variables (実⾏関

数, 環境変数)

というディレクティブで指定する

OpenMPの構⽂

#pragma  … … 3.並列計算

複数のスレッドによって並列処理する並列領域を

定義する

セクション内をnスレッド並列で処理

num_threads()を省略するとコア数分だけ並列化

Parallel Regions

#pragma ompparallel num_threads(n)

{ }

3.並列計算

#pragma omp forの後は必ずfor⽂

4スレッドでfor⽂を実⾏すると  スレッド 0: for (i = 0; i < 25; i++) ...  スレッド 1: for (i = 25; i < 50; i++) ...  スレッド 2: for (i = 50; i < 75; i++) ...  スレッド 3: for (i = 75; i < 100; i++) ... が実⾏される

#pragma omp parallel forとしてもOK

Work Sharing (for⽂)

#pragma omp parallel

{

#pragma ompfor

for (i = 0; i < 100; i++) { }

}

(7)

各スレッドで別々の処理を⾏う場合,sectionsで

指⽰

Work Sharing (sections⽂)

#pragma ompsections parallel

{

#pragma omp section printf (...); #pragma omp section printf (...); }

3.並列計算

並列処理の領域内でシングルスレッドで⾏いたい

処理はsingle⽂で指⽰

Work Sharing (single⽂)

#pragma omp parallel

{

#pragma ompsingle

{ } } 3.並列計算

シングルと似たような処理だが,masterスレッド

(thread 0)に限定して処理をさせたい場合,

master⽂で指⽰

master⽂よりsingle⽂の⽅が効率が良い

Work Sharing (master⽂)

#pragma omp parallel

{

#pragma ompmaster

{ } } 3.並列計算

privateで指定した変数は,各スレッドのprivate変

数となり,スレッド間で

共有されない

sharedで明⽰的に共有変数として指⽰も可能だが,

デフォルトで共有変数なのでsharedを使うことは

ない

Data Environment (private)

#pragma omp parallel for private(x)

for (y = 0; y < 100; y++) { for (x = 0; x < 100; x++) { } } 3.並列計算

reductionで指定した変数は,各スレッドの

private変数となり,並列領域の処理が終了した時

点で指定した演算⼦によって演算される

上記の例だと各スレッドのsの合計

演算⼦は+, * , -, &, ^, |, &&, ||

Data Environment (reduction)

#pragma omp parallel for reduction(+:s)

{ for (x = 0; x < 100; x++) s++; } 3.並列計算

読み込み、書き込みが⼀⽂で⾏われるデータの同

期に利⽤

{}による複数の⾏,セクションに対してatomic⽂

を適⽤することはできない

Synchronization (atomic⽂)

#pragma ompatomic

data += 1;

(8)

各スレッドはbarrier⽂の箇所にて,待機しbarrier

同期(ソフトウェア)の制御を⾏う

全てのスレッドがbarrier⽂まで到達すると各ス

レッドは処理を再開する

またsingle, master, section, for, parallelでは処

理の最後で

暗黙の同期

を⾏なっている

Synchronization (barrier⽂)

#pragma omp parallel

x = func(); #pragma ompbarrier

#pragma omp for

for (i = 0; i < x; i++) ... } 3.並列計算

変数nを条件に並列化したい場合,if⽂を利⽤する

この場合,nが1000以上の場合,並列化を⾏う

sectionsにつける場合もOK

その他の制御(if⽂)

#pragma omp parallel for if(n > 1000)

for (i = 0; i < n; i++) { ... } 3.並列計算

暗黙の同期をせずに,各スレッドが処理を続⾏し

たい場合,nowait⽂を利⽤する

暗黙の同期を⾏うfor, sections, singleにつける事

ができる

その他の制御(nowait⽂)

#pragma omp parallel

{

#pragma omp for nowait

for (i = 0; i < n; i++) { ...

} }

3.並列計算

void omp_set_num_threads(int num)

並列領域で使⽤出来るスレッド数を設定 OMP_NUM_THREADSを上書きする

int omp_get_num_threads()

現在のスレッド数を返す

int omp_get_thread_num()

スレッド番号を返す

int omp_in_parallel(()

並列領域内であるかを返す.真なら1.偽なら0.

Runtime function, environment

variables

3.並列計算

#include <omp.h> #include <stdio.h>

int main(int argc, char **argv) {

#pragma omp parallel num_threads(4) {

printf("Thread %d, Hello, world¥n", omp_get_thread_num());

}

return 0; }

OpenMPでHello, World.

4つのスレッド並列

$ gcc –fopenmp hello_omp.c -o o.out $ ./o.out

Thread 3, Hello, world Thread 0, Hello, world Thread 1, Hello, world Thread 2, Hello, world $ 3.並列計算 ノード1 プロセス フラット並列モデル プロセス並列のみ コアごとにプロセス 通信がプロセス間ごとに発 ⽣ ハイブリッド並列モデル プロセス並列(ノード間) +スレッド並列(ノード 内) コア数が増えてもプロセス 数は増加せず 通信が混雑しない

ハイブリッド並列

3.並列計算 ノード1 core core プロ セス プロセス core プロ セス core プロ セス ノード2 core core プロ セス プロセス core プロ セス core プロ セス core core スレ ッド スレッド core スレ ッド core スレ ッド ノード2 プロセス core core スレ ッド スレッド core スレ ッド core スレ ッド フラット並列 ハイブリッド並列

(9)

1.

計算機の略歴と⽤途

2.

京のアーキテクチャ

3.

並列計算

1.

Message Passing Interface (MPI)

2.

Open MP

3.

ハイブリッド並列

4.

⾏列計算の並列化

⽬次

並列化を体感するには良い課題

コンパイラや計算機性能のベンチマークにも利⽤

実装⽅式で性能に⼤きな違いがでる 科学技術計算の特徴が顕著 メモリの連続アクセス キャッシュに乗らない⼤規模データに対する演算が可能 (⾏列の拡⼤) バンド幅が必要なメモリ・インテンシブな演算

⾏列積の計算

c

ij

a

ij

b

ij k1 n

⾏列積 int i, j, k, n; n = 32; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { for (k = 0; k < n; k++) {

c[i][j] = c[i][j] + a[i][k] * b[k][j]; } } }

課題1:⾏列積のコードを書く

c

ij

a

ij

b

ij k1 n

⾏列積

C

a

x

b

i j i k k j = シングルプロセスで⾏う⾏列積(32×32)のプログラムを書いてみよう

MPIで並列化

cとaをn列に分割する

bはそのまま共有する

⾏列積を演算するループのあとで,Cをマージする

課題2:⾏列積の並列化

C a x b i = i k j k j 考え⽅ ⾏列積のプログラムを並列化してみよう Rank 0 すべてのRank(プロセッサ)で同じプロセスが動作する 変数aは全てプロセスで同じ⾏列を共有して、演算に利⽤す るところだけを変化させる 演算が終わったあとrank0の変数cにマージ MPIで並列化できたら,OpenMPで⾃動並列してみよう

課題2の考え⽅

a.out メモリ:aの領域 Rank 1 a.out メモリ:aの領域 Rank 2 a.out メモリ:aの領域 ...

参照

関連したドキュメント

Theorem 2 If F is a compact oriented surface with boundary then the Yang- Mills measure of a skein corresponding to a blackboard framed colored link can be computed using formula

READ UNCOMMITTED 発生する 発生する 発生する 発生する 指定してもREAD COMMITEDで動作 READ COMMITTED 発生しない 発生する 発生する 発生する デフォルト.

More precisely, the statement is, firstly, that the global quasi-symmetry of the action S only needs to hold for one fixed region of the world volume, namely the pertinent full

Sometimes also, the same code is associated with a different rating, for example in the American questionnaire “9. Not answered” and in the French questionnaire “9.?”, which

Combining energy-derived CO 2 emissions (industrial, commercial, residential, and transport sectors) with non-energy-derived CO 2 emissions (others), trends and composition ratios

ダウンロードしたファイルを 解凍して自動作成ツール (StartPro2018.exe) を起動します。.

1 BP Statistical Review of World Energy June 2014. 2 BP Statistical Review of World Energy

Figure 2-10 Composition ratios in final energy consumption by fuel type in the industrial sector ... Figure 2-11 IIP increases in manufacturing in