スライド 0

32 

Loading.... (view fulltext now)

Loading....

Loading....

Loading....

Loading....

全文

(1)

OpenMPを用いた

Fortranコードの並列化基礎セミナー

株式会社

計算力学研究センター

技術1部 三又秀行

mimata@rccm.co.jp

2012/7/11

(2)

高速化・並列化事例

PARDISOについて(XLsoft 黒澤様)

並列化

並列化について

並列化作業の流れ

並列化の手段

OpenMPデモ

OpenMPで並列計算する

円周率

p

の計算(

private、reduction)

マンデルブロ集合(

schedule)

OpenMPまとめ

性能が出ない場合

目次

(3)

高速化・並列化事例

PARDISOについて(XLsoft 黒澤様)

並列化

並列化について

並列化作業の流れ

並列化の手段

OpenMPデモ

OpenMPで並列計算する

円周率

p

の計算(

private、reduction)

マンデルブロ集合(

schedule)

OpenMPまとめ

性能が出ない場合

目次

(4)

KIVA + CHEMKIN でのディーゼル燃焼計算

早稲田大学

大聖・草鹿研究室との共同研究

背景

高速化・並列化事例① 流体+燃焼解析

熱効率の改善(省エネルギー)

排気ガスの低減(環境問題)

デバイスの複雑化

様々な燃焼形態

開発速度の向上

詳細な燃焼計算

計算コードの高速化

(自動車技術会

2010秋 20105689)

(5)

時間ステップごとに各セルが化学種の計算をする

計算の概略

KIVA(流体計算)

CHEMKIN(化学計算)

ODEソルバー

流体の時間ステップ後の

化学種の濃度を計算

化学種の計算をするセル

セル

詳細な素反応計算をしたいが

時間がかかる

(6)

計算時間の

99% は化学反応計算

オリジナルの計算時間

chem.f

99.56 %

ysolve.f

0.234%

ccflux.f 0.076%

psolve.f 0.030%

tsolve.f 0.015%

newcycle.f 0.015%

kesolve.f 0.010%

その他

0.057%

今回のケースでは計算に

124.8

時間

並列化

デスクトップを想定し

OpenMPで

(7)

0 4 8 12 16 0 4 8 12 16

Speed

-up

rat

io

OpenMPで高速化

Chemical

reaction cal.

Total

Intel

®

Xeon

®

X7560 2.26GHz (8 core)×2

使用

並列化効率も良く、

16 coreで15倍

CPUのコア数は増えつつある

実用的な時間で素反応を考慮した計

算が行える

5日の計算が

8時間で

124.3

62.2

31.1

15.6

7.8

124.8

62.7

31.6

16.1

8.3

0.0

24.0

48.0

72.0

96.0

120.0

144.0

1

2

4

8

16

Ca

lcu

la

tion

time [h]

threads

15倍

15.91

15.06

7.98

7.77

3.95

2.00

3.99

1.99

Chemical

reaction cal.

Total

(8)
(9)

画像処理(

Wavelet 変換)

3000×約2000ピクセルの写真

各ピクセル毎に周りの

8×8の領域とGabor関数をかけて

Wavelet係数を計算

Gabor関数は、空間スケール6×角度6(×2) 通り用い、

Wavelet係数を足していく

計算時間

1枚

1分半程度かかる

膨大な数の写真を処理

高速化・並列化事例② 画像処理

for(スケールのループ) { for(角度のループ) { 8×8のGabor関数を計算 for(x方向のループ)約3000ループ { for(y方向のループ)約2000ループ { 8×8回のwavelet係数の計算 } } } }

速くしたい

(10)

計算内容が

GPUでの計算に非常に向いていたため、

GPUを選択

ピクセルのループを

GPUのコアがそれそれ分担

GPUはコアが数百個ある)

GPUで高速化

for(スケールのループ) { for(角度のループ) { 8×8のGabor関数を計算 for(x方向のループ) { for(y方向のループ) { 8×8回のwavelet係数の計算 } } } } for(スケールのループ) { for(角度のループ) { 8×8のGabor関数を計算 各スレッドが8×8回のwavelet係数の計算 } }

CPU

GPU

CPU(Intel Core2 Quad 3.0GHz): 91.5 s

GPU(NVIDIA GTX275): 0.53 s

170倍

(11)

行列ソルバーとして各分野で利用

計算の中身はベクトルの演算と行列×ベクトル

高速化・並列化事例③ 共役勾配法

n n n n n n n n n n n n n n n n n n n n n n n

p

r

p

r

r

r

r

Ap

r

r

p

x

x

Ap

p

r

r

a

b

r

n

Ax

b

r

p

x

      1 1 1 1 1 1 0 0 0 0

)

,

(

)

,

(

)

,

(

)

,

(

do

until

,

1

,

0

for

guess

initial

an

Choose

行列×ベクトル

内積

内積

ベクトル定数倍、加算

ベクトル定数倍、加算

(12)

MPIでの並列化事例

流体解析

CG法(非構造格子)

領域分割し、行列構築部など全体を並列化

8CPUで

6~7倍

GPUでの並列化事例

流体解析

GPBiCG(非構造格子)

ソルバー部分の並列化

GTX285でソルバー部分

13倍

2時間21分 → 11分)

並列化

領域分割のイメージ

(13)

疎行列連立一次方程式の直接法ソルバー

Intel

®

MKLに付いてくる

ソルバー部分を入れ替えるだけで高速化

(特に代々受け継いできた古いコードなど)

SMP並列に対応

事例:構造解析 千葉大学

野口・柏崎研究室 様

元のプログラムはスカイライン法を使用

大規模計算、パラメータ解析で時間がかかる

PARDISOに変更することで、ソルバー部分で 6.5 倍

、全体

5.3 倍

の高速化

高速化・並列化事例④

PARDISOの利用

その他、ご紹介できる事例はホームページをご覧ください

http://www.rccm.co.jp/development/parallel/example.html

(14)

高速化・並列化事例

PARDISOについて(XLsoft 黒澤様)

並列化

並列化について

並列化作業の流れ

並列化の手段

OpenMPデモ

OpenMPで並列計算する

円周率

p

の計算(

private、reduction)

マンデルブロ集合(

schedule)

OpenMPまとめ

性能が出ない場合

目次

(15)

高速化・並列化事例

PARDISOについて(XLsoft 黒澤様)

並列化

並列化について

並列化作業の流れ

並列化の手段

OpenMPデモ

OpenMPで並列計算する

円周率

p

の計算(

private、reduction)

マンデルブロ集合(

schedule)

OpenMPまとめ

性能が出ない場合

目次

(16)

作業の分担

目的: 高速化、大規模化

並列化とは?

高速化

大規模化

一人では時間が

かかる

一人では

持てない

(17)

荷造り・積み荷は人数分速くなる(並列できる)

トラックでの移動時間は変わらない(並列できない)

並列できる処理、できない処理

荷造り・積み荷

移動

移動

移動

荷造り・積み荷

移動

荷物は

分担できる

移動距離は

分担できない

(18)

高速化・並列化事例

PARDISOについて(XLsoft 黒澤様)

並列化

並列化について

並列化作業の流れ

並列化の手段

OpenMPデモ

OpenMPで並列計算する

円周率

p

の計算(

private、reduction)

マンデルブロ集合(

schedule)

OpenMPまとめ

性能が出ない場合

目次

(19)

並列化作業の流れ

時間計測

ボトルネック特定

(シリアルコードの最適化)

並列可能か判断

並列化

(20)

gprof、Intel

®

Vtune

TM

Amplifier XEなどプロファイラを使う

関数で計測する

etime:秒が返ってくる

clockx:マイクロ秒が返ってくる(Windows)

cpu_time:各コアの合計を返すので注意

omp_get_wtime :OpenMPの組み込み関数

時間計測

sub_a 前の時間計測

計測したい部分を

clockx で挟む

sub_a 後の時間計測

前後の時間差をとって秒単位に

サブルーチン

sub_a での経過時間を

知りたいとき

program sample

call clockx(t1)

call sub_a(x,y,z)

call clockx(t2)

time = (t2-t1) * 1.d-6

(21)

時間計測したものから並列化の対象とする部分を選択

ボトルネック特定

時間計測結果

Subroutine

time

---

sub_a

50 s

sub_b

150 s

sub_c

250 s

sub_d

500 s

sub_e

50 s

---

Total 1000 s

sub_a

5%

sub_b

15%

sub_c

25%

sub_d

50%

sub_e

5%

(22)

依存関係がない

並列化可能な部分

+ + + + +

+ +

1 2 3 4 5

9 9 1 0 0

1 2 3 4 5

9 9 1 0 0

1 2 3 4 5

9 9 1 0 0

・・・

・・・

・・・

b(i)

c(i)

a(i)

do i =

1, 25

a(i) = b(i) + c(i)

enddo

do i =

26, 50

a(i) = b(i) + c(i)

enddo

do i =

51, 75

a(i) = b(i) + c(i)

enddo

do i =

76, 100

a(i) = b(i) + c(i)

enddo

※ループを逆に回して解が再現すれば大抵大丈夫

do i = 1, 100

a(i) = b(i) + c(i)

enddo

(23)

①依存関係がある

②同じところに書込み

③入出力

並列化不可能な部分

a(0) = const.

do i = 1, 100

a(i) = a(i-1) + b(i)

enddo

do i = 1, 100

j = index(i)

a(j) = a(j) + b(i)

enddo

1 2 3 4 5

9 9 1 0 0

1 2 3 4 5

9 9 1 0 0

・・・

・・・

b(i)

a(i)

index(i)

担当1

担当2

1 2 3 4 5

・・・

・・・

9 9 1 0 0

0 1 2 3 4 5

・・・

9 9 1 0 0

b(i)

a(i)

計算終了

担当1

担当2

計算するには

a(3)

必要

同時に書き込む

可能性がある

(24)

sub_c, sub_d が並列化できた

sub_bは並列できない処理だった

4並列で計算

並列化

0

200

400

600

800

1000

sub_a

sub_b

sub_c

sub_d

sub_e

シリアル計算

4並列計算

1000 s

438 s

計算時間

[s

]

理想的に並列できると

全体の倍率

2.3倍

並列化効率

0.57

x4

x4

sub_a, sub_e も並列化

並列化できるアルゴリズ

ムに変える

(25)

高速化・並列化事例

PARDISOについて(XLsoft 黒澤様)

並列化

並列化について

並列化作業の流れ

並列化の手段

OpenMPデモ

OpenMPで並列計算する

円周率

p

の計算(

private、reduction)

マンデルブロ集合(

schedule)

OpenMPまとめ

性能が出ない場合

目次

(26)

並列化の手段

CPU

GPU

メモリ

CPU

GPU

メモリ

CPU

GPU

メモリ

MPI

(分散メモリ、共有メモリ)

OpenMP

(共有メモリ)

GPGPU

ハイブリッドも可能

ノード

(27)

メリット

基本的にディレクティブ(挿入句)を入れるだ

けで簡単

動的にロードバランスがとれる

計算粒度が細かくても並列化可能

デメリット

メモリアクセスが多いとメモリバンド幅をス

レッドが取りあってしまう

コア数倍以上の高速化が出来ない

OpenMP

CPU

GPU

メモリ

OpenMP

(共有メモリ)

並列領域

スレッド生成

マスタースレッド

計算のイメージ

スレッド消滅

!$omp ○○

(28)

MPI

(Message Passing Interface)

メリット

▫ 大規模な並列化が可能

デメリット

▫ プログラム開発が難しく、途中で

デバッグしづらい

▫ データ通信がオーバーヘッドにな

ることも

CPU コ ア コ ア コ ア コ ア GPU メモリ CPU コ ア コ ア コ ア コ ア GPU メモリ CPU コ ア コ ア コ ア コ ア GPU メモリ

MPI

並列計算

データ通信

データ通信

プロセス

プロセス0のみ処理

計算のイメージ

(分散メモリ、

共有メモリ)

(29)

GPGPU

CPU

メモリ

GPU

メモリ

メリット

▫ デスクトップでも高い計算能力

▫ GPUに向いた計算では100倍以上の高速化も可能

デメリット

▫ プログラム開発、性能を引き出すのが難しい

▫ 大幅なプログラム書き換えが必要な場合も

GPU計算

データコピー

データコピー

CPU

計算のイメージ

(General Purpose computing on Graphics Processing Units)

(30)

比較

OpenMP

MPI

GPGPU

開発

倍率

(1Core比)

~コア数倍

~ノード数×コア数倍

(GPU1つで)

数倍~百倍以上

マシン

1台

複数台

1台~

メモリ

共有

分散・共有

GPU上のメモリ

得意

•ロードバランスが悪い

•粒度が大きい

•演算が多い

•データの再利用性が高い

苦手

•メモリアクセスが多い

•粒度が小さい

•通信が多い

•並列数が小さい

•ランダムなメモリアクセス

•データコピー頻度が高い

(31)

高速化・並列化事例

PARDISOについて(XLsoft 黒澤様)

並列化

並列化について

並列化作業の流れ

並列化の手段

OpenMPデモ

OpenMPで並列計算する

円周率

p

の計算(

private、reduction)

マンデルブロ集合(

schedule)

OpenMPまとめ

性能が出ない場合

目次

(32)

hpc-rccm@rccm.co.jp

この度は、セミナー資料をダウンロード頂きありがとうございます。

セミナーではこの後に、いくつか例題をOpenMPで並列化し、計算

が速くなる様子をデモで行っています。セミナー開催時は是非ご参

加ください。

また、資料は常に配布しておりますので、続きのスライド、デモプ

ログラムをご希望の方は、下記までお気軽にご連絡ください。

HPCホームページ

http://www.rccm.co.jp/development/parallel/

Updating...

関連した話題 :