19. 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
30. 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
32. 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. 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. 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
36. 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. 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
39. 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. 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