CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

60
RIKEN ADVANCED INSTITUTE FOR COMPUTATIONAL SCIENCE 2014年4月24日 独立行政法人理化学研究所 計算科学研究機構 運用技術部門 ソフトウェア技術チーム チームヘッド 南 一生 [email protected] CMSI 計算科学技術 特論B 第3回 アプリケーションの性能最適化2 (CPU単体性能最適化)

Transcript of CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

Page 1: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

RIKEN13 ADVANCED13 INSTITUTE13 FOR13 COMPUTATIONAL13 SCIENCE

2014年4月24日

独立行政法人理化学研究所計算科学研究機構運用技術部門ソフトウェア技術チームチームヘッド

南一生

minami_kazrikenjp

CMSI計算科学技術 特論B

第3回 アプリケーションの性能最適化2 (CPU単体性能最適化)

講義の概要

bull スーパーコンピュータとアプリケーションの性能 bull アプリケーションの性能最適化1(高並列性能最適化) bull アプリケーションの性能最適化2(CPU単体性能最適化) bull アプリケーションの性能最適化の実例1 bull アプリケーションの性能最適化の実例2

22014年4月24日 CMSI計算科学技術 特論B 

内容

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

32014年4月24日 CMSI計算科学技術 特論B 

4

スレッド並列化

2014年4月24日 CMSI計算科学技術 特論B 

5

演算器

メモリ

レジスタ

CPU

演算器演算器

レジスタレジスタ

コア

共有キャッシュ

ハードウェア

バリア同期

京の場合1CPUに8コア搭載 8コアでL2キャッシュを共有 MPI等のプロセス並列に対しCPU内の8コアを使用するためのスレッド並列化が必要 スレッド並列化のためには自動並列化かOpenMPが使用可 京の場合はハードウェアバリア同期機能を使用した高速なスレッド処理が可能

スレッド並列の概要

2014年4月24日 CMSI計算科学技術 特論B 

6

1プロセス8スレッド (ハイブリッドMPI)の場合

8プロセス(フラットMPI)の場合

core core core core

core core core core

core core core core

core core core core

ハイブリッド並列とフラットMPI並列

MPIプロセス並列とスレッド並列を組み合わせをハイブリッド並列という 各コアにMPIプロセスをわりあてる並列化をフラットMPI並列という 京では通信資源の効率的利用消費メモリ量を押さえる観点でハイブリッド並列を推奨している

2014年4月24日 CMSI計算科学技術 特論B 

7

スレッド並列+プロセス並列のハイブリッド型 コア内コンパイラによる逐次最適化SIMD化 CPU内スレッド並列(自動並列化細粒度並列化daggerOpenMP) CPU間プロセス並列(MPIXPFortran)

CPU

dagger細粒度並列化 高速バリア同期を活用し内側ループをコア間で並列化 ベクトル向け(内側ループが長い)コードの高速化が可能

core core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU内スレッド並列(細粒度並列

OpenMP)(コンパイラによるサポートあり)

CPU

メモリ

CPU

メモリ

CPU間プロセス並列(MPIおよびXPFortran)

プロセス並列型 コア内コンパイラによる逐次最適化SIMD化 コア間プロセス並列(MPIXPFortran)

CPUcore core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU

メモリ

CPU

メモリ

コア間プロセス並列(MPIおよびXPFortran)

実行効率の観点からハイブリッド型を推奨

CPU

メモリ

CPU

メモリ

ハイブリッド並列とフラットMPI並列(京の場合)

2014年4月24日 CMSI計算科学技術 特論B 

8

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

9

(1)ロードストアの効率化 (2)ラインアクセスの有効利用 (3)キャッシュの有効利用 (4)効率の良い命令スケジューリング (5)演算器の有効利用

CPU内の複数コアでまずスレッド並列化が できていると事は前提として

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

10

(1)ロードストアの効率化

プリフェッチの有効利用 演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

11

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

レイテンシ(相対値)

10

100

2014年4月24日 CMSI計算科学技術 特論B 

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 2: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

講義の概要

bull スーパーコンピュータとアプリケーションの性能 bull アプリケーションの性能最適化1(高並列性能最適化) bull アプリケーションの性能最適化2(CPU単体性能最適化) bull アプリケーションの性能最適化の実例1 bull アプリケーションの性能最適化の実例2

22014年4月24日 CMSI計算科学技術 特論B 

内容

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

32014年4月24日 CMSI計算科学技術 特論B 

4

スレッド並列化

2014年4月24日 CMSI計算科学技術 特論B 

5

演算器

メモリ

レジスタ

CPU

演算器演算器

レジスタレジスタ

コア

共有キャッシュ

ハードウェア

バリア同期

京の場合1CPUに8コア搭載 8コアでL2キャッシュを共有 MPI等のプロセス並列に対しCPU内の8コアを使用するためのスレッド並列化が必要 スレッド並列化のためには自動並列化かOpenMPが使用可 京の場合はハードウェアバリア同期機能を使用した高速なスレッド処理が可能

スレッド並列の概要

2014年4月24日 CMSI計算科学技術 特論B 

6

1プロセス8スレッド (ハイブリッドMPI)の場合

8プロセス(フラットMPI)の場合

core core core core

core core core core

core core core core

core core core core

ハイブリッド並列とフラットMPI並列

MPIプロセス並列とスレッド並列を組み合わせをハイブリッド並列という 各コアにMPIプロセスをわりあてる並列化をフラットMPI並列という 京では通信資源の効率的利用消費メモリ量を押さえる観点でハイブリッド並列を推奨している

2014年4月24日 CMSI計算科学技術 特論B 

7

スレッド並列+プロセス並列のハイブリッド型 コア内コンパイラによる逐次最適化SIMD化 CPU内スレッド並列(自動並列化細粒度並列化daggerOpenMP) CPU間プロセス並列(MPIXPFortran)

CPU

dagger細粒度並列化 高速バリア同期を活用し内側ループをコア間で並列化 ベクトル向け(内側ループが長い)コードの高速化が可能

core core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU内スレッド並列(細粒度並列

OpenMP)(コンパイラによるサポートあり)

CPU

メモリ

CPU

メモリ

CPU間プロセス並列(MPIおよびXPFortran)

プロセス並列型 コア内コンパイラによる逐次最適化SIMD化 コア間プロセス並列(MPIXPFortran)

CPUcore core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU

メモリ

CPU

メモリ

コア間プロセス並列(MPIおよびXPFortran)

実行効率の観点からハイブリッド型を推奨

CPU

メモリ

CPU

メモリ

ハイブリッド並列とフラットMPI並列(京の場合)

2014年4月24日 CMSI計算科学技術 特論B 

8

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

9

(1)ロードストアの効率化 (2)ラインアクセスの有効利用 (3)キャッシュの有効利用 (4)効率の良い命令スケジューリング (5)演算器の有効利用

CPU内の複数コアでまずスレッド並列化が できていると事は前提として

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

10

(1)ロードストアの効率化

プリフェッチの有効利用 演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

11

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

レイテンシ(相対値)

10

100

2014年4月24日 CMSI計算科学技術 特論B 

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 3: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

内容

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

32014年4月24日 CMSI計算科学技術 特論B 

4

スレッド並列化

2014年4月24日 CMSI計算科学技術 特論B 

5

演算器

メモリ

レジスタ

CPU

演算器演算器

レジスタレジスタ

コア

共有キャッシュ

ハードウェア

バリア同期

京の場合1CPUに8コア搭載 8コアでL2キャッシュを共有 MPI等のプロセス並列に対しCPU内の8コアを使用するためのスレッド並列化が必要 スレッド並列化のためには自動並列化かOpenMPが使用可 京の場合はハードウェアバリア同期機能を使用した高速なスレッド処理が可能

スレッド並列の概要

2014年4月24日 CMSI計算科学技術 特論B 

6

1プロセス8スレッド (ハイブリッドMPI)の場合

8プロセス(フラットMPI)の場合

core core core core

core core core core

core core core core

core core core core

ハイブリッド並列とフラットMPI並列

MPIプロセス並列とスレッド並列を組み合わせをハイブリッド並列という 各コアにMPIプロセスをわりあてる並列化をフラットMPI並列という 京では通信資源の効率的利用消費メモリ量を押さえる観点でハイブリッド並列を推奨している

2014年4月24日 CMSI計算科学技術 特論B 

7

スレッド並列+プロセス並列のハイブリッド型 コア内コンパイラによる逐次最適化SIMD化 CPU内スレッド並列(自動並列化細粒度並列化daggerOpenMP) CPU間プロセス並列(MPIXPFortran)

CPU

dagger細粒度並列化 高速バリア同期を活用し内側ループをコア間で並列化 ベクトル向け(内側ループが長い)コードの高速化が可能

core core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU内スレッド並列(細粒度並列

OpenMP)(コンパイラによるサポートあり)

CPU

メモリ

CPU

メモリ

CPU間プロセス並列(MPIおよびXPFortran)

プロセス並列型 コア内コンパイラによる逐次最適化SIMD化 コア間プロセス並列(MPIXPFortran)

CPUcore core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU

メモリ

CPU

メモリ

コア間プロセス並列(MPIおよびXPFortran)

実行効率の観点からハイブリッド型を推奨

CPU

メモリ

CPU

メモリ

ハイブリッド並列とフラットMPI並列(京の場合)

2014年4月24日 CMSI計算科学技術 特論B 

8

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

9

(1)ロードストアの効率化 (2)ラインアクセスの有効利用 (3)キャッシュの有効利用 (4)効率の良い命令スケジューリング (5)演算器の有効利用

CPU内の複数コアでまずスレッド並列化が できていると事は前提として

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

10

(1)ロードストアの効率化

プリフェッチの有効利用 演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

11

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

レイテンシ(相対値)

10

100

2014年4月24日 CMSI計算科学技術 特論B 

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 4: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

4

スレッド並列化

2014年4月24日 CMSI計算科学技術 特論B 

5

演算器

メモリ

レジスタ

CPU

演算器演算器

レジスタレジスタ

コア

共有キャッシュ

ハードウェア

バリア同期

京の場合1CPUに8コア搭載 8コアでL2キャッシュを共有 MPI等のプロセス並列に対しCPU内の8コアを使用するためのスレッド並列化が必要 スレッド並列化のためには自動並列化かOpenMPが使用可 京の場合はハードウェアバリア同期機能を使用した高速なスレッド処理が可能

スレッド並列の概要

2014年4月24日 CMSI計算科学技術 特論B 

6

1プロセス8スレッド (ハイブリッドMPI)の場合

8プロセス(フラットMPI)の場合

core core core core

core core core core

core core core core

core core core core

ハイブリッド並列とフラットMPI並列

MPIプロセス並列とスレッド並列を組み合わせをハイブリッド並列という 各コアにMPIプロセスをわりあてる並列化をフラットMPI並列という 京では通信資源の効率的利用消費メモリ量を押さえる観点でハイブリッド並列を推奨している

2014年4月24日 CMSI計算科学技術 特論B 

7

スレッド並列+プロセス並列のハイブリッド型 コア内コンパイラによる逐次最適化SIMD化 CPU内スレッド並列(自動並列化細粒度並列化daggerOpenMP) CPU間プロセス並列(MPIXPFortran)

CPU

dagger細粒度並列化 高速バリア同期を活用し内側ループをコア間で並列化 ベクトル向け(内側ループが長い)コードの高速化が可能

core core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU内スレッド並列(細粒度並列

OpenMP)(コンパイラによるサポートあり)

CPU

メモリ

CPU

メモリ

CPU間プロセス並列(MPIおよびXPFortran)

プロセス並列型 コア内コンパイラによる逐次最適化SIMD化 コア間プロセス並列(MPIXPFortran)

CPUcore core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU

メモリ

CPU

メモリ

コア間プロセス並列(MPIおよびXPFortran)

実行効率の観点からハイブリッド型を推奨

CPU

メモリ

CPU

メモリ

ハイブリッド並列とフラットMPI並列(京の場合)

2014年4月24日 CMSI計算科学技術 特論B 

8

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

9

(1)ロードストアの効率化 (2)ラインアクセスの有効利用 (3)キャッシュの有効利用 (4)効率の良い命令スケジューリング (5)演算器の有効利用

CPU内の複数コアでまずスレッド並列化が できていると事は前提として

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

10

(1)ロードストアの効率化

プリフェッチの有効利用 演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

11

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

レイテンシ(相対値)

10

100

2014年4月24日 CMSI計算科学技術 特論B 

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 5: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

5

演算器

メモリ

レジスタ

CPU

演算器演算器

レジスタレジスタ

コア

共有キャッシュ

ハードウェア

バリア同期

京の場合1CPUに8コア搭載 8コアでL2キャッシュを共有 MPI等のプロセス並列に対しCPU内の8コアを使用するためのスレッド並列化が必要 スレッド並列化のためには自動並列化かOpenMPが使用可 京の場合はハードウェアバリア同期機能を使用した高速なスレッド処理が可能

スレッド並列の概要

2014年4月24日 CMSI計算科学技術 特論B 

6

1プロセス8スレッド (ハイブリッドMPI)の場合

8プロセス(フラットMPI)の場合

core core core core

core core core core

core core core core

core core core core

ハイブリッド並列とフラットMPI並列

MPIプロセス並列とスレッド並列を組み合わせをハイブリッド並列という 各コアにMPIプロセスをわりあてる並列化をフラットMPI並列という 京では通信資源の効率的利用消費メモリ量を押さえる観点でハイブリッド並列を推奨している

2014年4月24日 CMSI計算科学技術 特論B 

7

スレッド並列+プロセス並列のハイブリッド型 コア内コンパイラによる逐次最適化SIMD化 CPU内スレッド並列(自動並列化細粒度並列化daggerOpenMP) CPU間プロセス並列(MPIXPFortran)

CPU

dagger細粒度並列化 高速バリア同期を活用し内側ループをコア間で並列化 ベクトル向け(内側ループが長い)コードの高速化が可能

core core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU内スレッド並列(細粒度並列

OpenMP)(コンパイラによるサポートあり)

CPU

メモリ

CPU

メモリ

CPU間プロセス並列(MPIおよびXPFortran)

プロセス並列型 コア内コンパイラによる逐次最適化SIMD化 コア間プロセス並列(MPIXPFortran)

CPUcore core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU

メモリ

CPU

メモリ

コア間プロセス並列(MPIおよびXPFortran)

実行効率の観点からハイブリッド型を推奨

CPU

メモリ

CPU

メモリ

ハイブリッド並列とフラットMPI並列(京の場合)

2014年4月24日 CMSI計算科学技術 特論B 

8

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

9

(1)ロードストアの効率化 (2)ラインアクセスの有効利用 (3)キャッシュの有効利用 (4)効率の良い命令スケジューリング (5)演算器の有効利用

CPU内の複数コアでまずスレッド並列化が できていると事は前提として

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

10

(1)ロードストアの効率化

プリフェッチの有効利用 演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

11

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

レイテンシ(相対値)

10

100

2014年4月24日 CMSI計算科学技術 特論B 

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 6: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

6

1プロセス8スレッド (ハイブリッドMPI)の場合

8プロセス(フラットMPI)の場合

core core core core

core core core core

core core core core

core core core core

ハイブリッド並列とフラットMPI並列

MPIプロセス並列とスレッド並列を組み合わせをハイブリッド並列という 各コアにMPIプロセスをわりあてる並列化をフラットMPI並列という 京では通信資源の効率的利用消費メモリ量を押さえる観点でハイブリッド並列を推奨している

2014年4月24日 CMSI計算科学技術 特論B 

7

スレッド並列+プロセス並列のハイブリッド型 コア内コンパイラによる逐次最適化SIMD化 CPU内スレッド並列(自動並列化細粒度並列化daggerOpenMP) CPU間プロセス並列(MPIXPFortran)

CPU

dagger細粒度並列化 高速バリア同期を活用し内側ループをコア間で並列化 ベクトル向け(内側ループが長い)コードの高速化が可能

core core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU内スレッド並列(細粒度並列

OpenMP)(コンパイラによるサポートあり)

CPU

メモリ

CPU

メモリ

CPU間プロセス並列(MPIおよびXPFortran)

プロセス並列型 コア内コンパイラによる逐次最適化SIMD化 コア間プロセス並列(MPIXPFortran)

CPUcore core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU

メモリ

CPU

メモリ

コア間プロセス並列(MPIおよびXPFortran)

実行効率の観点からハイブリッド型を推奨

CPU

メモリ

CPU

メモリ

ハイブリッド並列とフラットMPI並列(京の場合)

2014年4月24日 CMSI計算科学技術 特論B 

8

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

9

(1)ロードストアの効率化 (2)ラインアクセスの有効利用 (3)キャッシュの有効利用 (4)効率の良い命令スケジューリング (5)演算器の有効利用

CPU内の複数コアでまずスレッド並列化が できていると事は前提として

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

10

(1)ロードストアの効率化

プリフェッチの有効利用 演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

11

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

レイテンシ(相対値)

10

100

2014年4月24日 CMSI計算科学技術 特論B 

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 7: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

7

スレッド並列+プロセス並列のハイブリッド型 コア内コンパイラによる逐次最適化SIMD化 CPU内スレッド並列(自動並列化細粒度並列化daggerOpenMP) CPU間プロセス並列(MPIXPFortran)

CPU

dagger細粒度並列化 高速バリア同期を活用し内側ループをコア間で並列化 ベクトル向け(内側ループが長い)コードの高速化が可能

core core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU内スレッド並列(細粒度並列

OpenMP)(コンパイラによるサポートあり)

CPU

メモリ

CPU

メモリ

CPU間プロセス並列(MPIおよびXPFortran)

プロセス並列型 コア内コンパイラによる逐次最適化SIMD化 コア間プロセス並列(MPIXPFortran)

CPUcore core core core

core core core core

メモリ

コア内逐次最適化SIMD化(主にコンパイラ)

CPU

メモリ

CPU

メモリ

CPU

メモリ

コア間プロセス並列(MPIおよびXPFortran)

実行効率の観点からハイブリッド型を推奨

CPU

メモリ

CPU

メモリ

ハイブリッド並列とフラットMPI並列(京の場合)

2014年4月24日 CMSI計算科学技術 特論B 

8

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

9

(1)ロードストアの効率化 (2)ラインアクセスの有効利用 (3)キャッシュの有効利用 (4)効率の良い命令スケジューリング (5)演算器の有効利用

CPU内の複数コアでまずスレッド並列化が できていると事は前提として

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

10

(1)ロードストアの効率化

プリフェッチの有効利用 演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

11

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

レイテンシ(相対値)

10

100

2014年4月24日 CMSI計算科学技術 特論B 

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 8: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

8

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

9

(1)ロードストアの効率化 (2)ラインアクセスの有効利用 (3)キャッシュの有効利用 (4)効率の良い命令スケジューリング (5)演算器の有効利用

CPU内の複数コアでまずスレッド並列化が できていると事は前提として

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

10

(1)ロードストアの効率化

プリフェッチの有効利用 演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

11

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

レイテンシ(相対値)

10

100

2014年4月24日 CMSI計算科学技術 特論B 

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 9: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

9

(1)ロードストアの効率化 (2)ラインアクセスの有効利用 (3)キャッシュの有効利用 (4)効率の良い命令スケジューリング (5)演算器の有効利用

CPU内の複数コアでまずスレッド並列化が できていると事は前提として

CPU単体性能を上げるための5つの要素

2014年4月24日 CMSI計算科学技術 特論B 

10

(1)ロードストアの効率化

プリフェッチの有効利用 演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

11

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

レイテンシ(相対値)

10

100

2014年4月24日 CMSI計算科学技術 特論B 

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 10: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

10

(1)ロードストアの効率化

プリフェッチの有効利用 演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

11

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

レイテンシ(相対値)

10

100

2014年4月24日 CMSI計算科学技術 特論B 

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 11: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

11

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

レイテンシ(相対値)

10

100

2014年4月24日 CMSI計算科学技術 特論B 

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 12: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

12

レイテンシ(アクセスの立ち上がり)

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

立ち上がり

アクセス

時間

2014年4月24日 CMSI計算科学技術 特論B 

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 13: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

13

プリフェッチの有効利用

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

立ち上がり

アクセス

プリフェッチ

アクセス

時間

演算にアクセスそのものを隠せる場合もある

2014年4月24日 CMSI計算科学技術 特論B 

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 14: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

14

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善

以下のコーディングを例に考える 以下のコーディングの演算は和2個積2個の計4個 ロードの数はxa(i)a(i+1)の計3個 ストアの数はxの1個 したがってロードストア数は4個 演算とロードストアの比は44となる なるべく演算の比率を高めロードストアの比率を低く抑えて演算とロードストアの比を改善を図る事が重要

2014年4月24日 CMSI計算科学技術 特論B 

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 15: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

15

演算器

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

キャッシュライン 128byte毎のアクセス

全部の要素を 計算に利用

1個の要素のみ を計算に利用

キャッシュライン 128byte毎のアクセス

効率が良い 効率が悪い

(2)ラインアクセスの有効利用

2014年4月24日 CMSI計算科学技術 特論B 

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 16: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

16

演算器

データ供給能力の高いキャッシュを設ける

キャッシュに置いたデータを何回も再利用し演算を行なう

こうする事で演算器の能力を十分使い切る

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

再利用

(3)キャッシュの有効利用

ブロッキング

2014年4月24日 CMSI計算科学技術 特論B 

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 17: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

17

ループi+1

ループi ループiループi+1

do i=1100  計算1  計算2 end do

計算時間 計算時間

効率が良い

効率が悪い

(4)効率の良い命令スケジューリング

2014年4月24日 CMSI計算科学技術 特論B 

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 18: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

18

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

コンパイラ

lt前提gt ロード2つorストアと演算とは同時実行可能 ロードとストアは2クロックで実行可能 演算は4クロックで実行可能 ロードと演算とストアはパイプライン化されている

(1) (2)

lt実行時間gt 8クロックtimes100要素=800クロックかかる

2014年4月24日 CMSI計算科学技術 特論B 

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 19: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

19

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

ltソフトウェアパイプラインニングgt

例えば以下のコーディングを考える

do i=1100a(i)=a(i-1)+a(i)b(i)=b(i-1)+a(i)c(i)=c(i-1)+b(i)end do

このコーディングは下図の実線の矢印のような参照関係を持っているためループ内の3つの式に依存性が生じる点線上の計算をループ内の3つの式となるよう処理を変更することをソフトウェアパイプラインニングという

a

b

c

0 1 2 3 4

コーディングは以下のようになる

a(1)=a(0)+a(1)b(1)=b(0)+a(1)a(2)=a(1)+a(2)do i=3100c(i-2)=c(i-3)+b(i-2)b(i-1)=b(i-2)+a(i-1)a(i)=a(i-1)+a(i)end do c(99)=c(98)+b(99)b(100)=b(99)+a(100)c(100)=c(99)+b(100)

aロード

bロード

演算

ストア

(1)    (2)    (3)    (4)     (99) (100)

コンパイラ

2014年4月24日 CMSI計算科学技術 特論B 

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 20: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

20

並列処理と依存性の回避

lt ソフトウェアパイプラインニングgt  do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア end do

コンパイラ

(1) (2)

  do i=1100   a(i)のロード     b(i)のロード     a(i)とb(i)の演算     i番目の結果のストア end do

(1) (2)

2014年4月24日 CMSI計算科学技術 特論B 

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 21: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

21

並列処理と依存性の回避lt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

lt実行時間gt 前後の処理及びメインループの立ち上がり部分を除くと 1クロックtimes100要素=100クロックで処理できる

(3)(1) (2) (4)(5)(6)(7)(8)

2014年4月24日 CMSI計算科学技術 特論B 

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 22: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

22

乗算と加算を4個同時に計算可能

( 1  +  1 ) times 4 = 8

1コアのピーク性能8演算times2GHz =16G演算秒

この条件に 近い程高効率

(5)演算器の有効利用

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 23: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

23

要求BF値と5つの要素の関係

2014年4月24日 CMSI計算科学技術 特論B 

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 24: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

24

要求BF値と5つの要素の関係

アプリケーションの要求BF値の大小によって性能チューニングにおいて注目すべき項目が異なる

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算(要求BF値が小さい)

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

(a) (b)

BF値 =移動量(Byte)演算量(Flop) =(N2+N)2N2

≒12

行列ベクトル積の計算(要求BF値が大きい)

2N2個の演算 N2個のデータ N個のデータ 原理的には1Nより大きな値

times=

(a) (b)

2014年4月24日 CMSI計算科学技術 特論B 

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 25: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

25

原理的にキャッシュの有効利用が可能 まずデータをオンキャッシュにするコーディング(3)が重要 つぎに2次キャッシュのライン上のデータを有効に利用するコーディング(2)が重要 それが実現できた上で(4)(5)が重要

要求BF値と5つの要素の関係

要求するBFが小さいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

2014年4月24日 CMSI計算科学技術 特論B 

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 26: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

26

メモリバンド幅を使い切る事が大事

要求するBFが大きいアプリケーションについて

要求BF値と5つの要素の関係

wk

4

M)x|

L)x|

3d[q

ty~

w

ty~

ampB

4jty~bkpksCarpWr

lt内側ループアンローリング(2)gt以下の様な2つのコーディングを比較するdo j=1mdo i=1nx(i)=x(i)+a(i)b+a(i+1)dend do

do j=1mdo i=1n2x(i)=x(i)+a(i)b+a(i+1)dx(i+1)=x(i+1)+a(i+1)b+a(i+2)dend do

最初のコーディングの演算量は4ロードストア回数は4である2つ目のコーディングの演算量は8ロードストア回数は7である最初のコーディングの演算とロードストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

演算とロードストア比の改善kuzsj8ZrEkuzk4l2k=EklUIOFRGIOFRHLGk=EtklUkE_c[eftlE4htk+lJhirEirm4k+-sDotk+-sZf4htk+s$sr[AltE

レイテンシーが隠れた状態にする事この状態でメモリバンド幅のピーク(京の場合の理論値は64GBsec)が出せるレイテンシーが見えているとメモリバンド幅のピーク値は出せない

2014年4月24日 CMSI計算科学技術 特論B 

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 27: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

27

一番重要なのは(1)(2) 次にできるだけオンキャッシュする(3)が重要 これら(1)(2)(3)が満たされ計算に必要なデータが演算器に供給された状態でそれらのデータを十分使える程度に(4)のスケジューリングができてさらに(5)の演算器が有効に活用できる状態である事が必要

要求BF値と5つの要素の関係

要求するBFが大きいアプリケーションについて

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

RHL

R RRHL

PTERNLILKKEV=4LEV=4MEQSPEPT

=4ampB =4ampB

-[X

-[X

0+H=XTWbidgS

GH

lt ソフトウェアパイプラインニングgt

例えば以下の処理をを考える

 do i=1100   a(i)のロード   b(i)のロード   a(i)とb(i)の演算   i番目の結果のストア  end do

Ug]Pc

46)hfijD9X[OGGI)hfiGX[OIjRfZRF)hIkRfZRF)hfiGGX[OI]P_cPgBME=L

(1) (2)

46)h2RfZR-$ 52RfZRgtgtL

GHlt ソフトウェアパイプラインニングgt

左の処理を以下のように構成し直す事をソフトウェアパイプラインニングという

a(1)a(2)a(3)のロード

b(1)b(2)のロード (1)の演算 do i=3100   a(i+1)のロード   b(i)のロード   (i-1)の演算 i-2番目の結果のストア end do b(100)のロード (99)(100)の演算 (98)(99)(100)のストア

46)hH13J`Pgei_HCKampN(AG)h-RfZR-$ 5-RfZRFFL)

(3)(1) (2) (4)(5)(6)(7)(8)

4h4sampj=49

( 1 V+ V1 ) times = 8

1tky984times2GHz =16G40

^k(j X1D-

1+H

2SIMD MultiampAdd演算器times2本

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

4

M)x|

L)x|

x|vE128bytekty~

klt5s =4j

1klt5kn s=4j

x|vE128bytekty~

-[X -[X

+cPgORYXH

4

69kDXx|sgt]rEx|j7Xcsp_4siYE^Y`rg4k9sXr

M)x|

L)x|

+QaZVbH

^fZQgS)XcZVgSH(

2014年4月24日 CMSI計算科学技術 特論B 

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 28: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

28

性能予測手法 (要求BF値が大きい場合)

2014年4月24日 CMSI計算科学技術 特論B 

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 29: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

29

オリジナル性能

AICS サマースクール 2012

䛆diffusion㛫䠎䛇ホ౯㛫䝹䞊䝥㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒

㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕

㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻍

㻍㻐㼛㼙㼜㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻔⥆䛝䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍

㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏

FUJITSU CONFIDENTIAL 14

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻔⥆䛟䠅

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕

㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝

㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠

㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗

㻌㻌㻌㻌㻌㻌㻌㻍

㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘

㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘

㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎

㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䜛䛯䜑䚸䛭䜜䛮䜜䜢㛫䠎䠍䡚㛫䠎䠐䛻ヲ䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹䛧䛶ศᯒ䜢䛺䛳䛯䚹

AICS サマースクール 2012

㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫㻯㻼㼁㛫

㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜㻝㻚㻠㻱㻗㻜㻜

㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜㻝㻚㻢㻱㻗㻜㻜

㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜㻝㻚㻤㻱㻗㻜㻜

㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜㻞㻚㻜㻱㻗㻜㻜

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉⤒㐣㛫⤒㐣㛫⤒㐣㛫⤒㐣㛫

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝㻣㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝㻥㻚㻜㻱㻙㻜㻝

㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉㼇㼟㼑㼏㼉

㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ㻷㻌䠿㼛㼙㼜㼡㼠㼑㼞ᐇሗ

㛫 㡯㻲䝢䞊䜽ẚ 㻹㻲㻸㻻㻼㻿

ᐇ㛫㻔㻕

䝇䜿䞊䝷䝡䝸䝔䜱 ⥲௧

㻸㻝㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕

㻸㻞㻐䝭䝇⋡㻔㼘㼐㼟㼠㻕 㻸㻝㻐㼙㼕㼟㼟

㻸㻝㻐䝭䝇ෆヂ㼐㼙

㻸㻝㻐䝭䝇ෆヂ㼔㼣㼜㼒

㻸㻝㻐䝭䝇ෆヂ㼟㼣㼜㼒 㻸㻞㻐㼙㼕㼟㼟

㻸㻞䝭䝇ෆヂ㼐㼙

㻸㻞䝭䝇ෆヂ㼜㼒

䝯䝰䝸䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㼟㻕

㻸㻞㻐䝇䝹䞊䝥䝑䝖㻔㻳㻮㻛㻿㻕

㼟㼠㼛㼞㼑௧⋡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻣㻚㻟㻜㻑 㻞㻣㻢㻥 㻜㻚㻣㻡㻞 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻤㻥㻑 㻟㻚㻣㻡㻑 㻝㻚㻟㻠㻱㻗㻜㻤 㻠㻚㻣㻜㻑 㻥㻡㻚㻞㻣㻑 㻜㻚㻜㻟㻑 㻤㻚㻡㻠㻱㻗㻜㻣 㻜㻚㻝㻢㻑 㻥㻥㻚㻤㻠㻑 㻝㻤㻚㻣㻜 㻞㻞㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻣㻚㻞㻥㻑 㻥㻟㻟㻤 㻜㻚㻞㻞㻟 㻟㻚㻟㻣 㻞㻚㻟㻥㻱㻗㻜㻥 㻡㻚㻥㻟㻑 㻟㻚㻣㻣㻑 㻝㻚㻟㻡㻱㻗㻜㻤 㻝㻠㻚㻟㻜㻑 㻤㻡㻚㻢㻡㻑 㻜㻚㻜㻡㻑 㻤㻚㻡㻥㻱㻗㻜㻣 㻜㻚㻡㻢㻑 㻥㻥㻚㻠㻠㻑 㻡㻣㻚㻞㻤 㻣㻣㻚㻢㻢

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻢㻚㻠㻢㻑 㻞㻢㻟㻟 㻜㻚㻤㻜㻟 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻜㻣㻑 㻝㻚㻠㻜㻱㻗㻜㻤 㻣㻚㻟㻤㻑 㻥㻞㻚㻡㻥㻑 㻜㻚㻜㻟㻑 㻝㻚㻡㻤㻱㻗㻜㻢 㻞㻚㻣㻝㻑 㻥㻣㻚㻞㻥㻑 㻜㻚㻟㻠 㻞㻞㻚㻠㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻝㻚㻣㻤㻑 㻝㻡㻜㻤㻞 㻜㻚㻝㻠㻜 㻡㻚㻣㻟 㻞㻚㻠㻡㻱㻗㻜㻥 㻢㻚㻜㻜㻑 㻜㻚㻝㻝㻑 㻝㻚㻟㻥㻱㻗㻜㻤 㻝㻤㻚㻡㻥㻑 㻤㻝㻚㻟㻣㻑 㻜㻚㻜㻠㻑 㻞㻚㻡㻝㻱㻗㻜㻢 㻡㻚㻤㻠㻑 㻥㻠㻚㻝㻢㻑 㻞㻚㻣㻡 㻝㻞㻢㻚㻤㻡

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻡㻚㻡㻥㻑 㻞㻠㻥㻠 㻜㻚㻤㻠㻣 㻞㻚㻠㻟㻱㻗㻜㻥 㻢㻚㻝㻤㻑 㻜㻚㻜㻟㻑 㻝㻚㻠㻟㻱㻗㻜㻤 㻤㻚㻤㻤㻑 㻥㻝㻚㻜㻥㻑 㻜㻚㻜㻟㻑 㻤㻚㻜㻟㻱㻗㻜㻡 㻡㻚㻣㻣㻑 㻥㻠㻚㻞㻟㻑 㻜㻚㻝㻢 㻞㻝㻚㻢㻜㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻞㻚㻟㻥㻑 㻝㻡㻤㻢㻠 㻜㻚㻝㻟㻟 㻢㻚㻟㻢 㻞㻚㻠㻠㻱㻗㻜㻥 㻢㻚㻜㻣㻑 㻜㻚㻝㻜㻑 㻝㻚㻠㻝㻱㻗㻜㻤 㻝㻣㻚㻝㻠㻑 㻤㻞㻚㻤㻝㻑 㻜㻚㻜㻠㻑 㻞㻚㻟㻞㻱㻗㻜㻢 㻝㻚㻝㻝㻑 㻥㻤㻚㻤㻥㻑 㻟㻚㻝㻜 㻝㻟㻡㻚㻜㻠

㻝㼠㼔㻌㼟㼕㼙㼐 㻝㻤㻚㻤㻟㻑 㻟㻜㻝㻞 㻜㻚㻠㻠㻜 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻟㻑 㻜㻚㻤㻞㻑 㻢㻚㻝㻠㻱㻗㻜㻣 㻡㻚㻝㻠㻑 㻥㻠㻚㻣㻥㻑 㻜㻚㻜㻣㻑 㻝㻚㻞㻡㻱㻗㻜㻣 㻜㻚㻞㻝㻑 㻥㻥㻚㻣㻥㻑 㻠㻚㻤㻝 㻝㻣㻚㻤㻣㻤㼠㼔㻌㼟㼕㼙㼐 㻝㻠㻚㻢㻤㻑 㻝㻤㻣㻥㻢 㻜㻚㻜㻣㻜 㻢㻚㻞㻠 㻝㻚㻢㻡㻱㻗㻜㻥 㻠㻚㻜㻢㻑 㻜㻚㻤㻥㻑 㻢㻚㻝㻣㻱㻗㻜㻣 㻝㻝㻚㻟㻜㻑 㻤㻤㻚㻢㻜㻑 㻜㻚㻝㻜㻑 㻝㻚㻟㻢㻱㻗㻜㻣 㻝㻚㻜㻝㻑 㻥㻤㻚㻥㻥㻑 㻞㻣㻚㻥㻟 㻝㻝㻞㻚㻝㻡

㻞㻠

㻞㻝

㻞㻞

㻞㻟

㻤㻑

㻤㻑

㻤㻑

㻝㻟㻑

䛆diffusion㛫䠎䛇ヲศᯒ

䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ䠔䝁䜰䛾ィ

㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐 㛫䠎䠍㛫䠎䠍㛫䠎䠍㛫䠎䠍 㛫䠎䠎㛫䠎䠎㛫䠎䠎㛫䠎䠎 㛫䠎䠏㛫䠎䠏㛫䠎䠏㛫䠎䠏 㛫䠎䠐㛫䠎䠐㛫䠎䠐㛫䠎䠐

FUJITSU CONFIDENTIAL 15

㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝㻢㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝㻤㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜㻝㻚㻜㻱㻗㻜㻜

㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜㻝㻚㻞㻱㻗㻜㻜

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱

ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳

䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱䜰䜽䝉䝇ᚅ䛱㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜㻜㻚㻜㻱㻗㻜㻜

㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝㻝㻚㻜㻱㻙㻜㻝

㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝㻞㻚㻜㻱㻙㻜㻝

㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝㻟㻚㻜㻱㻙㻜㻝

㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝㻠㻚㻜㻱㻙㻜㻝

㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝㻡㻚㻜㻱㻙㻜㻝

㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐 㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐㻝㼠㼔㻌㼟㼕㼙㼐 㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐㻤㼠㼔㻌㼟㼕㼙㼐

䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䠔୪䛻ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

diffusion㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶㛫䠎䛻㛵䛧䛶䜎䛪㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸Ⲵ䛜㧗䛟䠔୪䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹᪉䚸㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷㛫䠎䠍䛷L2$䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻䛫䛯䝕䞊䝍䜢⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸䝠䝑䝖䛧䚸L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹

э diffusion㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶㛫䠎䛾ᾋᑠⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䛔䜛䛾ཎᅉ䛿㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹

L2$䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䝇䝹䞊䝥䝑䝖䝛䝑䜽䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹䛺䛾䛛䠛䜢ド䛩䜛䚹

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯䜑䜑䜑䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜ᚋ䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛

(3)性能推定(要求BFが高いアプリについて)

(1)プロファイラーを使った測定

(2)プロファイラー測定結果を  使った問題の発見

(4)性能チューニング

(6)更なる性能チューニング

(5)改良コーディングの性能予測(要求BFが高いアプリについて)

性能

オリジナルコーディングの予測性能

改良コーディングの予測性能

CPU単体性能チューニング手順

2014年4月24日 CMSI計算科学技術 特論B 

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 30: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

30

アプリケーションのOperational Intensity(FlopByte) BF値の逆数

ハードウェアのピーク性能

ハードウェアのピークFBの値 APRIL 2009 | VOL 52 | NO 4 | COMMUNICATIONS OF THE ACM 65

CONVENTIONAL WISDOM IN computer architecture produced similar designs Nearly every desktop and server computer uses caches pipelining superscalar instruction issue and out-of-order execution Although the instruction sets varied the microprocessors were all from the same school of

design The relatively recent switch to multicore means that micropro-cessors will become more diverse since no conventional wisdom has yet emerged concerning their design For example some offer many simple pro-cessors vs fewer complex processors some depend on multithreading and some even replace caches with explic-

itly addressed local stores Manufac-turers will likely offer multiple prod-ucts with differing numbers of cores to cover multiple price-performance points since Moorersquos Law will permit the doubling of the number of cores per chip every two years4 While di-versity may be understandable in this time of uncertainty it exacerbates the

Roofline An Insightful Visual Performance Model for Multicore Architectures

DOI10114514987651498785

The Roofline model offers insight on how to improve the performance of software and hardware

BY SAMUEL WILLIAMS ANDREW WATERMAN AND DAVID PATTERSON

ルーフラインモデル

2014年4月24日 CMSI計算科学技術 特論B 

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 31: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

31

ベースとなる性能値

メモリ

チップ

共用L2キャッシュ 6MB12WAY

 コア            

L1キャッシュ32K2WAY

SIMD演算器 times8コア

 BF比=05(実効値036)

BF比=4(理論値)

 BF比=2(理論値)

レイテンシ(相対値)

10

100

16GFLOPS

バンド幅(BF比)

2014年4月24日 CMSI計算科学技術 特論B 

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 32: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

32

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

メモリロード1ストア1

メモリロード1

$L1ロード2

$L1ロード1

メモリとキャッシュアクセス(1)

2014年4月24日 CMSI計算科学技術 特論B 

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 33: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

33

reg

mem

$L

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

データ移動時間の比を見るとメモリで律速される rarr メモリアクセス変数のみで考慮すれば良い

Store Load バンド幅比($L1)

データ移動時間の比(L1)

バンド幅比($L2)

データ移動時間の比(L2)

$L 1 5 111

(864Gs)

05= 6111 56

(256Gs)

11=656

M 1 2 1(46Gs) 3=31 1

(46Gs)

3=31

メモリとキャッシュアクセス(2)

2014年4月24日 CMSI計算科学技術 特論B 

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 34: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

34

do J = 1 NY do I = 1 NX do K = 3 NZ-1 DZV (kIJ) = (V(kIJ) -V(k-1IJ))R40 amp - (V(k+1IJ)-V(k-2IJ))R41 end do end do end do

n 最内軸(K軸)が差分

n 1ストリームでその他の3配列列は$L1に載っており再利利用できる

要求flop

add 3 mult 2 = 5

要求BF 125 = 24

性能予測 03624 = 015

実測値 0153

要求Byteの算出

1store2loadと考える

4x3 = 12byte

性能見積り

2014年4月24日 CMSI計算科学技術 特論B 

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 35: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

35

具体的テクニック

(以降のハードウェアコンパイラについての 話題は京を前提とした話です)

2014年4月24日 CMSI計算科学技術 特論B 

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 36: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

36

スレッド並列化

do i=1nx(i j) = a(i j)b(i j)+ c(i j)

do j=1n

j

i jループをブロック分割

Tiスレッドiの計算担当

T0 T1 T2 T3 T4 T5 T7T6

2014年4月24日 CMSI計算科学技術 特論B 

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 37: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

37

CG法前処理のスレッド並列化以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである 前処理には色々な方法を使うことが出来る 例えば前回説明したガウスザイデル法等である CG法の本体である行列ベクトル積内積ベクトルの和等の処理は簡単に前頁のブロック分割されたスレッド並列化を烏滸なことが出来る しかしガウスザイデル前処理は前回講義のようにリカレンスがある1ICCG法のアルゴリズム

ステップ1    αk = (rik bull(LLT )minus1ri

k )(Apik bull pi

k )

ステップ2     xik+ 1 = xi

k +αk pik

ステップ3     rik+ 1 = ri

k minus αkApik

ステップ4     β k = (rik+1 bull(LLT ) minus1ri

k+1 ) (rikbull(LLT ) minus1ri

k )

ステップ5     pik+ 1 = (LLT )minus1 ri

k+1 + β k pik

2014年4月24日 CMSI計算科学技術 特論B 

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 38: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

38

リカレンスがあると 前回講義のように依存関係があり並列処理ができない つまりこのままではスレッド並列化もできない

CG法前処理のスレッド並列化

do j=1n黄色ループをブロック分割RED-BLACKスイープ

そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞれのループをブロック分割によるスレッド並列化を行う

do j=1n青色ループをブロック分割

2014年4月24日 CMSI計算科学技術 特論B 

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 39: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

39

ロードストアの効率化

演算とロードストア比の改善 lt 内側ループアンローリングgt

bull 以下の様な2 つのコーディングを比較する

do j=1m do i=1n x(i)=x(i)+a(i)b+a(i+1)d end do do j=1m do i=1n2 x(i)=x(i)+a(i)b+a(i+1)d x(i+1)=x(i+1)+a(i+1)b+a(i+2)d end do

bull 最初のコーディングの演算量は4 ロードストア回数は4 である2 つ目のコ ーディン グの演算量は8 ロードストア回数は7 である

bull 最初のコーディングの演算とロード ストアの比は442つ目のコーディングの演算とロードストアの比は87となり良くなる

2014年4月24日 CMSI計算科学技術 特論B 

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 40: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

40

ロードストアの効率化

演算とロードストア比の改善

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

2014年4月24日 CMSI計算科学技術 特論B 

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 41: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

41

ltアウトオブオーダー実行gt各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行ったあとこれを効率よく実行するためには演算器を複数もったプロセッサを用意し動的に順序を入れ換えて命令を実行する必要があるこれをアウトオブオーダー実行という

lt外側ループストリップマイニングgti j 型のコーディングを以下のようなものとするdo i=1ndo j=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)x(j)の2個をロードして2個の演算を実施するy(i)はレジスタ上に保持しておけばよいしたがって演算とロードストアの比は11であるj i 型のコーディングを以下のようなものとするdo j=1ndo i=1my(i)=y(i)+a(ij)x(j)

この場合a(ij)y(j)の2個をロードしさらにy(j)をストアし2個の演算を実施するしたがって演算とロードストアの比は23である以下のようなコーディングを外側ループストリップマイニングというdo is=1m10do j=1ndo i=ismin(is+9m)y(i)=y(i)+a(ij)x(j)

このコーディングの最内ループをアンローリングするdo is=1m10do j=1ny(is)=y(is)+a(isj)x(j)y(is+1)=y(is+1)+a(is+1j)x(j)     y(is+9)=y(is+9)+a(is+9j)x(j)

この場合a(isj)a(is+9j)の10個とx(j)の1個をロードするのみですむy(js)y(is+9)はレジスタ上に保持しておけばよいこの間20個の演算を実行するしたがって演算とロードストアの比は2011である

ロードストアの効率化

演算とロードストア比の改善

2014年4月24日 CMSI計算科学技術 特論B 

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 42: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

42

ロードストアの効率化

プリフェッチの有効利用

プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列について自動的に機能する ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入する ユーザーがコンパイラオプションやディレクティブで挿入する事もできる ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超えると効かなくなる その場合はアクセスする配列を統合する配列マージで良い効果が得られる場合がある

do i=1n

x(i) = a(i)b(i)+ c(i) x(i) = abc(1i)abc(2i)+ abc(3i)

do i=1n

2014年4月24日 CMSI計算科学技術 特論B 

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 43: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

43

Cache

改善前 001 4262 213E+08 9724 276 000 667 334E+07 3496 6504 1447 7780

改善後 001 2437 219E+08 3755 569 5676 582 524E+07 014 9986 3232 12086

L1D ミス数L1D ミス dm率(L1D ミス数)

L1D ミス hwpf 率(L1D ミス数)

L1D ミス率(ロードストア命令数)

L1I ミス率(有効総命令数)

L1D ミス swpf 率(L1D ミス数)

L2 ミス数L2 ミス dm 率(L2 ミス数)

L2 ミス pf 率(L2 ミス数)

L2 ミス率(ロードストア命令数)

メモリスループット(GBsec)

L2 スループット(GBsec)

110

改善後ソース(最適化制御行チューニング) 51 ocl prefetch ltltlt Loop-information Start gtgtgt ltltlt [PARALLELIZATION] ltltlt Standard iteration count 616 ltltlt [OPTIMIZATION] ltltlt SIMD ltltlt SOFTWARE PIPELINING ltltlt PREFETCH 32 ltltlt c 16 b 16 ltltlt Loop-information End gtgtgt 52 1 pp 2v do i = 1 n 53 1 p 2v a(i) = b(d(i)) + scalar c(e(i)) 54 1 p 2v enddo

prefetch指示子を指定することでインダイレクトアクセス(リストアクセス)に対してプリフェッチを生成しますその結果データアクセス待ちコストが改善されました

インダイレクトアクセスプリフェッチの効果 (最適化制御行チューニング)

浮動小数点ロードキャッシュアクセス待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善前

[秒]

浮動小数点ロードキャッシュアクセス

待ち

00E+00

50E-02

10E-01

15E-01

20E-01

25E-01

30E-01

35E-01

40E-01

改善後

[秒]

151倍の効果

インダイレクトアクセス(配列b c)に対してプリフェッチ命令を生成することでL1Dミスdm率L2ミスdm率が減った

インダイレクトアクセス(配列b c)に対するプリフェッチが生成された

Copyright 2012 RIKEN AICS

ロードストアの効率化

プリフェッチの有効利用

ユーザーがコンパイラオプションやディレクティブで挿入する事もできる 以下ディレクティブによるソフトウェアプリフェッチ生成の例

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 44: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

44

ラインアクセスの有効利用

リストアクセスでxyzuvwの座標をアクセスするような場合配列マージによりキャッシュラインのアクセス効率を高められる場合がある

103

配列マージとは

配列マージとは同一ループ内でアクセスパターンが共通の配列が複数ある場合1個の配列に融合することですデータアクセスを連続化してキャッシュ効率を向上させます

改善前ソース 改善後(コンパイラ最適化イメージ) parameter(n=1000000) real8 a(n) b(n) c(n) integer d(n+10) do iter = 1 100 do i = 1 n a(d(i)) = b(d(i)) + scalar c(d(i)) enddo enddo

parameter(n=1000000) real8 abc(3 n) integer d(n+10) do iter = 1 100 do i = 1 n ii = d(i) abc(1ii) = abc(2ii) + scalar abc(3ii) enddo enddo

abc( 1 d(i))

abc( 2 d(i))

abc( 3 d(i))

abc( 1 d(i+1))

abc( 2 d(i+1))

abc( 3 d(i+1))

b( d(i))

c( d(i+1))

a( d(i))

a( d(i+1))

b( d(i+1))

c( d(i))

配列マージ

異なるキャッシュラインのアクセス

同じキャッシュラインのアクセス

(L1Dキャッシュ)

(L1Dキャッシュ)

キャッシュへのアクセス順番

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 45: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

45

ラインアクセスの有効利用

ストライドアクセス配列を連続アクセス化することによりラインアクセスの有効利用を図る

97

ループ交換のチューニング内容

改善前ソース do j=1n1 do i=1n2 a(i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(i) (s2 + s1 a(i-1)) enddo enddo

① 配列aを2次元配列にする

do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

② ループ1とループ2を分割する do j=1n1 do i=1n2 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do j=1n1 do i=2n2 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

ループ1

ループ2

③ ループを交換する do i=1n2 do j=1n1 a(j i) = s1 + c(ji) (s1 + s2 d(ji)) enddo enddo do i=2n2 do j=1n1 b(ji) = a(j i) (s2 + s1 a(ji-1)) enddo enddo

配列bcd はストライドアクセスなのでキャッシュ効率が悪い

配列bcd が連続アクセスになりキャッシュ効率が改善される

ループ分割の阻害要因である配列aの依存がなくなる

Copyright 2012 RIKEN AICS 2014年4月24日 CMSI計算科学技術 特論B 

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 46: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

46

キャッシュの有効利用

ブロッキング

BF値 =移動量(Byte)演算量(Flop) =2N22N3

=1N

times=

行列行列積の計算

2N3個の演算 N2個のデータ N2個のデータ原理的にはNが大きい程小さな値

現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)はキャッシュに乗っても(b)は乗らない事となる

(a) (b)

times=

(a) (b)

そこで行列を小行列にブロック分割し(a)も(b)もキャッシュに乗るようにしてキャッシュ上のデータだけで計算するようにする事で性能向上を実現する

2014年4月24日 CMSI計算科学技術 特論B 

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 47: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

47

N

N

N2

(1)

(2)

(3)

キャッシュの有効利用

ブロッキング

不連続データの並び替えによるブロッキング (1)N個の不連続データをブロッキングしながら連続領域にコピー (2)N個のデータを使用してN2

回の計算を実施 (3)N個の計算結果を不連続領域にコピー 一般的に(1)(3)のコピーはNのオーダーの処理であるためN2オーダーの計算時間に比べ処理時間は小さい

2014年4月24日 CMSI計算科学技術 特論B 

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 48: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

48

キャッシュの有効利用

スラッシング

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

1way 2way

L1Dキャッシュ128バイトtimes128エントリtimes2way=32Kバイト

24

キャッシュスラッシングとは

ソース例 subroutine sub(a n m) n=256 m=256 real8 a(n m 4) do j = 1 m do i = 1 n a(i j 4) = a(i j 1) + a(i j 2) + a(i j 3) enddo enddo End

キャッシュスラッシングとはキャッシュ上の特定のインデックス(キャッシュ上の位置情報)のデータだけが頻繁に上書きされる現象のことですこの現象は配列サイズが2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなります 注ストリームとはループの回転に伴って参照定義される一連のデータのことです

今回の例の場合a(111)a(112)a(113)a(114)はそれぞれ32times16KBずつ離れている(16KB境界にある)ため4つが同じインデックスに割り当てられるそのため1つ目2つ目のデータが3つ目4つ目のデータに上書きされる

キャッシュへの格納

キャッシュへの格納(競合)

実行順序①~④

(L1Dキャッシュ) (メモリ上のデータ配置) a( 1 1 1)

a ( 16 1 1)

a( 1 1 2)

a ( 16 1 2)

a( 1 1 3)

a ( 16 1 3)

a( 1 1 4)

a ( 16 1 4)

実行順序

1WAY

128エントリ

2WAY

L1Dキャッシュスラッシングの目安 L1D ミス率

(ロードストア数) L1D ミス dm率 (L1D ミス数)

単精度 3125以上 倍精度 6250以上

20以上

単精度132(32回に1回ミスをする) 倍精度116(16回に1回ミスをする)

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

メモリアクセス時にキャッシュの追い出しが発生(スラッシング)

32times16KBのアドレス差

2014年4月24日 CMSI計算科学技術 特論B 

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 49: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

49

キャッシュの有効利用

スラッシングの除去(配列マージ)

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS 28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

28

配列マージとは

改善前ソース例 parameter(n=256m=256) real8 a(n m)b(nm)c(nm)d(nm) common comabcd do j = 1 m do i = 1 n a(i j) = b(i j) + c(i j) + d(i j) enddo enddo

配列マージとは複数の配列を1つの配列とするチューニングです 使用条件

配列の要素数が同じである

a( 1 1)

a( 2 1)

a(256 256)

b( 1 1)

b( 2 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

b(256 256)

c( 1 1)

c( 2 1)

c(256 256)

d( 1 1)

d( 2 1)

d(256 256)

改善後ソース例 parameter(n=256m=256) real8 abcd(4 n m) common comabcd do j = 1 m do i = 1 n abcd(1i j) = abcd(2i j) + abcd(3i j) + abcdd(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

abcd(1 1 1)

abcd(2 1 1)

abcd(1256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

abcd(3 1 1)

abcd(4 1 1)

abcd(2256 1)

abcd(3256 1)

abcd(4256 1)

abcd(1 1 2)

abcd(2 1 2)

abcd(3 1 2)

abcd(4 1 2)

abcd(1 2 1)

abcd(4256256)

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 50: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

50

キャッシュの有効利用

スラッシングの除去(配列インデックス交換)

33

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

配列次元移動とは

ソース例

parameter(n=256m=256) real8 a(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

配列次元移動とは同一配列で複数のストリームを持つ配列を1つのストリームにするチューニングです

ソース例

parameter(n=256m=256) real8 a(4 n m) common coma do j = 1 m do i = 1 n a(1i j) = a(2i j) + a(3i j) + a(4i j) enddo enddo

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在する

狙い ストリーム数削減

副作用 ロードストア命令のSIMD化が難しくなる

a(1 1 1)

a(2 1 1)

a(1 256 1)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(3 1 1)

a(4 1 1)

a(2 256 1)

a(3 256 1)

a(4 256 1)

a(1 1 2)

a(2 1 2)

a(3 1 2)

a(4 1 2)

a(1 2 1)

a(4 256 256)

4つとも同一キャッシュライン上のためデータを有効利用できる

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

Copyright 2012 RIKEN AICS

RIKEN AICSチューニングチュートリアルより

2014年4月24日 CMSI計算科学技術 特論B 

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 51: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

51

キャッシュの有効利用

スラッシングの除去(ループ分割)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内でアクセスされる配列数が多いとスラッシングが起きやすい ループ分割する事でそれぞれのループ内の配列数を削減する事が可能となる 配列数が削減されることによりスラッシングの発生を抑えられる場合がある

2014年4月24日 CMSI計算科学技術 特論B 

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 52: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

52

キャッシュの有効利用

スラッシングの除去(パディング)

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

L1Dキャッシュへの配列の配置の状況を変更する事でスラッシングの解消を目指す そのためにcommon配列の宣言部にダミーの配列を配置することでスラッシングが解消する場合がある また配列宣言時にダミー領域を設けることでスラッシングが解消する場合がある

42

キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番

パディングとは

改善前ソース例

parameter(n=256m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

パディングとは配列間や配列の中にダミーの領域を挿入することです

改善前 改善後

L1Dキャッシュスラッシング発生

a( 1 1 1)

a( 2 1 1)

a(256 256 1)

a( 1 1 2)

a( 2 1 2)

(L1Dキャッシュ) (メモリ上のデータ配置)

a(256 256 2)

a( 1 1 3)

a( 2 1 3)

a(256 256 3)

a( 1 1 4)

a( 2 1 4)

a(256 256 4)

使用条件 同一配列で複数のストリームが存在している

もしくは

複数の配列が存在している

狙い テンポラリ領域を作りアドレスをずらす

副作用 問題規模変更ごとにパディング量の変更が必要

(L1Dキャッシュ) a( 1 1 1)

a( 2 1 1)

a(256 1 1)

a( 1 1 2)

a( 2 1 2)

(メモリ上のデータ配置)

a(257 256 1) 改善後ソース例

parameter(n=257m=256) real8 a(nm4)b(nm4)c(nm4)d(nm4) common coma do j = 1 m do i = 1 n a(i j 1) = a(i j 2) + a(i j 3) + a(i j 4) enddo enddo

同一配列で複数のストリームが存在している例

格納場所がずれたことでL1Dキャッシュスラッシングは発生せず

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

256times256times8B =32times16KB 離れたアクセス

a(257 1 1)

a(256 256 1)

パディングを行うことでキャッシュに格納される場所をずらす

Copyright 2012 RIKEN AICS

2014年4月24日 CMSI計算科学技術 特論B 

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 53: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

53

キャッシュの有効利用

リオーダリング

メモリ

データ

2次キャッシュ

1次キャッシュ

データ

データ

1要素 8byte毎の アクセス

キャッシュライン 128byte毎の

アクセス

メモリと2次キャッシュはキャッシュライン128バイト単位のアクセスとなる 1次キャッシュは1要素8バイト単位のアクセスとなる 以下のような疎行列とベクトルの積があるときベクトルはとびとびにアクセスされる このベクトルがメモリや2次キャッシュにある場合アクセス効率が非常に悪化する 1次キャッシュは1要素毎にアクセスされるためこの悪化が亡くなる ベクトルを1次キャッシュへ置くための並び替えが有効になる

do i=1n

do j=1l(i)k = k +1buf = buf + a(k)v(L(k))

x(i) = buf

buf = 0

2014年4月24日 CMSI計算科学技術 特論B 

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 54: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

54

効率の良いスケジューリング演算器の有効利用

カラーリング

ソフトウェアパイプラインニングやsimd等のスケジューリングはループに対して行われる ループのインデックスについて依存関係があるとソフトウェアパイプラインニングやsimd化はできなくなる 例えばガウスザイデル法の処理等がその例である その場合は「CG法前処理のスレッド並列化」で説明したred-blackスィープへの書換えで依存関係を除去することが効果的である red-blackは2色のカラーリングであるが2色以上のカラーリングも同様な効果がある

2014年4月24日 CMSI計算科学技術 特論B 

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 55: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

55

IF文の除去

IF文も-Ksimd=2オプションやocl simdディレクティブを使う事でsimd化やソフトウェアパイプラインニングを行うことが出来る しかしIF文が複雑になった場合は以下のような方法でのIF文の除去が有効な場合がある

「コーディング」

lt変更前gt

IF(体系内部の場合) THEN    速度の配列 UL の7点差分式IF(外部境界の場合) THEN    ULと速度境界条件の配列 VELBN の混合式

MIM

UL

VELBN

5 -1 -999

5 1

イレギュラー

  UL XVELBN

lt変更後gt

MIM 5 -1

イレギュラー

0

10-1 5ULD

=0

0=

ダミー領域

        

内点と縁の点で参照点の数が違うため計算式が違うそのため内点と縁の点を区別するIF文が存在する

計算領域の外側にダミー領域を設定しその中に0を格納するこうすることにより内点と縁の点が同じ式となりIF文は必要でなくなる

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 56: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

56

インデックス計算の除去

例えば粒子を使ったPIC法のアプリケーションの場合粒子がどのメッシュに存在するかをインデックスで計算するような処理が頻発する このような複雑なインデックス計算を使用しているとソフトウェアパイプラインニングやsimd化等のスケジューリングがうまく行かない場合がある このような場合には以下のような方法でのインデックス計算の除去が有効な場合がある

1 粒子が隣のメッシュに動く可能性がある

2 そのため全ての粒子についてどのメッシュにいるかのインデックス計算がある

3 しかし隣のメッシュに動く粒子は少数

4 まず全粒子は元のメッシュに留まるとしてインデックス計算を除去して計算する

5 その後隣のメッシュに移動した粒子についてだけ再計算する

do i=1N

インデックスなしの計算

do i=1移動した粒子数

インデックスありの計算

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 57: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

57

ループ分割

26

チューニングアプローチについて(基礎編)

do i=1n do i=1n hellip = a(i) + b(i) hellip = z(1i) + z(2i) enddo enddo

ストリーム数を削減することでスラッシングのリスクそのものを改善する解決型のアプローチ

長所パラメタ変更等問題規模の変化にも 順応できる

do i=1n do i=1n hellip = a(I1) + a(I2) hellip = a(1i) + a(2i) enddo enddo

do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) hellip = c(i) + d(i) enddo enddo do i=1n hellip = c(i) + d(i) enddo

common a(n)b(n) common a(n)p(64)b(n) do i=1n do i=1n hellip = a(i) + b(i) hellip = a(i) + b(i) enddo enddo

パディングを行うことで配列のアドレスを ずらして改善する回避型のアプローチ

短所修正量が多いSIMD化が複雑 注意ループ分割は除く

長所修正量が少ないSIMD化が容易

短所パラメタ変更等問題規模が変化する 度に調整が必要になる

配列マージ

配列次元移動

ループ分割

パディング

Copyright 2012 RIKEN AICS

ループ内の処理が複雑すぎるとソフトウェアパイプラインニングやsimd化が効かない場合がある ループ分割する事でループ内の処理が簡略化されスケジューリングがうまくいくようになる場合がある

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 58: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

58

do i=1n

do j=110

ループ交換

ループの回転数が少ないとソフトウェアパイプラインニングが効かない場合がある ループ交換し長いループを 内にする事でソフトウェアパイプラインニングがうまくいくようになる場合がある

do j=110

do i=1n

効率の良いスケジューリング演算器の有効利用

2014年4月24日 CMSI計算科学技術 特論B 

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 59: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

59

do i=1n

関数サブルーチン展開

ループ内に関数やサブルーチン呼出しがあるとスケジューリングが進まない その場合はコンパイラオプションにより関数やサブルーチンをループ内に展開する ハンドチューニングで展開した方がうまく行く場合もある

do i=1n

効率の良いスケジューリング演算器の有効利用

call subroutines

2014年4月24日 CMSI計算科学技術 特論B 

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B 

Page 60: CMSI計算科学技術特論B(3) アプリケーションの性能最適化2

まとめ

bull スレッド並列化 bull CPU単体性能を上げるための5つの要素 bull 要求BF値と5つの要素の関係 bull 性能予測手法(要求BF値が高い場合) bull 具体的テクニック

602014年4月24日 CMSI計算科学技術 特論B