96
OpenMP/OpenACC 並列入門 C 言語編 OpenMP 中島研吾 東京大学情報基盤

OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMP/OpenACCによるマルチコア・メニィコア並列プログラミング入門

C言語編第Ⅱ部:OpenMP

中島研吾東京大学情報基盤センター

Page 2: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

• OpenMP• Login to Reedbush-U• Parallel Version of the Code by OpenMP• STREAM• Data Dependency

2

Page 3: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

Hybrid並列プログラミング3

• スレッド並列+メッセージパッシング

– OpenMP+ MPI– CUDA + MPI, OpenACC + MPI

• 個人的には自動並列化+MPIのことを「ハイブリッド」とは呼んでほしくない

– 自動並列化に頼るのは危険である

– 東大センターでは現在自動並列化機能はコンパイラの要件にしていない(調達時に加点すらしない)

• 利用者にももちろん推奨していない

• OpenMPがMPIより簡単ということはない

– データ依存性のない計算であれば,機械的にOpenMP指示文を入れれば良い

– NUMAになるとより複雑:First Touch Data Placement

Page 4: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

Flat MPI vs. Hybrid4

Hybrid :Hierarchal Structure

Flat-MPI:Each Core -> Independent

corecorecorecore

mem

ory core

corecorecore

mem

ory core

corecorecorem

emor

y corecorecorecorem

emor

y corecorecorecore

mem

ory core

corecorecore

mem

ory

mem

ory

mem

ory

mem

ory

core

core

core

core

core

core

core

core

core

core

core

core

Page 5: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

5

HB M x N

Number of OpenMP threads per a single MPI process

Number of MPI processper a single node

L1

C

L1

C

L1

C

L1

C

L1

C

L1

C

L1

C

L1

C

L1

C

L1

C

L1

C

L1

C

L1

C

L1

C

L1

C

L1

C

L2

Memory

Page 6: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

並列プログラミングモデルによって各プロセスの受け持つデータの量は変わる

分散メッシュの数も各サイズも変わるexample: 6 nodes, 96 cores

6

HB 4x4Flat MPI HB 16x1

128 192 648 12 1

pcube

128 192 644 6 1

pcube

128 192 642 3 1

pcube

Page 7: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

共有メモリ型計算機

• SMP– Symmetric Multi Processors

– 複数のCPU(コア)で同じメモリ空間を共有するアーキテクチュア

OMP-1 7

MEMORY

CPU

CPU

CPU

CPU

CPU

CPU

CPU

CPU

Page 8: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMPとはhttp://www.openmp.org

• 共有メモリ型並列計算機用のDirectiveの統一規格– この考え方が出てきたのは MPIやHPFに比べると遅く1996年であるという。

– 現在 Ver.4.0

• 背景– CrayとSGIの合併– ASCI計画の開始

• 主な計算機ベンダーが集まって OpenMP ARBを結成し,1997年にはもう規格案ができていたそうである– SC98ではすでにOpenMPのチュートリアルがあったし,すでに

SGI Origin2000でOpenMP-MPIハイブリッドのシミュレーションをやっている例もあった。

OMP-1 8

Page 9: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMPとは(続き)

• OpenMPはFortan版とC/C++版の規格が全く別々に進められてきた。

– Ver.2.5で言語間の仕様を統一

• Ver.4.0ではGPU,Intel-MIC等Co-Processor,Accelerator環境での動作も考慮– OpenACC

OMP-1 9

Page 10: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMPの概要• 基本的仕様

– プログラムを並列に実行するための動作をユーザーが明示– OpenMP実行環境は,依存関係,衝突,デッドロック,競合条件,結果としてプログラムが誤った実行につながるような問題に関するチェックは要求されていない。

– プログラムが正しく実行されるよう構成するのはユーザーの責任である。

• 実行モデル– fork-join型並列モデル

• 当初はマスタスレッドと呼ばれる単一プログラムとして実行を開始し,「PARALLEL」,「END PARALLEL」ディレクティヴの対で並列構造を構成する。並列構造が現れるとマスタスレッドはスレッドのチームを生成し,そのチームのマスタとなる。

– いわゆる「入れ子構造」も可能であるが,ここでは扱わない

OMP-1 10

Page 11: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

Fork-Join 型並列モデルOMP-1 11

Master

thread

thread

thread

thread

thread

thread

thread

Master

thread

thread

thread

thread

thread

thread

thread

MasterMasterMaster

PARALLELfork

END PARALLELjoin

PARALLELfork

END PARALLELjoin

Page 12: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

スレッド数

• 環境変数OMP_NUM_THREADS– 値の変え方

• bash(.bashrc) export OMP_NUM_THREADS=8

• csh(.cshrc) setenv OMP_NUM_THREADS 8

• たとえば,OMP_NUM_THREADS=4とすると,以下のようにi=1~100のループが4分割され,同時に実行される。

OMP-1 12

do i= 1, 25

do i= 26, 50

do i= 51, 75

do i= 76, 100

do i= 1,100

Page 13: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMPに関連する情報

• OpenMP Architecture Review Board (ARB)– http://www.openmp.org

• 参考文献– Chandra, R. et al.「Parallel Programming in OpenMP」(Morgan Kaufmann)

– Quinn, M.J. 「Parallel Programming in C with MPI and OpenMP」(McGrawHill)

– Mattson, T.G. et al. 「Patterns for Parallel Programming」(Addison Wesley)

– 牛島「OpenMPによる並列プログラミングと数値計算法」(丸善)– Chapman, B. et al. 「Using OpenMP」(MIT Press)最新!

• 富士通他による翻訳:(OpenMP 3.0)必携 !– http://www.openmp.org/mp-documents/OpenMP30spec-ja.pdf

OMP-1 13

Page 14: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMPに関する国際会議

• WOMPEI(International Workshop on OpenMP: Experiences and Implementations )

– 日本(1年半に一回)

• WOMPAT(アメリカ),EWOMP(欧州)

• 2005年からこれらが統合されて「IWOMP」となる,毎年開催。

– International Workshop on OpenMP– http://www.nic.uoregon.edu/iwomp2005/– Eugene, Oregon, USA

OMP-1 14

Page 15: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMPの特徴

• ディレクティヴ(指示行)の形で利用– 挿入直後のループが並列化される– コンパイラがサポートしていなければ,コメントとみなされる

OMP-1 15

Page 16: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMP/DirectivesArray Operations

16

#pragma omp parallel for private (i)for (i=0; i<N; i++) {

X[i] = 0.0;W[0][i] = 0.0;W[1][i] = 0.0;W[2][i] = 0.0;

}

RHO = 0.0;#pragma omp parallel for private (i)reduction (+:RHO)for(i=0; i<N; i++) {

RHO += W[R][i] * W[Z][i];}

Simple Substitution Dot Products

#pragma omp parallel for private (i)for (i=0; i<N; i++) {

Y[i] = Y[i} + alphat*X[i]; }

DAXPY

Page 17: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMP/DireceivesMatrix/Vector Products

OMP-1 17

#pragma omp parallel for private (i,VAL,j)for(i=0; i<N; i++) {

VAL = D[i] * W[P][i];for(j=indexL[i]; j<indexL[i+1]; j++) {

VAL += AL[j] * W[P][itemL[j]-1];}

for(j=indexU[i]; j<indexU[i+1]; j++) {VAL += AU[j] * W[P][itemU[j]-1];

}W[Q][i] = VAL;

}

Page 18: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMPの特徴• ディレクティヴ(指示行)の形で利用

– 挿入直後のループが並列化される– コンパイラがサポートしていなければ,コメントとみなされる

• 何も指定しなければ,何もしない– 「自動並列化」,「自動ベクトル化」とは異なる。– 下手なことをするとおかしな結果になる:ベクトル化と同じ– データ分散等(Ordering)は利用者の責任

• 共有メモリユニット内のプロセッサ数に応じて,「Thread」が立ち上がる– 「Thread」:MPIでいう「プロセス」に相当する。– 普通は「Thread数=共有メモリユニット内プロセッサ数,コア数」であるが最近のアーキテクチャではHyper Threading(HT)がサポートされているものが多い(1コアで2-4スレッド)

OMP-1 18

Page 19: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

メモリ競合

• 複雑な処理をしている場合,複数のスレッドがメモリ上の同じアドレスにあるデータを同時に更新する可能性がある。

– 複数のCPUが配列の同じ成分を更新しようとする。

– メモリを複数のコアで共有しているためこのようなことが起こりうる。

– 場合によっては答えが変わる

OMP-1 19

MEMORY

CPU

CPU

CPU

CPU

CPU

CPU

CPU

CPU

Page 20: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

メモリ競合(続き)

• 本演習で扱っている例は,そのようなことが生じないよう,各スレッドが同時に同じ成分を更新するようなことはないようにする。

– これはユーザーの責任でやること,である。

• ただ多くのコア数(スレッド数)が増えるほど,メモリへの負担が増えて,処理速度は低下する。

OMP-1 20

MEMORY

CPU

CPU

CPU

CPU

CPU

CPU

CPU

CPU

Page 21: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMPの特徴(続き)

• 基本は「!omp parallel do」~「!omp end parallel do」• 変数について,グローバルな変数と,Thread内でローカルな「private」な変数に分けられる。– デフォルトは「global」– 内積を求める場合は「reduction」を使う

OMP-1 21

W(:,:),R,Z,PEsmpTOTなどはグローバル変数

!$omp parallel do private(iS,iE,i)!$omp& reduction(+:RHO)

do ip= 1, PEsmpTOTiS= STACKmcG(ip-1) + 1iE= STACKmcG(ip )do i= iS, iE

RHO= RHO + W(i,R)*W(i,Z)enddo

enddo!$omp end parallel do

Page 22: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

FORTRANとC

OMP-1 22

#include <omp.h>...{

#pragma omp parallel for default(none) shared(n,x,y) private(i)

for (i=0; i<n; i++)x[i] += y[i];

}

use omp_lib...!$omp parallel do shared(n,x,y) private(i)

do i= 1, nx(i)= x(i) + y(i)

enddo!$ omp end parallel do

Page 23: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

本講義における方針

• OpenMPは多様な機能を持っているが,それらの全てを逐一教えることはしない。

– 講演者も全てを把握,理解しているわけではない。

• 数値解析に必要な最低限の機能のみ学習する。– 具体的には,講義で扱っているICCG法によるポアソン方程式ソルバーを動かすために必要な機能のみについて学習する

– それ以外の機能については,自習,質問のこと(全てに答えられるとは限らない)。

OMP-1 23

Page 24: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

最初にやること

• use omp_lib FORTRAN• #include <omp.h> C

• 様々な環境変数,インタフェースの定義(OpenMP3.0以降でサポート)

OMP-1 24

Page 25: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMPディレクィヴ(FORTRAN)

• 大文字小文字は区別されない。• sentinel

– 接頭辞– FORTRANでは「!$OMP」,「C$OMP」,「*$OMP」,但し自由ソース形式では「!$OMP」のみ。

– 継続行にはFORTRANと同じルールが適用される。以下はいずれも「!$OMP PARALLEL DO SHARED(A,B,C)」

OMP-1 25

sentinel directive_name [clause[[,] clause]…]

!$OMP PARALLEL DO!$OMP+SHARED (A,B,C)

!$OMP PARALLEL DO &!$OMP SHARED (A,B,C)

Page 26: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMPディレクィヴ(C)

• 継続行は「\」• 小文字を使用(変数名以外)

OMP-1 26

#pragma omp directive_name [clause[[,] clause]…]

#pragma omp parallel for shared (a,b,c)

Page 27: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

PARALLEL DO

• 多重スレッドによって実行される領域を定義し,DOループの並列化を実施する。

• 並び項目(clause):よく利用するもの– PRIVATE(list)– SHARED(list)– DEFAULT(PRIVATE|SHARED|NONE)– REDUCTION({operation|intrinsic}: list)

OMP-1 27

!$OMP PARALLEL DO[clause[[,] clause] … ](do_loop)

!$OMP END PARALLEL DO

#pragma parallel for [clause[[,] clause] … ](for_loop)

Page 28: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

REDUCTION

• 「MPI_REDUCE」のようなものと思えばよい• Operator

– +,*,-,.AND.,.OR.,.EQV.,.NEQV.

• Intrinsic– MAX,MIN,IAND,IOR,IEQR

OMP-1 28

REDUCTION ({operator|instinsic}: list)

reduction ({operator|instinsic}: list)

Page 29: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

実例A1:簡単なループ

• ループの繰り返し変数(ここでは「i」)はデフォルトでprivateなので,明示的に宣言は不要。

• 「END PARALLEL DO」は省略可能。– C言語ではそもそも存在しない

OMP-1 29

!$OMP PARALLEL DO do i= 1, NB(i)= (A(i) + B(i)) * 0.50

enddo !$OMP END PARALLEL DO

Page 30: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

実例A2:REDUCTION

• 「END PARALLEL DO」は省略可能。

OMP-1 30

!$OMP PARALLEL DO DEFAULT(PRIVATE) REDUCTION(+:A,B)do i= 1, Ncall WORK (Alocal, Blocal)A= A + AlocalB= B + Blocal

enddo!$OMP END PARALLEL DO

Page 31: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMP使用時に呼び出すことのできる関数群

31

関数名 内容

int omp_get_num_threads (void) スレッド総数

int omp_get_thread_num (void) 自スレッドのID

double omp_get_wtime (void) MPI_Wtimeと同じ

void omp_set_num_threads (intnum_threads)call omp_set_num_threads (num_threads)

スレッド数設定

Page 32: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMP for Dot Products32

VAL= 0.0;for(i=0; i<N; i++){VAL= VAL + W[R][i] * W[Z][i];

}

Page 33: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMP for Dot Products33

VAL= 0.0;#pragma omp parallel for private (i) reduction(+:VAL)

for(i=0; i<N; i++){VAL= VAL + W[R][i] * W[Z][i];

}

Directives are just inserted.

VAL= 0.0;for(i=0; i<N; i++){VAL= VAL + W[R][i] * W[Z][i];

}

Page 34: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMP for Dot Products34

VAL= 0.0;#pragma omp parallel for private (i,ip) reduction(+:VAL)

for(ip=0; ip<PEsmpTOT; ip++){for (i=INDEX[ip]; i<INDEX[ip+1]; i++){

VAL= VAL + W[R][i] * W[Z][i]; }

}

VAL= 0.0;for(i=0; i<N; i++){VAL= VAL + W[R][i] * W[Z][i];

}

VAL= 0.0;#pragma omp parallel for private (i) reduction(+:VAL)

for(i=0; i<N; i++){VAL= VAL + W[R][i] * W[Z][i];

}

OpenMPディレクティヴの挿入これでも並列計算は可能

多重ループの導入PEsmpTOT:スレッド数あらかじめ「INDEX(:)」を用意しておくより確実に並列計算実施(別に効率がよくなるわけでは無い)

Page 35: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMP for Dot Products35

VAL= 0.0;#pragma omp parallel for private (i,ip) reduction(+:VAL)

for(ip=0; ip<PEsmpTOT; ip++){for (i=INDEX[ip]; i<INDEX[ip+1]; i++){

VAL= VAL + W[R][i] * W[Z][i]; }

}

VAL= 0.0;for(i=0; i<N; i++){VAL= VAL + W[R][i] * W[Z][i];

}

VAL= 0.0;#pragma omp parallel for private (i) reduction(+:VAL)

for(i=0; i<N; i++){VAL= VAL + W[R][i] * W[Z][i];

}

OpenMPディレクティヴの挿入これでも並列計算は可能

多重ループの導入PEsmpTOT:スレッド数あらかじめ「INDEX(:)」を用意しておくより確実に並列計算実施

PEsmpTOT個のスレッドが立ち上がり,並列に実行

Page 36: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OpenMP for Dot Products36

VAL= 0.0;#pragma omp parallel for private (i,ip) reduction(+:VAL)

for(ip=0; ip<PEsmpTOT; ip++){for (i=INDEX[ip]; i<INDEX[ip+1]; i++){

VAL= VAL + W[R][i] * W[Z][i]; }

}

e.g.: N=100, PEsmpTOT=4

INDEX[0]= 0INDEX[1]= 25INDEX[2]= 50INDEX[3]= 75INDEX[4]= 100

多重ループの導入PEsmpTOT:スレッド数あらかじめ「INDEX[:]」を用意しておくより確実に並列計算実施

PEsmpTOT個のスレッドが立ち上がり,並列に実行

各要素が計算されるスレッドを指定できる

Page 37: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

Matrix-Vector Multiply37

for(i=0; i<N; i++) {VAL = D[i] * W[P][i];for(j=indexL[i]; j<indexL[i+1]; j++) {

VAL += AL[j] * W[P][itemL[j]-1];}

for(j=indexU[i]; j<indexU[i+1]; j++) {VAL += AU[j] * W[P][itemU[j]-1];

}W[Q][i] = VAL;

}

Page 38: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

Matrix-Vector Multiply38

#pragma omp parallel for private(ip,i,VAL,j)for (ip=0; ip<PEsmpTOT; ip++){

for(i=SMPindexG[ip]; i<SMPindexG[ip+1]; i++){VAL = D[i] * W[P][i];for(j=indexL[i]; j<indexL[i+1]; j++) {

VAL += AL[j] * W[P][itemL[j]-1];}

for(j=indexU[i]; j<indexU[i+1]; j++) {VAL += AU[j] * W[P][itemU[j]-1];

}W[Q][i] = VAL;

}}

Page 39: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

Matrix-Vector Multiply: Other ApproachThis is rather better for GPU and (very) many-core

architectures: simpler structure of loops

39

#pragma omp parallel for private(i,VAL,j)for(i=0; i<N; i++){

VAL = D[i] * W[P][i];for(j=indexL[i]; j<indexL[i+1]; j++) {

VAL += AL[j] * W[P][itemL[j]-1];}

for(j=indexU[i]; j<indexU[i+1]; j++) {VAL += AU[j] * W[P][itemU[j]-1];

}W[Q][i] = VAL;

}

Page 40: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

omp parallel (do)40

• omp parallel-omp end parallelはそのたびにスレッドを生成,消滅させる:fork-join

• ループが連続するとこれがオーバーヘッドになることがある。

• omp parallel + omp do/omp for

#pragma omp parallel ...

#pragma omp for {

...#pragma omp for {

!$omp parallel ...

!$omp dodo i= 1, N

...!$omp do

do i= 1, N...!$omp end parallel 必須

Page 41: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

41

• OpenMP• Login to Reedbush -U (separate file) [1]• Parallel Version of the Code by OpenMP• STREAM• Data Dependency

Page 42: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

42

• OpenMP• Login to Reedbush-U• Parallel Version of the Code by OpenMP• STREAM• Data Dependency

Page 43: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

ここでの目標43

• solve_PCG(対角スケーリング,点ヤコビ前処理付きCG法)の並列化

• “solver_PCG.f/c” (solve_PCG)

• OpenMP指示行を入れるだけ(Index使わない)でやってみる

Page 44: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

前処理付共役勾配法Preconditioned Conjugate Gradient Method (PCG)

OMP-1 44

Compute r(0)= b-[A]x(0)

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)if i=1p(1)= z(0)

elseβi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endifq(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip

(i)

r(i)= r(i-1) - αiq(i)

check convergence |r|end

実際にやるべき計算は:

{ } [ ] { }rMz 1−=

[ ] [ ] [ ] [ ]AMAM ≈≈ −− ,11

対角スケーリング:簡単=弱い

[ ] [ ] [ ] [ ]DMDM == −− ,11

究極の前処理:本当の逆行列

[ ] [ ] [ ] [ ]AMAM == −− ,11

「近似逆行列」の計算が必要:

Page 45: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

対角スケーリング,点ヤコビ前処理

• 前処理行列として,もとの行列の対角成分のみを取り出した行列を前処理行列 [M] とする。– 対角スケーリング,点ヤコビ(point-Jacobi)前処理

OMP-1 45

[ ]

=

N

N

D

D

D

D

M

0...00

000

.........

000

00...0

1

2

1

• solve [M]z(i-1)= r(i-1)という場合に逆行列を簡単に求めることができる。

• 簡単な問題では収束する。

Page 46: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

for(i=0; i<N; i++) {W[DD][i]= 1.e0/D[i];

}

...

for(L=0; L<(*ITR); L++) {

/******************** {z} = [Minv]{r} ********************/

for(i=0; i<N; i++) {W[Z][i] = W[R][i]*W[DD][i];

}

/***************** RHO = {r}{z} *****************/

RHO = 0.0;for(i=0; i<N; i++) {

RHO += W[R][i] * W[Z][i];}

solve_PCG (1/3)46

Compute r(0)= b-[A]x(0)

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)if i=1p(1)= z(0)

elseβi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endifq(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip

(i)

r(i)= r(i-1) - αiq(i)

check convergence |r|end

Page 47: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

/********************************* {p} = {z} if ITER=0 ** BETA = RHO / RHO1 otherwise *********************************/

if(L == 0) {for(i=0; i<N; i++) {

W[P][i] = W[Z][i];}} else {BETA = RHO / RHO1;for(i=0; i<N; i++) {

W[P][i] = W[Z][i] + BETA * W[P][i];}

}

/***************** {q} = [A]{p} *****************/

for(i=0; i<N; i++) {VAL = D[i] * W[P][i];for(j=indexL[i]; j<indexL[i+1]; j++) {

VAL += AL[j] * W[P][itemL[j]-1];}for(j=indexU[i]; j<indexU[i+1]; j++) {

VAL += AU[j] * W[P][itemU[j]-1];}W[Q][i] = VAL;

}

solve_PCG (2/3)47

Compute r(0)= b-[A]x(0)

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)if i=1p(1)= z(0)

elseβi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endifq(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip

(i)

r(i)= r(i-1) - αiq(i)

check convergence |r|end

Page 48: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

/************************* ALPHA = RHO / {p}{q} *************************/C1 = 0.0;for(i=0; i<N; i++) {

C1 += W[P][i] * W[Q][i];}ALPHA = RHO / C1;

/**************************** {x} = {x} + ALPHA * {p} ** {r} = {r} - ALPHA * {q} ****************************/for(i=0; i<N; i++) {

X[i] += ALPHA * W[P][i];W[R][i] -= ALPHA * W[Q][i];

}

DNRM2 = 0.0;for(i=0; i<N; i++) {

DNRM2 += W[R][i]*W[R][i];}

ERR = sqrt(DNRM2/BNRM2);if((L+1)%100 ==1) {

fprintf(stderr, "%5d%16.6e¥n", L+1, ERR);}if(ERR < EPS) {

*IER = 0; goto N900;} else {RHO1 = RHO;

}}*IER = 1;

solve_PCG (3/3)48

r= b-[A]xDNRM2=|r|2

BNRM2=|b|2

ERR= |r|/|b|

Compute r(0)= b-[A]x(0)

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)if i=1p(1)= z(0)

elseβi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endifq(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip

(i)

r(i)= r(i-1) - αiq(i)

check convergence |r|end

Page 49: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

solve_PCG (1/5)parallel computing by OpenMP

49

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <math.h>#include <omp.h>

#include "solver_PCG.h"

extern intsolve_PCG (int N, int NL, int NU, int *indexL, int *itemL, int *indexU, int *itemU,

double *D, double *B, double *X, double *AL, double *AU,double EPS, int *ITR, int *IER, int *N2)

{double **W;double VAL, BNRM2, WVAL, SW, RHO, BETA, RHO1, C1, DNRM2, ALPHA, ERR;double Stime, Etime;int i, j, ic, ip, L, ip1, N3;int R = 0;int Z = 1;int Q = 1;int P = 2;int DD = 3;

Page 50: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

solve_PCG (2/5)50

#pragma omp parallel for private (i)for(i=0; i<N; i++) {

X[i] = 0.0;W[1][i] = 0.0;W[2][i] = 0.0;W[3][i] = 0.0;

}

#pragma omp parallel for private (i,VAL,j)for(i=0; i<N; i++) {

VAL = D[i] * X[i];for(j=indexL[i]; j<indexL[i+1]; j++) {

VAL += AL[j] * X[itemL[j]-1];}for(j=indexU[i]; j<indexU[i+1]; j++) {

VAL += AU[j] * X[itemU[j]-1];}W[R][i] = B[i] - VAL;

}

BNRM2 = 0.0;#pragma omp parallel for private (i) reduction (+:BNRM2)

for(i=0; i<N; i++) {BNRM2 += B[i]*B[i];

}

#pragma omp parallel for private (i)for(i=0; i<N; i++) {

W[DD][i]= 1.e0/D[i];}

Compute r(0)= b-[A]x(0)

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)if i=1p(1)= z(0)

elseβi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endifq(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip

(i)

r(i)= r(i-1) - αiq(i)

check convergence |r|end

Page 51: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

solve_PCG (3/5)51

*ITR = N;

Stime = omp_get_wtime();

for(L=0; L<(*ITR); L++) {

#pragma omp parallel for private (i)for(i=0; i<N; i++) {

W[Z][i] = W[R][i]*W[DD][i];}

RHO = 0.0;#pragma omp parallel for private (i) reduction(+:RHO)

for(i=0; i<N; i++) {RHO += W[R][i] * W[Z][i];

}

if(L == 0) {#pragma omp parallel for private (i)

for(i=0; i<N; i++) {W[P][i] = W[Z][i];}

} else {BETA = RHO / RHO1;

#pragma omp parallel for private (i)for(i=0; i<N; i++) {

W[P][i] = W[Z][i] + BETA * W[P][i];}

}

Compute r(0)= b-[A]x(0)

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)if i=1p(1)= z(0)

elseβi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endifq(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip

(i)

r(i)= r(i-1) - αiq(i)

check convergence |r|end

Page 52: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

solve_PCG (4/5)52

#pragma omp parallel for private (i,VAL,j)for(i=0; i<N; i++) {

VAL = D[i] * W[P][i];for(j=indexL[i]; j<indexL[i+1]; j++) {

VAL += AL[j] * W[P][itemL[j]-1];}for(j=indexU[i]; j<indexU[i+1]; j++) {

VAL += AU[j] * W[P][itemU[j]-1];}W[Q][i] = VAL;

}

C1 = 0.0;#pragma omp parallel for private (i) reduction(+:C1)

for(i=0; i<N; i++) {C1 += W[P][i] * W[Q][i];

}ALPHA = RHO / C1;

#pragma omp parallel for private (i)for(i=0; i<N; i++) {

X[i] += ALPHA * W[P][i];W[R][i] -= ALPHA * W[Q][i];

}

DNRM2 = 0.0;#pragma omp parallel for private (i) reduction(+:DNRM2)

for(i=0; i<N; i++) {DNRM2 += W[R][i]*W[R][i];

}

ERR = sqrt(DNRM2/BNRM2);...

Compute r(0)= b-[A]x(0)

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)if i=1p(1)= z(0)

elseβi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endifq(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip

(i)

r(i)= r(i-1) - αiq(i)

check convergence |r|end

Page 53: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

solve_PCG (5/5)53

Stime = omp_get_wtime();

for(L=0; L<(*ITR); L++) {...

if(ERR < EPS) {*IER = 0;goto N900;

} else {RHO1 = RHO;

}}

*IER = 1;N900:

Etime = omp_get_wtime();

fprintf(stderr, "%5d%16.6e¥n", L+1, ERR);fprintf(stderr, "%16.6e sec. (solver)¥n", Etime - Stime);

*ITR = L;free(W);return 0;

}

Elapsed Time= Etime - Stime

Page 54: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

ファイルコピー:Reedbush-UOMP-1 54

>$ cdw

>$ cp /lustre/gt00/z30088/omp/omp-c.tar .>$ cp /lustre/gt00/z30088/omp/omp-f.tar .

>$ tar xvf omp-c.tar>$ tar xvf omp-f.tar

>$ cd multicore

以下のディレクトリが出来ていることを確認omp stream

>$ cd omp/src20>$ make>$ cd ../run>$ qsub go.sh

Page 55: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

<$O-omp >/src20/Makefileparallel computing by OpenMP

55

CC = iccOPTFLAGS= -O3 -qopenmp -ipo -xCORE-AVX2 -alignTARGET = ../run/sol20

.SUFFIXES:

.SUFFIXES: .o .c

.c.o:$(CC) -c $(CFLAGS) $(OPTFLAGS) $< -o $@

OBJS = ¥input.o ¥pointer_init.o ¥ (…)

HEADERS = ¥struct.h ¥struct_ext.h ¥ (…)

all: $(TARGET)

$(TARGET): $(OBJS)$(CC) $(CFLAGS) $(OPTFLAGS) -o $@ $(OBJS) $(LDFLAGS)

$(OBJS): $(HEADERS)

clean:rm -f *.o $(TARGET) *.log *~ *.lst

Page 56: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

56

ジョブ実行

• 実行方法– 基本的にバッチジョブのみ– インタラクティヴの実行は「基本的に」できません

• 実行手順– ジョブスクリプトを書きます– ジョブを投入します– ジョブの状態を確認します– 結果を確認します

• その他– 実行時には1ノード(16コア)が占有されます– 他のユーザーのジョブに使われることはありません

Page 57: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

57

Reedbush -Uノードのブロック図1ノード:2CPU(ソケット)

18コア

基本的に1ソケット(1CPU)のみ使う

18コア

Socket #0 Socket #1

Page 58: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

58

ジョブスクリプト(1/2)go1.sh

#!/bin/sh#PBS -q u-tutorial 実行キュー名#PBS -N test ジョブ名称(省略可)#PBS -l select=1:ncpus=18 ノード数,コア数(1-18)#PBS -Wgroup_list=gt00 グループ名(財布)#PBS -l walltime=00:05:00 実行時間#PBS -e test.err エラー出力ファイル#PBS -o test.lst 標準出力ファイルcd $PBS_O_WORKDIR 実行ディレクトリへ移動. /etc/profile.d/modules.sh 必須

export OMP_NUM_THREADS=18 スレッド数(=ncpus, 1-18)export KMP_AFFINITY=granularity=fine,compactnumactl ./sol20 プログラム実行

「numactl」は必ず付けておく

C

export KMP_AFFINITY=granularity=fine,compact各スレッドがSocket#0の0番から始まる各コアに順番に割り当てられる

• /luster/gt00/t00XXX/multicore/omp/run/go1.sh

• スケジューラへの指令+シェルスクリプト

Page 59: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

59

ジョブスクリプト(1/2)go2.sh

#!/bin/sh#PBS -q u-tutorial 実行キュー名#PBS -N test ジョブ名称(省略可)#PBS -l select=1:ncpus=18 ノード数,コア数(1-18)#PBS -Wgroup_list=gt00 グループ名(財布)#PBS -l walltime=00:05:00 実行時間#PBS -e test.err エラー出力ファイル#PBS -o test.lst 標準出力ファイルcd $PBS_O_WORKDIR 実行ディレクトリへ移動. /etc/profile.d/modules.sh 必須

export OMP_NUM_THREADS=18 スレッド数(=ncpus, 1-18)

numactl ./sol20 プログラム実行「numactl」は必ず付けておく

C

各スレッドがSocket#0/#1の各コアにランダムに割り当てられる

• /luster/gt00/t00XXX/multicore/omp/run/go2.sh

• スケジューラへの指令+シェルスクリプト

Page 60: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

60

ジョブ投入

INPUT.DAT

128 128 128 NX NY NZ1.00e-0 1.00e-00 1.00e-00 DX/DY/DZ1.0e-08 EPSICCG

>$ cdw>$ cd multicore/omp/run>$ qsub go1.sh

>$ cat test.lst

Page 61: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

MPI Programming

61

利用可能なキュー

• 以下の2種類のキューを利用可能• 最大8ノードを使える

– u-lecture• 8ノード(288コア),10分,アカウント有効期間中利用可能• 全教育ユーザーで共有

– u-tutorial• 8ノード(288コア),10分,講義・演習実施時間帯• lectureよりは多くのジョブを投入可能(混み具合による)

6161

Page 62: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

バッチ処理とは

� スパコン環境では、通常は、インタラクティブ実行(コマンドラインで実行すること)はできません。

� ジョブはバッチ処理で実行します。

62

ユーザスパコン

バッチ処理システムがジョブを取り出す

実行

バッチキュー

ジョブの依頼

Page 63: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

バッチ処理を用いたジョブの実行方法

� Reedbushシステムにおいてバッチ処理は、Altuir社のバッチシステム PBS Professionulで管理されています。

� ジョブの投入:qsub <ジョブスクリプトファイル名>

63

#!/bin/bash#PBS -q u-lecture#PBS -Wgroup_list=gt00#PBS -l select=8:mpiprocs=36#PBS -l walltime=00:01:00cd $PBS_O_WORKDIR. /etc/profile.d/modules.shmpirun ./hello

ジョブスクリプトファイルの例

キュー名:u-lecture

利用グループ名:gt00

Page 64: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

バッチ処理システムの使い方

� 主要コマンド(Reedbushの場合)

� ジョブの投入:qsub <ジョブスクリプトファイル名>

� 自分が投入したジョブの状況確認: rbstut

� 投入ジョブの削除: qdel <ジョブID>

� バッチキューの状態を見る: rbstut --rsc

� バッチキューの詳細構成を見る: rbstut –rsc -x

� 投げられているジョブ数を見る: rbstut -b

� 過去の投入履歴を見る: rbstut –H

� 同時に投入できる数/実行できる数を見る: rbstut --limit

64

Page 65: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

rbstat --rsc の実行画面例

65

$ rbstat --rscQUEUE STATUS NODEu-debug [ENABLE ,START] 54u-short [ENABLE ,START] 16u-regular [ENABLE ,START]

|---- u-small [ENABLE ,START] 288|---- u-medium [ENABLE ,START] 288|---- u-large [ENABLE ,START] 288|---- u-x-large [ENABLE ,START] 288

u-interactive [ENABLE ,START]|---- u-interactive_1 [ENABLE ,START] 54|---- u-interactive_4 [ENABLE ,START] 54

u-lecture [ENABLE ,START] 54u-lecture8 [DISABLE,START] 54u-tutorial [ENABLE ,START] 54

使えるキュー名(リソースグループ)

現在利用可能か

利用可能ノード数

Page 66: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

rbstat --rsc -x の実行画面例

66

$ rbstat --rsc -xQUEUE STATUS MIN_NODE MAX_NODE MAX_ELAPSE REMAIN_ELAPSE MEM(GB)/NODE PROJECTu-debug [ENABLE ,START] 1 24 00:30:00 00:30:00 244GB pz0105,gcXXu-short [ENABLE ,START] 1 8 02:00:00 02:00:00 244GB pz0105,gcXXu-regular [ENABLE ,START]|---- u-small [ENABLE ,START] 4 16 12:00:00 12:00:00 244GB gcXX,pz0105|---- u-medium [ENABLE ,START] 17 32 12:00:00 12:00:00 244GB gcXX|---- u-large [ENABLE ,START] 33 64 12:00:00 12:00:00 244GB gcXX|---- u-x-large [ENABLE ,START] 65 128 06:00:00 06:00:00 244GB gcXX

u-interactive [ENABLE ,START]|---- u-interactive_1 [ENABLE ,START] 1 1 00:15:00 00:15:00 244GB pz0105,gcXX|---- u-interactive_4 [ENABLE ,START] 2 4 00:05:00 00:05:00 244GB pz0105,gcXX

u-lecture [ENABLE ,START] 1 8 00:10:00 00:10:00 244GB gt00,gtYYu-lecture8 [DISABLE,START] 1 8 00:10:00 00:10:00 244GB gtYYu-tutorial [ENABLE ,START] 1 8 00:10:00 00:10:00 244GB gt00

使えるキュー名(リソースグループ)

現在利用可能か

ノードの実行情報

課金情報(財布)実習では1つのみ

Page 67: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

rbstat --rsc -b の実行画面例

67

$ rbstat --rsc –bQUEUE STATUS TOTAL RUNNING QUEUED HOLD BEGUN WAIT EXIT TRANSIT NODEu-debug [ENABLE ,START] 1 1 0 0 0 0 0 0 54u-short [ENABLE ,START] 9 3 5 1 0 0 0 0 16u-regular [ENABLE ,START]|---- u-small [ENABLE ,START] 38 10 6 22 0 0 0 0 288|---- u-medium [ENABLE ,START] 2 2 0 0 0 0 0 0 288|---- u-large [ENABLE ,START] 4 2 0 2 0 0 0 0 288|---- u-x-large [ENABLE ,START] 1 0 1 0 0 0 0 0 288

u-interactive [ENABLE ,START]|---- u-interactive_1 [ENABLE ,START] 0 0 0 0 0 0 0 0 54|---- u-interactive_4 [ENABLE ,START] 0 0 0 0 0 0 0 0 54

u-lecture [ENABLE ,START] 0 0 0 0 0 0 0 0 54u-lecture8 [DISABLE,START] 0 0 0 0 0 0 0 0 54u-tutorial [ENABLE ,START] 0 0 0 0 0 0 0 0 54

使えるキュー名(リソースグループ)

現在

使えるか

ジョブの総数

実行しているジョブの数

待たされているジョブの数

ノードの利用可能数

Page 68: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

68

PCG計算時間: Etime -StimeNX=NY=NZ=100,go1.sh

実行時間:安定しない:5回くらい測定して一番速い時間を採用する:numactlをはずすと安定するが遅い

Thread #

sec Speed-up

1 10.219 1.000

2 5.277 1.936

4 2.824 3.618

8 1.842 5.547

12 1.616 6.322

16 1.542 6.628

18 1.530 6.679

0.0

20.0

40.0

60.0

80.0

100.0

120.0

1 2 4 8 12 16 18

Par

alle

l Per

form

ance

(%)

Thread #

IFLAG=0, compact

Granularity粒度

Problem Size/ThreadLarge 大

Small小

Page 69: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

69

go1.shOnly cores on a single socket used

#!/bin/sh

#PBS -q u-tutorial#PBS -N test01#PBS -l select=1:ncpus=18 1,2,4,8,12,16,18#PBS -Wgroup_list=gt00#PBS -l walltime=00:10:00#PBS -e test1.err#PBS -o test1.lst

cd $PBS_O_WORKDIR. /etc/profile.d/modules.shexport KMP_AFFINITY=granularity=fine,compact

export OMP_NUM_THREADS=18 1,2,4,8,12,16,18numactl ./sol20

Page 70: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

70

go2.shcores are randomly selected from 2 sockets

#!/bin/sh

#PBS -q u-tutorial#PBS -N test01#PBS -l select=1:ncpus=18 1,2,4,8,12,16,18#PBS -Wgroup_list=gt00#PBS -l walltime=00:10:00#PBS -e test2.err#PBS -o test2.lst

cd $PBS_O_WORKDIR. /etc/profile.d/modules.shexport KMP_AFFINITY=granularity=fine,compact

export OMP_NUM_THREADS=18 1,2,4,8,12,16,18numactl ./sol20

Page 71: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

0.0

20.0

40.0

60.0

80.0

100.0

120.0

1 2 4 8 12 16 18

Par

alle

l Per

form

ance

(%)

Thread #

IFLAG=0, compact

IFLAG=0

71

Results: Parallel PerformanceNX=NY=NZ=100, IFLAG=0

Measurement: 5 times, best casego2.sh is better if Thread # is more than 8

based on “IFLAG=0, compact” with 1 thread

■ go1.sh■ go2.sh

Page 72: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

72

Results: Fluctuation RateNX=NY=NZ=100, IFLAG=0

Measurement: 5 times, (Worst-Best)/BestCore Allocation of go2.sh is random

0.0

20.0

40.0

60.0

80.0

100.0

120.0

140.0

1 2 4 8 12 16 18 32 36

Flu

ctua

tion

(%)

Thread #

IFLAG=0, compact

IFLAG=0■ go1.sh■ go2.sh

Page 73: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

73

Reedbush -U1-node: 2-CPU’s/sockets

• Each Node of Reedbush-U– 2 Sockets (CPU’s) of Intel Broadwell-EP– Each socket has 18 cores

• Each core of a socket can access to the memory on the other socket : NUMA (Non-Uniform Memory Access)

• Utilization of the local memory is more efficient• So far, only a single socket has been used

– Let’s utilize both sockets

Socket #0 Socket #1

18 cores 18 cores

Page 74: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

74

Exercises

• Effect of problem size (NX, NY, NZ)• Effect of Thread # (OMP_NUM_THREADS: 1-18)

Page 75: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

• OpenMP• Login to Reedbush-U• Parallel Version of the Code by OpenMP• STREAM• Data Dependency

75

Page 76: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

何故18倍にならないか?

• 18スレッドがメモリにアクセスすると,1スレッドの場合と比較して,スレッド当り(コア当り)メモリ性能は低下

– 飽和

• 疎行列はmemory-boundなためその傾向がより顕著– 疎行列計算の高速化:研究途上の課題

OMP-3 76

Page 77: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

疎行列・密行列

77

do i= 1, NY(i)= D(i)*X(i)do k= index(i-1)+1, index(i)

kk= item(k)Y(i)= Y(i) + AMAT(k)*X(kk)

enddoenddo

do j= 1, NY(j)= 0.d0do i= 1, N

Y(j)= Y(j) + A(i,j)*X(i)enddo

enddo

• “X” in RHS– 密行列:連続アクセス,キャッシュ有効利用– 疎行列:連続性は保証されず,キャッシュを有効に活用できず

• より「memory-bound 」

Page 78: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

GeoFEM BenchmarkICCG法の性能(固体力学向け)

OMP-3 78

SR11K/J2 SR16K/M1 T2K FX10 京

Core #/Node 16 32 16 16 8

Peak Performance(GFLOPS)

147.2 980.5 147.2 236.5 128.0

STREAM Triad (GB/s) 101.0 264.2 20.0 64.7 43.3

B/F 0.686 0.269 0.136 0.274 0.338

GeoFEM (GFLOPS) 19.0 72.7 4.69 16.0 11.0

% to Peak 12.9 7.41 3.18 6.77 8.59

LLC/core (MB) 18.0 4.00 2.00 0.75 0.75

疎行列ソルバー:Memory-Bound

Page 79: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

STREAM benchmarkhttp://www.cs.virginia.edu/stream/

• メモリバンド幅を測定するベンチマーク– Copy: c(i)= a(i)– Scale: c(i)= s*b(i)– Add: c(i)= a(i) + b(i)– Triad: c(i)= a(i) + s*b(i)

79

----------------------------------------------Double precision appears to have 16 digits of accuracyAssuming 8 bytes per DOUBLE PRECISION word

----------------------------------------------Number of processors = 16Array size = 2000000Offset = 0The total memory requirement is 732.4 MB (

45.8MB/task)You are running each test 10 times--The *best* time for each test is used*EXCLUDING* the first and last iterations--------------------------------------------------------------------------------------------------------

Function Rate (MB/s) Avg time Min time Max timeCopy: 18334.1898 0.0280 0.0279 0.0280Scale: 18035.1690 0.0284 0.0284 0.0285Add: 18649.4455 0.0412 0.0412 0.0413Triad: 19603.8455 0.0394 0.0392 0.0398

Page 80: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

マイクロプロセッサの動向CPU性能,メモリバンド幅のギャップ

80

http://www.cs.virginia.edu/stream/

Page 81: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

実行:MPIバージョンOMP-1 81

>$ cdw>$ cd multicore/stream>$ mpiifort -O3 -xCORE-AVX2 -align array32byte stream.f –o stream

>$ qsub XXX.sh

Socket #00th-17th cores

Socket #118th-35th cores

18 cores 18 cores

Page 82: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

s01.sh: Use 1 core (0 th)82

#!/bin/sh

#PBS -q u-tutorial#PBS -N stream#PBS -l select=1:mpiprocs=1 MPI Process #(1-36)#PBS -Wgroup_list=gt00#PBS -l walltime=00:05:00#PBS -e err#PBS -o t01.lst

cd $PBS_O_WORKDIR. /etc/profile.d/modules.sh

export I_MPI_PIN_PROCESSOR_LIST=0 use 0th corempirun ./impimap.sh ./stream

Page 83: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

s16.sh: Use 16 cores (0 -15th)83

#!/bin/sh

#PBS -q u-tutorial#PBS -N stream#PBS -l select=1:mpiprocs=16 MPI Process #(1-36)#PBS -Wgroup_list=gt00#PBS -l walltime=00:05:00#PBS -e err#PBS -o t16.lst

cd $PBS_O_WORKDIR. /etc/profile.d/modules.sh

export I_MPI_PIN_PROCESSOR_LIST=0-15 use 0-15th corempirun ./impimap.sh ./stream

Page 84: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

s32.sh: Use 32 cores (16 ea )84

#!/bin/sh

#PBS -q u-tutorial#PBS -N stream#PBS -l select=1:mpiprocs=32 MPI Process #(1-36)#PBS -Wgroup_list=gt00#PBS -l walltime=00:05:00#PBS -e err#PBS -o t32.lst

cd $PBS_O_WORKDIR. /etc/profile.d/modules.sh

export I_MPI_PIN_PROCESSOR_LIST=0-15,18-33mpirun ./impimap.sh ./stream

Page 85: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

s36.sh: Use 36 cores (ALL)85

#!/bin/sh

#PBS -q u-tutorial#PBS -N stream#PBS -l select=1:mpiprocs=36 MPI Process #(1-36)#PBS -Wgroup_list=gt00#PBS -l walltime=00:05:00#PBS -e err#PBS -o t36.lst

cd $PBS_O_WORKDIR. /etc/profile.d/modules.sh

export I_MPI_PIN_PROCESSOR_LIST=0-35mpirun ./impimap.sh ./stream

Page 86: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

Results of Triad on a Single Node of Reedbush -U, Peak is 153.6 GB/sec.

86

Thread # GB/sec Speed-up

1 16.11 1.00

2 30.95 1.92

4 54.72 3.40

8 64.59 4.01

16 65.18 4.04

18 64.97 4.03

32 130.0 8.07

36 128.2 7.96

Page 87: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

Exercises

• Running the code• Try various number of threads (1-36)

– export I_MPI_PIN_PROCESSOR_LIST=0-7– export I_MPI_PIN_PROCESSOR_LIST=0-3,18-21

• OpenMP-version and Single PE version are available– Fortran,C– http://www.cs.virginia.edu/stream/

87

Page 88: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

88

• OpenMP• Login to Reedbush-U• Parallel Version of the Code by OpenMP• STREAM• Data Dependency

Page 89: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OMP-1 89

ICCG法の並列化

• 内積:OK• DAXPY:OK• 行列ベクトル積:OK• 前処理

Page 90: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

90

前処理はどうするか?対角スケーリングなら簡単:でも遅い

for (i=0; i<N; i++){W[Z][i]= W[R][i]*W[DD][i];

}

#omp pragma parallel for private(i)for (i=0; i<N; i++){W[Z][i]= W[R][i]*W[DD][i];

}

64*64*64METHOD= 11 6.543963E+00101 1.748392E-05146 9.731945E-09

real 0m14.662s

METHOD= 31 6.299987E+00101 1.298539E+00201 2.725948E-02301 3.664216E-05401 2.146428E-08413 9.621688E-09

real 0m19.660s

#omp pragma parallel for private(i,ip)for (ip=0; ip<PEsmpTOT; ip++){for (i=INDEX[ip]; i<INDEX[ip+1]; i++)W[Z][i]= W[R][i]*W[DD][i];

}}

Page 91: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

91

前処理はどうするか?

for(i=0; i<N; i++) {VAL = D[i];for(j=indexL[i]; j<indexL[i+1]; j++) {

VAL -= AL[j]*AL[j]*W[DD][itemL[j]-1];}W[DD][i] = 1.0 / VAL;

}

for(i=0; i<N; i++) {

WVAL = W[Z][i];

for(j=indexL[i]; j<indexL[i+1]; j++) {

WVAL -= AL[j] * W[Z][itemL[j]-1];

}

W[Z][i] = WVAL * W[DD][i];

}

不完全修正コレスキー分解

前進代入

Page 92: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

92

データ依存性:メモリの読み込みと書き出しが同時に発生し,並列化困難

for(i=0; i<N; i++) {VAL = D[i];for(j=indexL[i]; j<indexL[i+1]; j++) {

VAL -= AL[j]*AL[j]*W[DD][itemL[j]-1];}W[DD][i]= 1.0 / VAL;

}

for(i=0; i<N; i++) {

WVAL = W[Z][i];

for(j=indexL[i]; j<indexL[i+1]; j++) {

WVAL -= AL[j] * W[Z][itemL[j]-1];

}

W[Z][i]= WVAL * W[DD][i];

}

不完全修正コレスキー分解

前進代入

Page 93: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

93

前進代入4スレッドによる並列化を試みる

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15for(i=0; i<N; i++) {VAL = D[i];for(j=indexL[i]; j<indexL[i+1]; j++) {VAL -= AL[j]*AL[j]*W[DD][itemL[j]-1];

}W[DD][i]= 1.0 / VAL;

}

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

“icel” starts at 0

“itemL” starts at 1

Page 94: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

94

前進代入4スレッドによる並列化を試みる

INDEX[0]= 0INDEX[1]= 4INDEX[2]= 8INDEX[3]=12INDEX[4]=16

do i=1,4…enddo

do i=5,8…enddo

do i=9,12…enddo

do i=13,16…enddo

do i=1,4…enddo

do i=5,8…enddo

do i=9,12…enddo

do i=13,16…enddo

#pragma omp parallel private (ip,i,k,VAL)for(ip=1; ip<4; ip++) {for(i=INDEX[ip]; i<INDEX[ip+1];i++){VAL = D[i];for(j=indexL[i]; j<indexL[i+1]; j++) {VAL -= AL[j]*AL[j]*W[DD][itemL[j]-1];

}W[DD][i]= 1.0 / VAL;

}}

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15

i= 0~3 i= 4~7 i= 8~11 i= 12~15

このような4スレッドが同時に実施される・・・

Page 95: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

95

データ依存性:メモリへの書き出し,読み込みが同時に発生

1 1

5 5

9 9

13

⇔1 1

5

1

5 5

9

5

9 9

13

9

13

⇔:Data Dependency

#0 thread

#1 thread

#2 thread

#3 thread

INDEX[0]= 0INDEX[1]= 4INDEX[2]= 8INDEX[3]=12INDEX[4]=16

#pragma omp parallel private (ip,i,k,VAL)for(ip=1; ip<4; ip++) {for(i=INDEX[ip]; i<INDEX[ip+1];i++){VAL = D[i];for(j=indexL[i]; j<indexL[i+1]; j++) {VAL -= AL[j]*AL[j]*W[DD][itemL[j]-1];

}W[DD][i]= 1.0 / VAL;

}}

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15

0 0

4 4

8 8

12

Page 96: OpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/omp-c-02.pdfOpenMP/OpenACCによるボラタケ゠ヹ ミドァケ゠並列フルギョポヱギ入門

OMP-1 96

ICCG法の並列化

• 内積:OK• DAXPY:OK• 行列ベクトル積:OK• 前処理:なんとかしなければならない

– 単純にOpenMPなどの指示行(directive)を挿入しただけでは「並列化」できない。