Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
RIKEN	
  ADVANCED	
  INSTITUTE	
  FOR	
  COMPUTATIONAL	
  SCIENCE
2014年4月24日



独立行政法人理化学研究所

計算科学研究機構�運用技術部門

ソフトウェア技術チーム�チームヘッド



南�一生

minami_kaz@riken.jp
CMSI計算科学技術特論B
第3回  
アプリケーションの性能最適化2  
(CPU単体性能最適化)
講義の概要
• スーパーコンピュータとアプリケーションの性能  
• アプリケーションの性能最適化1(高並列性能最適化)  
• アプリケーションの性能最適化2(CPU単体性能最適化)  
• アプリケーションの性能最適化の実例1  
• アプリケーションの性能最適化の実例2
22014年4月24日 CMSI計算科学技術特論B 
内容
!
• スレッド並列化  
• CPU単体性能を上げるための5つの要素  
• 要求B/F値と5つの要素の関係  
• 性能予測手法(要求B/F値が高い場合)  
• 具体的テクニック
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内:スレッド並列(自動並列化:細粒度並列化†
,OpenMP)
CPU間:プロセス並列(MPI、XPFortran)
CPU
†細粒度並列化
高速バリア同期を活用し,内側ループをコア間で並列化
ベクトル向け(内側ループが長い)コードの高速化が可能
core core core core
core core core core
メモリ
コア内:逐次最適化、SIMD
化(主にコンパイラ)
CPU
メモリ
CPU内:スレッド並列(細粒度並列、
OpenMP)(コンパイラによるサポートあり)
CPU
メモリ
CPU
メモリ
CPU間:プロセス並列(MPI
およびXPFortran)
プロセス並列型
コア内:コンパイラによる逐次最適化,SIMD化
コア間:プロセス並列(MPI、XPFortran)
CPU
core 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
1
2014年4月24日 CMSI計算科学技術特論B 
12
レイテンシ(アクセスの立ち上がり)
演算器
メモリ
データ
2次キャッシュ
1次キャッシュ
データ
データ
立ち上がり
アクセス
立ち上がり
アクセス
時間
2014年4月24日 CMSI計算科学技術特論B 
13
プリフェッチの有効利用
演算器
メモリ
データ
2次キャッシュ
1次キャッシュ
データ
データ
立ち上がり
アクセス
プリフェッチ
アクセス
時間
演算にアクセスそのものを
隠せる場合もある
2014年4月24日 CMSI計算科学技術特論B 
14
<内側ループアンローリング(2)>
・以下の様な2つのコーディングを比較する。
do j=1,m
do i=1,n
x(i)=x(i)+a(i)*b+a(i+1)*d
end do
do j=1,m
do i=1,n,2
演算とロード・ストア比の改善
以下のコーディングを例に考える.
以下のコーディングの演算は和2個,積2個の計4個.
ロードの数はx,a(i),a(i+1)の計3個.
ストアの数はxの1個.
したがってロード・ストア数は4個
演算とロード・ストアの比は4/4となる.
なるべく演算の比率を高めロード・ストアの比率を低く抑えて演算とロード
ストアの比を改善を図る事が重要.
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=1,100
 計算1
 計算2
end do
計算時間 計算時間
効率が良い
効率が悪い
(4)効率の良い命令スケジューリング
2014年4月24日 CMSI計算科学技術特論B 
18
並列処理と依存性の回避
< ソフトウェアパイプラインニング>
例えば以下の処理をを考える。
 do i=1,100
  a(i)のロード
  b(i)のロード
  a(i)とb(i)の演算
  i番目の結果のストア
 end do
コンパイラ
<前提>  
・ロード2つorストアと演算とは同時実行可能  
・ロードとストアは2クロックで実行可能  
・演算は4クロックで実行可能  
・ロードと演算とストアはパイプライン化されている
(1) (2)
<実行時間>  
・8クロック×100要素=800クロックかかる
2014年4月24日 CMSI計算科学技術特論B 
19
並列処理と依存性の回避
< ソフトウェアパイプラインニング>
左の処理を以下のように構成し直す事を
ソフトウェアパイプラインニングという
a(1)a(2)a(3)のロード
b(1)b(2)のロード
(1)の演算
do i=3,100
  a(i+1)のロード
  b(i)のロード
  (i-1)の演算
i-2番目の結果のストア
end do
b(100)のロード
(99)(100)の演算
(98)(99)(100)のストア
<ソフトウェアパイプラインニング>
例えば以下のコーディングを考える。
do i=1,100
a(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=3,100
c(i-2)=c(i-3)+b(i-2)
b(i-1)=b(i-2)+a(i-1)
a(i)=a(i-1)+a(i)
<ソフトウェアパイプラインニング>
例えば以下のコーディングを考える。
do i=1,100
a(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=3,100
c(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)
<ソフトウェアパイプラインニング>
例えば以下のコーディングを考える。
do i=1,100
a(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=3,100
c(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)
<ソフトウェアパイプラインニング>
例えば以下のコーディングを考える。
do i=1,100
a(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=3,100
c(i-2)=c(i-3)+b(i-2)
b(i-1)=b(i-2)+a(i-1)
a(i)=a(i-1)+a(i)
<ソフトウェアパイプラインニング>
例えば以下のコーディングを考える。
do i=1,100
a(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=3,100
c(i-2)=c(i-3)+b(i-2)
b(i-1)=b(i-2)+a(i-1)
a(i)=a(i-1)+a(i)
<ソフトウェアパイプラインニング>
例えば以下のコーディングを考える。
do i=1,100
a(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=3,100
c(i-2)=c(i-3)+b(i-2)
b(i-1)=b(i-2)+a(i-1)
a(i)=a(i-1)+a(i)
aロード
bロード
演算
ストア
(1)     (2)         (3)    (4)・・・・  ・・・・     (99)          (100)
コンパイラ
2014年4月24日 CMSI計算科学技術特論B 
20
並列処理と依存性の回避
< ソフトウェアパイプラインニング>
 
do i=1,100
  a(i)のロード
  b(i)のロード
  a(i)とb(i)の演算
  i番目の結果のストア
end do
コンパイラ
(1) (2)
 
do i=1,100
  a(i)のロード
 
  b(i)のロード
 
  a(i)とb(i)の演算
 
  i番目の結果のストア
!
end do
(1) (2)
2014年4月24日 CMSI計算科学技術特論B 
21
並列処理と依存性の回避
< ソフトウェアパイプラインニング>
左の処理を以下のように構成し直す事を
ソフトウェアパイプラインニングという
a(1)a(2)a(3)のロード
b(1)b(2)のロード
(1)の演算
do i=3,100
  a(i+1)のロード
  b(i)のロード
  (i-1)の演算
i-2番目の結果のストア
end do
b(100)のロード
(99)(100)の演算
(98)(99)(100)のストア !
<実行時間>  
・前後の処理及びメインループの立ち上がり部分を除くと  
・1クロック×100要素=100クロックで処理できる  
(3)(1) (2) (4)(5)(6)(7)(8)
2014年4月24日 CMSI計算科学技術特論B 
22
乗算と加算を4個同時に計算可能
( 1  +  1 ) × 4 = 8
1コアのピーク性能:8演算×2GHz =16G演算/秒
この条件に
近い程高効率
(5)演算器の有効利用
2SIMD Multi&Add演算器×2本
2014年4月24日 CMSI計算科学技術特論B 
23
要求B/F値と5つの要素の関係
2014年4月24日 CMSI計算科学技術特論B 
24
要求B/F値と5つの要素の関係
アプリケーションの要求B/F値の大小によって性
能チューニングにおいて注目すべき項目が異なる
B/F値
=移動量(Byte)/演算量(Flop)
=2N2/2N3
=1/N
×=
行列行列積の計算(要求B/F値が小さい)
2N3個の演算 N2個のデータ N2個のデータ
原理的にはNが大きい程小さな値
(a) (b)
B/F値
=移動量(Byte)/演算量(Flop)
=(N2+N)/2N2
≒1/2
行列ベクトル積の計算(要求B/F値が大きい)
2N2個の演算 N2個のデータ N個のデータ 原理的には1/Nより大きな値
×=
(a) (b)
2014年4月24日 CMSI計算科学技術特論B 
25
原理的にキャッシュの有
効利用が可能
まずデータをオンキャッ
シュにするコーディング:(3)
が重要
つぎに2次キャッシュのラ
イン上のデータを有効に
利用するコーディング:(2)
が重要
それが実現できた上で
(4)(5)が重要
要求B/F値と5つの要素の関係
要求するB/Fが小さいアプリケーションについて
128byte
1
128byte
128byte
1
128byte
< ソフトウェアパイプラインニング>
左の処理を以下のように構成し直す事を
ソフトウェアパイプラインニングという
a(1)a(2)a(3)のロード
b(1)b(2)のロード
(1)の演算
do i=3,100
  a(i+1)のロード
  b(i)のロード
  (i-1)の演算
i-2番目の結果のストア
end do
b(100)のロード
(99)(100)の演算
(98)(99)(100)のストア !
(3)(1) (2) (4)(5)(6)(7)(8)
( 1 + 1 ) × = 8
1 8 ×2GHz =16G /
2SIMD Multi&Add演算器×2本
2014年4月24日 CMSI計算科学技術特論B 
26
・メモリバンド幅を使い切る
事が大事
要求するB/Fが大きいアプリケーションについて
要求B/F値と5つの要素の関係
演算とロード・ストア比の改善
レイテンシーが隠れた状態にする事.この状態でメモリ
バンド幅のピーク(京の場合の理論値は64GB/sec)が
出せる.レイテンシーが見えているとメモリバンド幅の
ピーク値は出せない.
2014年4月24日 CMSI計算科学技術特論B 
27
一番重要なのは(1)(2)
次にできるだけオン
キャッシュする(3)が重要
これら(1)(2)(3)が満たされ
計算に必要なデータが演
算器に供給された状態
で、それらのデータを十
分使える程度に(4)のス
ケジューリングができて、
さらに(5)の演算器が有
効に活用できる状態であ
る事が必要
要求B/F値と5つの要素の関係
要求するB/Fが大きいアプリケーションについて
128byte
128byte
1
128b
< ソフトウェアパイプラインニング>
例えば以下の処理をを考える。
 do i=1,100
  a(i)のロード
  b(i)のロード
  a(i)とb(i)の演算
  i番目の結果のストア
 end do
(1) (2)
< ソフトウェアパイプラインニング>
左の処理を以下のように構成し直す事を
ソフトウェアパイプラインニングという
a(1)a(2)a(3)のロード
b(1)b(2)のロード
(1)の演算
do i=3,100
  a(i+1)のロード
  b(i)のロード
  (i-1)の演算
i-2番目の結果のストア
end do
b(100)のロード
(99)(100)の演算
(98)(99)(100)のストア !
(3)(1) (2) (4)(5)(6)(7)(8)
( 1 + 1 ) × = 8
1 8 ×2GHz =16G /
2SIMD Multi&Add演算器×2本
128byte
1
128byte
128byte
1
128byte
2014年4月24日 CMSI計算科学技術特論B 
28
性能予測手法  
(要求B/F値が大きい場合)
2014年4月24日 CMSI計算科学技術特論B 
29
オリジナル
性能
AICS サマースクール 2012
CONFIDENTIAL 14
usion
n
L2$ )
L2$ L2$
L2$
(3)性能推定(要求B/Fが高いアプリについて)
(1)プロファイラーを使った測定
(2)プロファイラー測定結果を
 使った問題の発見
(4)性能チューニング
(6)更なる性能チューニング
(5)改良コーディングの性能予測
(要求B/Fが高いアプリについて)
性能
高
低
オリジナル
コーディング
の予測性能
改良
コーディング
の予測性能
CPU単体性能チューニング手順
2014年4月24日 CMSI計算科学技術特論B 
30
アプリケーションのOperational Intensity(Flop/Byte) B/F値の逆数
ハードウェア
のピーク性能
ハードウェアの
ピークF/Bの値
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 Moore’s Law will permit
the doubling of the number of cores
per chip every two years.4
While di-
versity may be understandable in this
time of uncertainty, it exacerbates the
Roofline:
An Insightful
Visual
Performance
Model for
Multicore
Architectures
DOI:10.1145/1498765.1498785
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キャッシュ 6MB/12WAY
 コア            
L1キャッシュ32K/2WAY
SIMD演算器 ×8コア
 BF比=0.5(実効値:0.36)
BF比=4(理論値)
 BF比=2(理論値)
レイテンシ(相対値)
10
100
1
16GFLOPS
バンド幅(BF比)
2014年4月24日 CMSI計算科学技術特論B 
32
do J = 1, NY
do I = 1, NX
do K = 3, NZ-1
DZV (k,I,J) = (V(k,I,J) -V(k-1,I,J))*R40 &
- (V(k+1,I,J)-V(k-2,I,J))*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 (k,I,J) = (V(k,I,J) -V(k-1,I,J))*R40 &
- (V(k+1,I,J)-V(k-2,I,J))*R41
end do
end do
end do
データ移動時間の比を見るとメモリで律速される
→ メモリアクセス変数のみで考慮すれば良い。
Store Load バンド幅⽐比
($L1)
データ移動時間の
⽐比(L1)
バンド幅⽐比
($L2)
データ移動時間の
⽐比(L2)
$L 1 5 11.1  
(8*64G/s)
0.5=  6/11.1 5.6  
(256G/s)
1.1=6/5.6
M 1 2 1(46G/s) 3=3/1 1  
(46G/s)
3=3/1
メモリとキャッシュアクセス(2)
2014年4月24日 CMSI計算科学技術特論B 
34
do J = 1, NY
do I = 1, NX
do K = 3, NZ-1
DZV (k,I,J) = (V(k,I,J) -V(k-1,I,J))*R40 &
- (V(k+1,I,J)-V(k-2,I,J))*R41
end do
end do
end do
n 最内軸(K軸)が差分
n 1ストリームでその他の3配列列は$L1に載っ
ており再利利⽤用できる。
要求flop:
add  :  3  mult  :  2  =  5
要求B/F 12/5  =  2.4
性能予測 0.36/2.4  =  0.15
実測値 0.153
要求Byteの算出:
1store,2loadと考える
4x3 = 12byte
性能見積り
2014年4月24日 CMSI計算科学技術特論B 
35
具体的テクニック  
!
(以降のハードウェア・コンパイラについての  
話題は京を前提とした話です)
2014年4月24日 CMSI計算科学技術特論B 
36
スレッド並列化
do i=1,n
x(i, j) = a(i, j)*b(i, j)+ c(i, j)
do j=1,n
j
i jループをブロック分割
Ti:スレッドiの計算担当
T0 T1 T2 T3 T4 T5 T7T6
2014年4月24日 CMSI計算科学技術特論B 
37
CG法前処理のスレッド並列化
以下は前処理に不完全コレスキー分解を用いたCG法のアルゴリズムである.  
前処理には色々な方法を使うことが出来る.  
例えば前回説明したガウス・ザイデル法等である.  
CG法の本体である行列ベクトル積・内積・ベクトルの和等の処理は簡単に前頁の
ブロック分割されたスレッド並列化を烏滸なことが出来る.  
しかしガウス・ザイデル前処理は前回講義のようにリカレンスがある.1.ICCG法のアルゴリズム
ステップ1:    αk
= (ri
k
•(LLT
)−1
ri
k
)/(Api
k
•pi
k
)
ステップ2:     xi
k+ 1
= xi
k
+α
k
pi
k
ステップ3:     ri
k+1
= ri
k
− αk
Api
k
ステップ4:     βk
= (ri
k+1
•(LLT
)−1
ri
k+1
)/(ri
k
•(LLT
)−1
ri
k
)
ステップ5:     pi
k+1
= (LL
T
)
−1
ri
k+1
+β
k
pi
k
2014年4月24日 CMSI計算科学技術特論B 
38
リカレンスがあると,  前回講義のように依存関係があり並列処理がで
きない.  
つまりこのままではスレッド並列化もできない.
CG法前処理のスレッド並列化
do j=1,n
黄色ループをブロック分割
RED-BLACKスイープ
そこで例えばRED-BLACKスィープに書換えリカレンスを除去しそれぞ
れのループをブロック分割によるスレッド並列化を行う.
do j=1,n
青色ループをブロック分割
2014年4月24日 CMSI計算科学技術特論B 
39
ロード・ストアの効率化
演算とロード・ストア比の改善 < 内側ループアンローリング>
• 以下の様な2 つのコーディングを比較する。
do j=1,m

do i=1,n
x(i)=x(i)+a(i)*b+a(i+1)*d
end do
do j=1,m do i=1,n,2
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
• 最初のコーディングの演算量は4 ,ロード/ストア回数は4 である.2 つ目の
コ ーディン グの演算量は8 ,ロード/ストア回数は7 である.
• 最初のコーディングの演算とロード/ ストアの比は4/4,2つ目のコーディン
グの演算とロード/ストアの比は8/7となり良くなる.
2014年4月24日 CMSI計算科学技術特論B 
40
ロード・ストアの効率化
演算とロード・ストア比の改善
<アウトオブオーダー実行>
・ 各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行っ
たあと、これを効率よく実行するためには、演算器を複数もったプロセッサを用意し動
的に順序を入れ換えて命令を実行する必要がある。
・ これをアウトオブオーダー実行という。
<外側ループストリップ・マイニング>
・i j 型のコーディングを以下のようなものとする。
do i=1,n
do j=1,m
y(i)=y(i)+a(i,j)*x(j)
・この場合a(i,j)、x(j)の2個をロードして2個の演算を実施する。y(i)はレジスタ上に保
持しておけばよい。
・したがって演算とロード/ストアの比は1/1である。
・j i 型のコーディングを以下のようなものとする。
do j=1,n
do i=1,m
y(i)=y(i)+a(i,j)*x(j)
・この場合a(i,j)、y(j)の2個をロードし、さらにy(j)をストアし2個の演算を実施する。
・したがって演算とロード/ストアの比は2/3である。
・以下のようなコーディングを外側ループストリップ・マイニングという。
・ 各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行っ
たあと、これを効率よく実行するためには、演算器を複数もったプロセッサを用意し動
的に順序を入れ換えて命令を実行する必要がある。
・ これをアウトオブオーダー実行という。
<外側ループストリップ・マイニング>
・i j 型のコーディングを以下のようなものとする。
do i=1,n
do j=1,m
y(i)=y(i)+a(i,j)*x(j)
・この場合a(i,j)、x(j)の2個をロードして2個の演算を実施する。y(i)はレジスタ上に保
持しておけばよい。
・したがって演算とロード/ストアの比は1/1である。
・j i 型のコーディングを以下のようなものとする。
do j=1,n
do i=1,m
y(i)=y(i)+a(i,j)*x(j)
・この場合a(i,j)、y(j)の2個をロードし、さらにy(j)をストアし2個の演算を実施する。
・したがって演算とロード/ストアの比は2/3である。
・以下のようなコーディングを外側ループストリップ・マイニングという。
do is=1,m,10
2014年4月24日 CMSI計算科学技術特論B 
41
do i=1,m
y(i)=y(i)+a(i,j)*x(j)
・この場合a(i,j)、y(j)の2個をロードし、さらにy(j)をストアし2個の演算を実施する。
・したがって演算とロード/ストアの比は2/3である。
・以下のようなコーディングを外側ループストリップ・マイニングという。
do is=1,m,10
do j=1,n
do i=is,min(is+9,m)
y(i)=y(i)+a(i,j)*x(j)
・このコーディングの最内ループをアンローリングする。
do is=1,m,10
do j=1,n
y(is)=y(is)+a(is,j)*x(j)
y(is+1)=y(is+1)+a(is+1,j)*x(j)
 ・・・・    ・・・・
y(is+9)=y(is+9)+a(is+9,j)*x(j)
・この場合a(is,j)・・a(is+9,j)の10 個とx(j)の1 個をロードするのみですむ。y(js)・・
y(is+9)はレジスタ上に保持しておけばよい。この間20個の演算を実行する。
・したがって演算とロード/ストアの比は20/11である。
ロード・ストアの効率化
演算とロード・ストア比の改善
2014年4月24日 CMSI計算科学技術特論B 
42
ロード・ストアの効率化
プリフェッチの有効利用
プリフェッチにはハードウェアプリフェッチとソフトウェアプリフェッチがある.  
ハードウェアプリフェッチは連続なキャッシュラインのアクセスとなる配列に
ついて自動的に機能する.  
ソフトウェアプリフェッチはコンパイラが必要であれば自動的に命令を挿入
する.  
ユーザーがコンパイラオプションやディレクティブで挿入する事もできる.  
ハードウェアプリフェッチはループ内の配列アクセス数が一定の数を超える
と効かなくなる.  
その場合はアクセスする配列を統合する配列マージで良い効果が得られ
る場合がある.
do i=1,n
x(i) = a(i)*b(i)+ c(i) x(i) = abc(1,i)*abc(2,i)+ abc(3,i)
・・・・・・
・・・・・・
do i=1,n
・・・・・・
・・・・・・
2014年4月24日 CMSI計算科学技術特論B 
43
Cache
改善前 0.01% 42.62% 2.13E+08 97.24% 2.76% 0.00% 6.67% 3.34E
改善後 0.01% 24.37% 2.19E+08 37.55% 5.69% 56.76% 5.82% 5.24E
L1D ミス数
L1D ミス dm率
(/L1D ミス数)
L1D ミス hwpf 率
(/L1D ミス数)
L1D ミス率
(/ロード・ストア命令数)
L1I ミス率
(/有効総命令数)
L1D ミス swpf 率
(/L1D ミス数)
L2 ミス
L2 ミス率
(/ロード・ストア命令数)
改善後ソース(最適化制御行チューニング)
51 !ocl prefetch
<<< Loop-information Start >>>
<<< [PARALLELIZATION]
<<< Standard iteration count: 616
<<< [OPTIMIZATION]
<<< SIMD
<<< SOFTWARE PIPELINING
<<< PREFETCH : 32
<<< c: 16, b: 16
<<< Loop-information End >>>
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指示子を指定することでインダイレクトアクセス(リストアクセス
します。その結果、データアクセス待ちコストが改善されました。
インダイレクトアクセスプリフェッチの効果
(最適化制御行チューニング)
浮動小
数点ロー
ドキャッ
シュアク
セス待ち
0.0E+00
5.0E-02
1.0E-01
1.5E-01
2.0E-01
2.5E-01
3.0E-01
3.5E-01
4.0E-01
改善前
[秒]
インダイレクトアクセス(配列
b, c)に対するプリフェッチが
生成された
ロード・ストアの効率化
プリフェッチの有効利用
ユーザーがコンパイラオプションやディレクティブで挿入する事もできる.  
以下ディレクティブによるソフトウェアプリフェッチ生成の例.
RIKEN AICSチューニングチュートリアルより
2014年4月24日 CMSI計算科学技術特論B 
44
ラインアクセスの有効利用
リストアクセスでx,y,z,u,v,wの座標をアクセスするような場合配列マージに
よりキャッシュラインのアクセス効率を高められる場合がある.
103
配列マージとは
配列マージとは、同一ループ内でアクセスパターンが共通の配列が複数ある
場合、1個の配列に融合することです。データアクセスを連続化して、キャッ
シュ効率を向上させます。
改善前ソース 改善後(コンパイラ最適化イメージ)
parameter(n=1000000)
real*8 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)
real*8 abc(3, n)
integer d(n+10)
:
do iter = 1, 100
do i = 1 , n
ii = d(i)
abc(1,ii) = abc(2,ii) + scalar * abc(3,ii)
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=1,n1
do i=1,n2
a(i) = s1 + c(j,i) / (s1 + s2 / d(j,i))
enddo
do i=2,n2
b(j,i) = a(i) / (s2 + s1 / a(i-1))
enddo
enddo
① 配列aを2次元配列にする
do j=1,n1
do i=1,n2
a(j, i) = s1 + c(j,i) / (s1 + s2 / d(j,i))
enddo
do i=2,n2
b(j,i) = a(j, i) / (s2 + s1 / a(j,i-1))
enddo
enddo
② ループ1とループ2を分割する
do j=1,n1
do i=1,n2
a(j, i) = s1 + c(j,i) / (s1 + s2 / d(j,i))
enddo
enddo
do j=1,n1
do i=2,n2
b(j,i) = a(j, i) / (s2 + s1 / a(j,i-1))
enddo
enddo
ループ1
ループ2
③ ループを交換する
do i=1,n2
do j=1,n1
a(j, i) = s1 + c(j,i) / (s1 + s2 / d(j,i))
enddo
enddo
do i=2,n2
do j=1,n1
b(j,i) = a(j, i) / (s2 + s1 / a(j,i-1))
enddo
enddo
配列b、c、d はストライドア
クセスなので、キャッシュ効
率が悪い
配列b、c、d が連続ア
クセスになりキャッシュ
効率が改善される
ループ分割の阻害
要因である配列a
の依存がなくなる
Copyright 2012 RIKEN AICS
2014年4月24日 CMSI計算科学技術特論B 
46
キャッシュの有効利用
ブロッキング
B/F値
=移動量(Byte)/演算量(Flop)
=2N2/2N3
=1/N
×=
行列行列積の計算
2N3個の演算 N2個のデータ N2個のデータ
原理的にはNが大きい程小さな値
現実のアプリケーションではNがある程度の大きさになるとメモリ配置的には(a)は
キャッシュに乗っても(b)は乗らない事となる
(a) (b)
×=
(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
キャッシュの有効利用
スラッシング
キャッシュスラッシングとは
ソース例
subroutine sub(a, n, m) ※n=256, m=256
real*8 a(n, m, 4)
do j = 1 , m
do i = 1 , n
a(i, j, 4) = a(i, j, 1) + a(i, j, 2) + a(i, j, 3)
enddo
enddo
End
キャッシュスラッシングとは、キャッシュ上の特定のインデックス(キャッシュ上
情報)のデータだけが頻繁に上書きされる現象のことです。この現象は、配列
が2のべき乗の場合およびループ内のストリーム数が多い場合に発生しやす
す。 注:ストリームとは、ループの回転に伴って参照定義される一連のデー
今回の例の場合、a(1,1,1)、
a(1,1,2)、a(1,1,3)、a(1,1,4)はそ
キャッシュへの格納
キャッシュへの格納(競合)
(L1Dキャッシュ) (メモリ上の
a( 1,
・
a ( 16
・
a( 1,
・
a ( 16
・
a( 1,
1WAY
128エントリ
2WAY
L1Dキャッシュスラッシングの目安
24
ラッシングとは
56, m=256
) + a(i, j, 3)
とは、キャッシュ上の特定のインデックス(キャッシュ上の位置
頻繁に上書きされる現象のことです。この現象は、配列サイズ
よびループ内のストリーム数が多い場合に発生しやすくなりま
注:ストリームとは、ループの回転に伴って参照定義される一連のデータのことです。
今回の例の場合、a(1,1,1)、
a(1,1,2)、a(1,1,3)、a(1,1,4)はそ
れぞれ32×16KBずつ離れている
(16KB境界にある)ため4つが同
じインデックスに割り当てられる。
そのため1つ目、2つ目のデータが
3つ目、4つ目のデータに上書きさ
れる。
キャッシュへの格納
キャッシュへの格納(競合)
実行順序①~④
(L1Dキャッシュ) (メモリ上のデータ配置)
a( 1, 1, 1)
・ ・ ・
a ( 16, 1, 1)
・ ・ ・
a( 1, 1, 2)
・ ・ ・
a ( 16, 1, 2)
・ ・ ・
a( 1, 1, 3)
・ ・ ・
a ( 16, 1, 3)
・ ・ ・
a( 1, 1, 4)
・ ・ ・
a ( 16, 1, 4)
・ ・ ・
実行順序
④
①
②
③
1WAY
128エントリ
2WAY
ングの目安
1D ミス dm率
/L1D ミス数)
20%以上
に1回ミスをする)
に1回ミスをする)
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
24
ソース例
tine sub(a, n, m) ※n=256, m=256
a(n, m, 4)
1 , m
= 1 , n
, j, 4) = a(i, j, 1) + a(i, j, 2) + a(i, j, 3)
do
)のデータだけが頻繁に上書きされる現象のことです。この現象は、配列サイズ
のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなりま
注:ストリームとは、ループの回転に伴って参照定義される一連のデータのことです。
今回の例の場合、a(1,1,1)、
a(1,1,2)、a(1,1,3)、a(1,1,4)はそ
れぞれ32×16KBずつ離れている
(16KB境界にある)ため4つが同
じインデックスに割り当てられる。
そのため1つ目、2つ目のデータが
3つ目、4つ目のデータに上書きさ
れる。
キャッシュへの格納
キャッシュへの格納(競合)
実行順序①~④
(L1Dキャッシュ) (メモリ上のデータ配置)
a( 1, 1, 1)
・ ・ ・
a ( 16, 1, 1)
・ ・ ・
a( 1, 1, 2)
・ ・ ・
a ( 16, 1, 2)
・ ・ ・
a( 1, 1, 3)
・ ・ ・
a ( 16, 1, 3)
・ ・ ・
a( 1, 1, 4)
・ ・ ・
a ( 16, 1, 4)
・ ・ ・
実行順序
④
①
②
③
1WAY
128エントリ
2WAY
Dキャッシュスラッシングの目安
L1D ミス率
/ロード・ストア数)
L1D ミス dm率
(/L1D ミス数)
精度 3.125%以上
精度 6.250%以上
20%以上
単精度:1/32(32回に1回ミスをする)
倍精度:1/16(16回に1回ミスをする)
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
RIKEN AICS
24
ソース例
subroutine sub(a, n, m) ※n=256, m=256
real*8 a(n, m, 4)
do j = 1 , m
do i = 1 , n
a(i, j, 4) = a(i, j, 1) + a(i, j, 2) + a(i, j, 3)
enddo
enddo
End
今回の例の場合、a(1,1,1)、
a(1,1,2)、a(1,1,3)、a(1,1,4)はそ
れぞれ32×16KBずつ離れている
(16KB境界にある)ため4つが同
じインデックスに割り当てられる。
そのため1つ目、2つ目のデータが
3つ目、4つ目のデータに上書きさ
れる。
キャッシュへの格納
キャッシュへの格納(競合)
実行順序①~④
(L1Dキャッシュ) (メモリ上のデータ配置)
a( 1, 1, 1)
・ ・ ・
a ( 16, 1, 1)
・ ・ ・
a( 1, 1, 2)
・ ・ ・
a ( 16, 1, 2)
・ ・ ・
a( 1, 1, 3)
・ ・ ・
a ( 16, 1, 3)
・ ・ ・
a( 1, 1, 4)
・ ・ ・
a ( 16, 1, 4)
・ ・ ・
実行順序
④
①
②
③
1WAY
128エントリ
2WAY
L1Dキャッシュスラッシングの目安
L1D ミス率
(/ロード・ストア数)
L1D ミス dm率
(/L1D ミス数)
単精度 3.125%以上
倍精度 6.250%以上
20%以上
単精度:1/32(32回に1回ミスをする)
倍精度:1/16(16回に1回ミスをする)
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
Copyright 2012 RIKEN AICS
24
subroutine sub(a, n, m) ※n=256, m=256
real*8 a(n, m, 4)
do j = 1 , m
do i = 1 , n
a(i, j, 4) = a(i, j, 1) + a(i, j, 2) + a(i, j, 3)
enddo
enddo
End
今回の例の場合、a(1,1,1)、
a(1,1,2)、a(1,1,3)、a(1,1,4)はそ
れぞれ32×16KBずつ離れている
(16KB境界にある)ため4つが同
じインデックスに割り当てられる。
そのため1つ目、2つ目のデータが
3つ目、4つ目のデータに上書きさ
れる。
a( 1, 1, 1)
・ ・ ・
a ( 16, 1, 1)
・ ・ ・
a( 1, 1, 2)
・ ・ ・
a ( 16, 1, 2)
・ ・ ・
a( 1, 1, 3)
・ ・ ・
a ( 16, 1, 3)
・ ・ ・
a( 1, 1, 4)
・ ・ ・
a ( 16, 1, 4)
・ ・ ・
④
①
②
③
1WAY
128エントリ
2WAY
L1Dキャッシュスラッシングの目安
L1D ミス率
(/ロード・ストア数)
L1D ミス dm率
(/L1D ミス数)
単精度 3.125%以上
倍精度 6.250%以上
20%以上
単精度:1/32(32回に1回ミスをする)
倍精度:1/16(16回に1回ミスをする)
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
Copyright 2012 RIKEN AICS
24
ッシュ上の特定のインデックス(キャッシュ上の位置
書きされる現象のことです。この現象は、配列サイズ
プ内のストリーム数が多い場合に発生しやすくなりま
トリームとは、ループの回転に伴って参照定義される一連のデータのことです。
今回の例の場合、a(1,1,1)、
a(1,1,2)、a(1,1,3)、a(1,1,4)はそ
れぞれ32×16KBずつ離れている
(16KB境界にある)ため4つが同
じインデックスに割り当てられる。
そのため1つ目、2つ目のデータが
3つ目、4つ目のデータに上書きさ
れる。
キャッシュへの格納
キャッシュへの格納(競合)
実行順序①~④
(L1Dキャッシュ) (メモリ上のデータ配置)
a( 1, 1, 1)
・ ・ ・
a ( 16, 1, 1)
・ ・ ・
a( 1, 1, 2)
・ ・ ・
a ( 16, 1, 2)
・ ・ ・
a( 1, 1, 3)
・ ・ ・
a ( 16, 1, 3)
・ ・ ・
a( 1, 1, 4)
・ ・ ・
a ( 16, 1, 4)
・ ・ ・
実行順序
④
①
②
③
1WAY
128エントリ
2WAY
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
24
m=256
+ a(i, j, 3)
は、キャッシュ上の特定のインデックス(キャッシュ上の位置
繁に上書きされる現象のことです。この現象は、配列サイズ
よびループ内のストリーム数が多い場合に発生しやすくなりま
注:ストリームとは、ループの回転に伴って参照定義される一連のデータのことです。
今回の例の場合、a(1,1,1)、
a(1,1,2)、a(1,1,3)、a(1,1,4)はそ
れぞれ32×16KBずつ離れている
(16KB境界にある)ため4つが同
じインデックスに割り当てられる。
そのため1つ目、2つ目のデータが
3つ目、4つ目のデータに上書きさ
れる。
キャッシュへの格納
キャッシュへの格納(競合)
実行順序①~④
(L1Dキャッシュ) (メモリ上のデータ配置)
a( 1, 1, 1)
・ ・ ・
a ( 16, 1, 1)
・ ・ ・
a( 1, 1, 2)
・ ・ ・
a ( 16, 1, 2)
・ ・ ・
a( 1, 1, 3)
・ ・ ・
a ( 16, 1, 3)
・ ・ ・
a( 1, 1, 4)
・ ・ ・
a ( 16, 1, 4)
・ ・ ・
実行順序
④
①
②
③
1WAY
128エントリ
2WAY
グの目安
D ミス dm率
1D ミス数)
20%以上
回ミスをする)
回ミスをする)
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
1way 2way
L1Dキャッシュ"
128バイト×128エントリ×2way=32Kバイト
24
キャッシュスラッシングとは
ソース例
subroutine sub(a, n, m) ※n=256, m=256
real*8 a(n, m, 4)
do j = 1 , m
do i = 1 , n
a(i, j, 4) = a(i, j, 1) + a(i, j, 2) + a(i, j, 3)
enddo
enddo
End
キャッシュスラッシングとは、キャッシュ上の特定のインデックス(キャッ
情報)のデータだけが頻繁に上書きされる現象のことです。この現象は
が2のべき乗の場合およびループ内のストリーム数が多い場合に発生
す。 注:ストリームとは、ループの回転に伴って参照定義される一
今回の例の場合、a(1,1,1)、
a(1,1,2)、a(1,1,3)、a(1,1,4)はそ
れぞれ32×16KBずつ離れている
(16KB境界にある)ため4つが同
じインデックスに割り当てられる。
そのため1つ目、2つ目のデータが
3つ目、4つ目のデータに上書きさ
れる。
キャッシュへの格納
キャッシュへの格納(競合)
(L1Dキャッシュ) (メ
1WAY
128エントリ
2WAY
L1Dキャッシュスラッシングの目安
L1D ミス率
(/ロード・ストア数)
L1D ミス dm率
(/L1D ミス数)
単精度 3.125%以上
倍精度 6.250%以上
20%以上
単精度:1/32(32回に1回ミスをする)
倍精度:1/16(16回に1回ミスをする)
Copyright 2012 RIKEN AICS
メモリ
アクセス時にキャッシュの追い出しが発生(スラッシング)
32×16KBのアドレス差
2014年4月24日 CMSI計算科学技術特論B 
49
キャッシュの有効利用
スラッシングの除去(配列マージ)
28
改善前ソース例
parameter(n=256,m=256)
real*8 a(n, m),b(n,m),c(n,m),d(n,m)
common /com/a,b,c,d
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=256,m=256)
real*8 abcd(4, n, m)
common /com/abcd
do j = 1 , m
do i = 1 , n
abcd(1,i, j) = abcd(2,i, j) +
abcd(3,i, j) + abcdd(4,i, j)
enddo
enddo
改善前 改善後
L1Dキャッシュス
ラッシング発生
狙い
ストリーム数削減。
副作用
ロード、ストア命令のSIMD化が難しくなる。
abcd(1, 1, 1)
abcd(2, 1, 1)
・・・
abcd(1,256, 1)
(L1Dキャッシュ) (メモリ上のデータ配置)
・・・
abcd(3, 1, 1)
abcd(4, 1, 1)
abcd(2,256, 1)
abcd(3,256, 1)
abcd(4,256, 1)
abcd(1, 1, 2)
abcd(2, 1, 2)
abcd(3, 1, 2)
abcd(4, 1, 2)
abcd(1, 2, 1)
abcd(4,256,256)
キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番
4つとも同一キャッシュライン上の
ためデータを有効利用できる
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
Copyright 2012 RIKEN AICS
28
配列マージとは
改善前ソース例
parameter(n=256,m=256)
real*8 a(n, m),b(n,m),c(n,m),d(n,m)
common /com/a,b,c,d
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=256,m=256)
real*8 abcd(4, n, m)
common /com/abcd
do j = 1 , m
do i = 1 , n
abcd(1,i, j) = abcd(2,i, j) +
abcd(3,i, j) + abcdd(4,i, j)
enddo
enddo
改善前 改善後
L1Dキャッシュス
ラッシング発生
狙い
ストリーム数削減。
副作用
ロード、ストア命令のSIMD化が難しくなる。
abcd(1, 1, 1)
abcd(2, 1, 1)
・・・
abcd(1,256, 1)
(L1Dキャッシュ) (メモリ上のデータ配置)
・・・
abcd(3, 1, 1)
abcd(4, 1, 1)
abcd(2,256, 1)
abcd(3,256, 1)
abcd(4,256, 1)
abcd(1, 1, 2)
abcd(2, 1, 2)
abcd(3, 1, 2)
abcd(4, 1, 2)
abcd(1, 2, 1)
abcd(4,256,256)
キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番
4つとも同一キャッシュライン上の
ためデータを有効利用できる
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
Copyright 2012 RIKEN AICS
28
改善前ソース例
parameter(n=256,m=256)
real*8 a(n, m),b(n,m),c(n,m),d(n,m)
common /com/a,b,c,d
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=256,m=256)
real*8 abcd(4, n, m)
common /com/abcd
do j = 1 , m
do i = 1 , n
abcd(1,i, j) = abcd(2,i, j) +
abcd(3,i, j) + abcdd(4,i, j)
enddo
enddo
改善前 改善後
L1Dキャッシュス
ラッシング発生
狙い
ストリーム数削減。
副作用
ロード、ストア命令のSIMD化が難しくなる。
abcd(1, 1, 1)
abcd(2, 1, 1)
・・・
abcd(1,256, 1)
(L1Dキャッシュ) (メモリ上のデータ配置)
・・・
abcd(3, 1, 1)
abcd(4, 1, 1)
abcd(2,256, 1)
abcd(3,256, 1)
abcd(4,256, 1)
abcd(1, 1, 2)
abcd(2, 1, 2)
abcd(3, 1, 2)
abcd(4, 1, 2)
abcd(1, 2, 1)
abcd(4,256,256)
キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番
4つとも同一キャッシュライン上の
ためデータを有効利用できる
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
Copyright 2012 RIKEN AICS
RIKEN AICSチューニングチュートリアルより
2014年4月24日 CMSI計算科学技術特論B 
50
キャッシュの有効利用
スラッシングの除去(配列インデックス交換)
33
キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番
ソース例
parameter(n=256,m=256)
real*8 a(n,m,4)
common /com/a
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=256,m=256)
real*8 a(4, n, m)
common /com/a
do j = 1 , m
do i = 1 , n
a(1,i, j) = a(2,i, j) + a(3,i, j) + a(4,i, 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つとも同一キャッシュライン上の
ためデータを有効利用できる
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
Copyright 2012 RIKEN AICS
RIKEN AICSチューニングチュートリアルより
2014年4月24日 CMSI計算科学技術特論B 
51
キャッシュの有効利用
スラッシングの除去(ループ分割)
do i=1,n do i=1,n
…  =  a(i)  +  b(i)                                      …  =  z(1,i)  +  z(2,i)
enddo enddo
ス
リス
do i=1,n do i=1,n
…  =  a(I,1)  +  a(I,2)                          …  =  a(1,i)  +  a(2,i)
enddo enddo
do i=1,n do i=1,n
…  =  a(i)  +  b(i)                                      …  =  a(i)  +  b(i)  
…  =  c(i)  +  d(i)                                  enddo      
enddo do i=1,n
…  =  c(i)  +  d(i)    
enddo
common //a(n),b(n) common //a(n),p(64),b(n)
配列マージ
配列次元移動
ループ分割
パディング
ループ内でアクセスされる配列数が多いとスラッシング
が起きやすい.  
ループ分割する事でそれぞれのループ内の配列数を削減
する事が可能となる.  
配列数が削減されることによりスラッシングの発生を抑
えられる場合がある.
2014年4月24日 CMSI計算科学技術特論B 
52
キャッシュの有効利用
スラッシングの除去(パディング)
26
enddo enddo
リスクそのものを改善する解決型のアプロ
長所:パラメタ変更等、問題規模の変化
順応できる
do i=1,n do i=1,n
…  =  a(I,1)  +  a(I,2)                          …  =  a(1,i)  +  a(2,i)
enddo enddo
do i=1,n do i=1,n
…  =  a(i)  +  b(i)                                      …  =  a(i)  +  b(i)  
…  =  c(i)  +  d(i)                                  enddo      
enddo do i=1,n
…  =  c(i)  +  d(i)    
enddo
common //a(n),b(n) common //a(n),p(64),b(n)
do i=1,n do i=1,n
…  =  a(i)  +  b(i)                                      …  =  a(i)  +  b(i)  
enddo enddo
パディングを行うことで、配列のアドレス
ずらして改善する回避型のアプローチ
短所:修正量が多い。SIMD化が複
注意:ループ分割
長所:修正量が少ない、SIMD化が容
短所:パラメタ変更等、問題規模が変化
度に調整が必要になる
配列次元移動
ループ分割
パディング
Copyright 2012 RIKEN AICS
L1Dキャッシュへの配列の配置の状況を変更する事でス
ラッシングの解消を目指す.  
そのためにcommon配列の宣言部にダミーの配列を配置
することでスラッシングが解消する場合がある.  
また配列宣言時にダミー領域を設けることでスラッシン
グが解消する場合がある.
42
キャッシュへの格納 キャッシュへの格納(競合) メモリへのアクセス順番
改善前ソース例
n=256,m=256)
m,4),b(n,m,4),c(n,m,4),d(n,m,4)
om/a
n
) = a(i, j, 2) + a(i, j, 3) + a(i, j, 4)
前 改善後
シュス
発生
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(
a(
a(2
a(
a(
(メモリ
a(
改善後ソース例
parameter(n=257,m=256)
real*8 a(n,m,4),b(n,m,4),c(n,m,4),d(n,m,4)
common /com/a
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キャッ
シュスラッシ
ングは発生
せず
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
256×256×8B
=32×16KB
離れたアクセス
a(2
a(
パデ
でキ
され
IKEN AICS
2014年4月24日 CMSI計算科学技術特論B 
53
キャッシュの有効利用
リオーダリング
メモリ
データ
2次キャッシュ
1次キャッシュ
データ
データ
1要素
8byte毎の
アクセス
キャッシュライン
128byte毎の
アクセス
メモリと2次キャッシュはキャッ
シュライン128バイト単位のアクセ
スとなる.  
1次キャッシュは1要素8バイト単
位のアクセスとなる.  
以下のような疎行列とベクトルの積
があるときベクトルはとびとびにア
クセスされる.  
このベクトルがメモリや2次キャッ
シュにある場合アクセス効率が非常
に悪化する.  
1次キャッシュは1要素毎にアクセ
スされるためこの悪化が亡くなる.  
ベクトルを1次キャッシュへ置くた
めの並び替えが有効になる.
do i=1,n
do j=1,l(i)
k = k +1
buf = 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文の除去が有効な場合がある.
IF(体系内部の場合) THEN 
   速度の配列 UL の7点差分式
IF(外部境界の場合) THEN 
   ULと速度境界条件の配列 VELBN の混合式
MIM
UL
VELBN
5 -1 -999
5 1
イレギュラー
  ○:UL X:VELBN
<変更後>
MIM 5 -1
イレギュラー
0
10-1 5
ULD
=0
0=
ダミー領域
        
内点と縁の点で参照点の数が違うため計
算式が違う.そのため内点と縁の点を区
別するIF文が存在する.
計算領域の外側にダミー領域を設定しその中に
0を格納する.こうすることにより内点と縁の点
が同じ式となりIF文は必要でなくなる.
効率の良いスケジューリング・演算器の有効利用
2014年4月24日 CMSI計算科学技術特論B 
56
インデックス計算の除去
例えば粒子を使ったPIC法のアプリケーションの場合,
粒子がどのメッシュに存在するかをインデックスで計算
するような処理が頻発する.  
このような複雑なインデックス計算を使用しているとソ
フトウェアパイプラインニングやsimd化等のスケジュー
リングがうまく行かない場合がある.  
このような場合には以下のような方法でのインデックス
計算の除去が有効な場合がある.
1. 粒子が隣のメッシュに動く可
能性がある.
2. そのため全ての粒子につい
てどのメッシュにいるかのイ
ンデックス計算がある.
3. しかし隣のメッシュに動く粒
子は少数.
4. まず全粒子は元のメッシュに
留まるとしてインデックス計
算を除去して計算する.
5. その後隣のメッシュに移動し
た粒子についてだけ再計算
する.
do i=1,N
インデックス
なしの計算
do i=1,移動した粒子数
インデックス
ありの計算
効率の良いスケジューリング・演算器の有効利用
2014年4月24日 CMSI計算科学技術特論B 
57
ループ分割
do i=1,n do i=1,n
…  =  a(i)  +  b(i)                                      …  =  z(1,i)  +  z(2,i)
enddo enddo
ス
リス
do i=1,n do i=1,n
…  =  a(I,1)  +  a(I,2)                          …  =  a(1,i)  +  a(2,i)
enddo enddo
do i=1,n do i=1,n
…  =  a(i)  +  b(i)                                      …  =  a(i)  +  b(i)  
…  =  c(i)  +  d(i)                                  enddo      
enddo do i=1,n
…  =  c(i)  +  d(i)    
enddo
common //a(n),b(n) common //a(n),p(64),b(n)
配列マージ
配列次元移動
ループ分割
パディング
ループ内の処理が複雑すぎるとソフトウェアパイプライ
ンニングやsimd化が効かない場合がある.  
ループ分割する事でループ内の処理が簡略化されスケ
ジューリングがうまくいくようになる場合がある.
効率の良いスケジューリング・演算器の有効利用
2014年4月24日 CMSI計算科学技術特論B 
58
do i=1,n
do j=1,10
ループ交換
ループの回転数が少ないとソフトウェアパイプラインニ
ングが効かない場合がある.  
ループ交換し長いループを最内にする事でソフトウェア
パイプラインニングがうまくいくようになる場合があ
る.
do j=1,10
do i=1,n
効率の良いスケジューリング・演算器の有効利用
2014年4月24日 CMSI計算科学技術特論B 
59
do i=1,n
関数・サブルーチン展開
ループ内に関数やサブルーチン呼出しがあるとスケ
ジューリングが進まない.  
その場合はコンパイラオプションにより関数やサブルー
チンをループ内に展開する.  
ハンドチューニングで展開した方がうまく行く場合もあ
る.
do i=1,n
効率の良いスケジューリング・演算器の有効利用
call subroutines
2014年4月24日 CMSI計算科学技術特論B 
まとめ
!
• スレッド並列化  
• CPU単体性能を上げるための5つの要素  
• 要求B/F値と5つの要素の関係  
• 性能予測手法(要求B/F値が高い場合)  
• 具体的テクニック
602014年4月24日 CMSI計算科学技術特論B 

More Related Content

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