計算科学技術 特論Ｂ

hĠ.
æĊĕñěöēę×=qK!
¡«­" =qK!
2016年4月21日
国立研究開発法人理化学研究所
計算科学研究機構�運用技術部門
ソフトウェア技術チーム�チームヘッド
南�一生
minami_kaz@riken.jp
RIKEN ADVANCED INSTITUTE FOR COMPUTATIONAL SCIENCE}p×Pw• øěĆěòęćđěüÔæĊĕñěöēę×=q• æĊĕñěöēę×=qK!=qK!
• æĊĕñěöēę×=qK!¡«­" =qK!
• æĊĕñěöēę×=qK!×5
• æĊĕñěöēę×=qK!×5

2016年4月21日 計算科学技術 特論Ｂ• àýæê~•  3cÎ®ËµÅ¾·¾h_~• hJº·¾h_¾w~• 3cO5LhJ©}¥'!~•  XçØëæØ

2016年4月21日 計算科学技術 特論Ｂøėÿă!

2016年4月21日 計算科学技術 特論Ｂøėÿă×Pw
CPU
コア

演算器

・・

í9.©²º»ì¯ĆüQİ

演算器

演算器

¯Ćüè·ªĂġďĈĢûWİ

ハードウェア¸º¶uíĚĨċĊìAÜ²º»í¯ĆüûkÞøâóíĊ
ħďē&ÕJİ

・・Ċħďē&íâóìî%&Ô¹ÉÂÇ¸ºÕk,İ

・・
バリア同期
レジスタ・・ レジスタ レジスタ
共有キャッシュí9.îĔīēÿĀüĕĥü
/X[ûkÜâëĊħďējÕ,İ

メモリ

2016年4月21日 計算科学技術 特論ＢąèĉĕÿăÔĈĔÿĂ©«¦¸º¶ĚĨċĊéĊħďēí{ò.úàûĔþęĥďēéÐÑİ-Ćüì¸º¶ĚĨċĊû!÷Hçø&ûĘĤďĒ¸º¶éÐÑİèîcí$hn kįağĠĥûOÛÒøeèĔþęĥď
ēûP<ÜçÐøİ1ĚĨċĊ8ĊħďēĬĔþęĥďēMPIĭí9.

8ĚĨċĊĬĘĤďĒMPIĭí9.

core

core

core

core

core

core

core

core

core

core

core

core

core

core

core

core

MPIプロセス2016年4月21日 計算科学技術 特論ＢąèĉĕÿăÔĈĔÿĂ©«¦×0'ĊħďēĮĚĨċĊíĔþęĥďē7ĆüĺĆĩĖþĤìõø\V&įSIMD&
CPUĺĊħďē(%&ĺzwE&†įOpenMP)CPUĺĚĨċĊ(MPIÎXPFortran)†zwE&
ĕĥü/Xû`kÜįĦīĚûĆüè&ěăĒĦ0ÙĬĦīĚÕÐĭĆīēí&Õ,
Ćüĺ\V&ÎSIMD
&ĬìĆĩĖþĤĭ

CPUĺĚĨċĊĬMPIÓõïXPFortranĭ

CPUĺĊħďēĬzwEÎ
OpenMPĭĬĆĩĖþĤìõøćĜīĒÏ÷ĭ

core

CPU
core core

core

core

core

core

core

CPU

ğĠĥ

CPU

CPU

ĪĪĪ
ğĠĥ

ğĠĥ

CPU

ĪĪĪ
ğĠĥ

ğĠĥ

ĚĨċĊ7ĆüĺĆĩĖþĤìõø\V&įSIMD&ĆüĺĚĨċĊ(MPIÎXPFortran)ĆüĺĚĨċĊĬMPIÓõïXPFortranĭ

Ćüĺ\V&ÎSIMD
&ĬìĆĩĖþĤĭ

core

CPU
core core

core

core

core

core

core

CPU

ğĠĥ

2016年4月21日 計算科学技術 特論Ｂ

CPU

CPU

ĪĪĪ
ğĠĥ

ğĠĥ

CPU

ĪĪĪ
ğĠĥ

@$híeÔöÎĔþęĥďē7ûP<7¡«­" =qåÅãÍÝ×ĢÑ×wl

2016年4月21日 計算科学技術 特論Ｂ

ğĠĥ

¡«­"

=qåÅãÍÝ×ĢÑ×wl

¡«­×vEòæÓÜÊøėÿă!ÁÓÂÒ¼ãÔØBÔÈÒĘěăĚøĂæ×]!
Ĕèęæïúø×LaîĐÿöđ×La]×s¼* øñ÷đěĕęðZj-×La

2016年4月21日 計算科学技術 特論ＢĘěăĚøĂæ×]!

ĊĕĈêÿþ×LaZjÔĘěăĚøĂæS×D,2016年4月21日 計算科学技術 特論ＢħþĐĩĈ(üăċĊítäÕ÷)ħþĐĩĈĬoAĭ

ğĠĥ
đīČ

ĳĲĲ

ª\ĂġďĈĢ
ĳĲ

đīČ©\ĂġďĈĢ

ĳ

đīČ
dv3

2016年4月21日 計算科学技術 特論ＢħþĐĩĈ(üăċĊítäÕ÷)
ğĠĥ

täÕ÷

täÕ÷

đīČ
ª\ĂġďĈĢ

üăċĊ

U

đīČ
©\ĂġďĈĢ

đīČdv3

2016年4月21日 計算科学技術 特論ＢüăċĊĚĥĘĀďĎíW$
ğĠĥ

k

täÕ÷

ĚĥĘĀďĎ

đīČ
ª\ĂġďĈĢ

üăċĊ üăċĊ

đīČ
UdvìüăċĊáíôíû
àø9.ôÏø

©\ĂġďĈĢ

đīČdv3
2016年4月21日 計算科学技術 特論Ｂ



演算とロード・ストア比の改善íĆīđýĩĄûìÒøİíĆīđýĩĄídvî1ĴįsĴíĶİĨīēíSîÌ¥¾¡Ä¢¥¾¡Ä¤©¢íĵİĊĒüíSîÌíĳİÜâÕåçĨīēĪĊĒüSîĶdvéĨīēĪĊĒüí^îĶ§ĶéëøİëøðØdví^hûóĨīēĪĊĒüí^hûØNÒçdvéĨīē
<内側ループアンローリング(2)>ĊĒüí^ûR2û5øÕİ・以下の様な2つのコーディングを比較する。
do j=1,m
do i=1,nx(i)=x(i)+a(i)*b+a(i+1)*d
end dodo j=1,m
2016年4月21日 計算科学技術 特論Ｂ
do i=1,n,2Ĕèęæïúø×LağĠĥĂġďĈĢĤþĩĂġďĈĢĤþĩ
128byte]íüăċĊ 128byte]íüăċĊ

đīČ
ª\ĂġďĈĢ

đīČíyûvì k1íyíò
ûvì k

$hÕÐ

$hÕLÐ

©\ĂġďĈĢ

đīČdv3

2016年4月21日 計算科学技術 特論ＢîĐÿöđ×LağĠĥĪđīČ|"íÐĂġďĈĢ
ûÙøĪĂġďĈĢì~ÐâđīČû 4ô kÜdvûëÑĪÚÑÞøèdv3í"û(
Ðø

đīČ
ª\ĂġďĈĢđīČkĉĘÿîęð

©\ĂġďĈĢ

đīČdv3
2016年4月21日 計算科学技術 特論Ｂ]×s¼*

øñ÷đěĕęð

vU

vU

ĦīĚÄ

ĦīĚÄ

$hÕÐ

ĦīĚÄ¤©

ÁÈÄ°©¥©¨¨
Ív©
Ívª
ÂÇÁÁÈ

$hÕLÐ
2016年4月21日 計算科学技術 特論Ｂ

_Ô2=×.
< ソフトウェアパイプラインニング>

òęĆèĔ

B
ĚĘěăğÑ°±øĂæÔZjÔØ(I5u&q
ĚĘěăÔøĂæØğïĘÿïÓ5u&q
ĚZjØġïĘÿïÓ5u&q
ĚĘěăÔZjÔøĂæØĆèĊĔèę!ÇäÒ¼ã
例えば以下の処理を考える。
do i=1,100(1)a(i)のロードb(i)のロードa(i)とb(i)の演算
i番目の結果のストア
end do5uI 
ĚïĘÿï¸wlïĘÿïÀÀã

2016年4月21日 計算科学技術 特論ＢĦīĚÄ¤©

(2)

<ソフトウェアパイプラインニング><ソフトウェアパイプラインニング>

_Ô2=×.

例えば以下のコーディングを考える。
例えば以下のコーディングを考える。
<ソフトウェアパイプラインニング><ソフトウェアパイプラインニング><ソフトウェアパイプラインニング><ソフトウェアパイプラインニング>

do i=1,100 例えば以下のコーディングを考える。
< ソフトウェアパイプラインニング>òęĆèĔ例えば以下のコーディングを考える。
例えば以下のコーディングを考える。
例えば以下のコーディングを考える。
a(i)=a(i‑1)+a(i)a(i)=a(i‑1)+a(i)do i=1,100b(i)=b(i‑1)+a(i)b(i)=b(i‑1)+a(i)i=1,100
do i=1,100dodoi=1,100
doc(i)=c(i‑1)+b(i)i=1,100
c(i)=c(i‑1)+b(i)a(i)=a(i‑1)+a(i)a(i)=a(i‑1)+a(i)a(i)=a(i‑1)+a(i)a(i)=a(i‑1)+a(i)左の処理を以下のように構成し直す事をend doend dob(i)=b(i‑1)+a(i)b(i)=b(i‑1)+a(i)b(i)=b(i‑1)+a(i)b(i)=b(i‑1)+a(i)ソフトウェアパイプラインニングという
c(i)=c(i‑1)+b(i)c(i)=c(i‑1)+b(i)c(i)=c(i‑1)+b(i)c(i)=c(i‑1)+b(i)このコーディングは下図の実線の矢印のような参照関係を持っているため、ループ
このコーディングは下図の実線の矢印のような参照関係を持っているため、ループ内のend doend doend doend do3つの式に依存性が生じる。点線上の計算をループ内の3つの式となるよう処理を変3つの式に依存性が生じる。点線上の計算をループ内の3つの式となるよう処理を変更すa(1)a(2)a(3)のロード

b(1)b(2)のロード(1)の演算do i=3,100

ることをソフトウェアパイプラインニングという。
ることをソフトウェアパイプラインニングという。
このコーディングは下図の実線の矢印のような参照関係を持っているため、ループ内の
このコーディングは下図の実線の矢印のような参照関係を持っているため、ループ内の
このコーディングは下図の実線の矢印のような参照関係を持っているため、ループ
このコーディングは下図の実線の矢印のような参照関係を持っているため、ループ内の3つの式に依存性が生じる。点線上の計算をループ内の3つの式となるよう処理を変更す
3つの式に依存性が生じる。点線上の計算をループ内の3つの式となるよう処理を変更す
3つの式に依存性が生じる。点線上の計算をループ内の3つの式となるよう処理を変¹¹¹¹¹¹¹¹¹¹ĚĚĚĚĚĚĚĚ¹¹¹
3つの式に依存性が生じる。点線上の計算をループ内の3つの式となるよう処理を変更す
1
2
3
1
20
3
4
0
4
ることをソフトウェアパイプラインニングという。
ることをソフトウェアパイプラインニングという。
ることをソフトウェアパイプラインニングという。
ることをソフトウェアパイプラインニングという。

®Ęěăaa(i+1)のロード
b(i)のロード(i-1)の演算
i-2番目の結果のストア
end dob(100)のロード(99)(100)の演算(98)(99)(100)のストア

2016年4月21日 計算科学技術 特論Ｂ

a

1
120

10
0

0

¯Ęěă
ab

aa

ab

Zj b
c

bb

c
b

2
1
23

3
4
32

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

øĂæc

cc

c

a(1)=a(0)+a(1)a(1)=a(0)+a(1)コーディングは以下のようになる。
コーディングは以下のようになる。
コーディングは以下のようになる。
b(1)=b(0)+a(1)コーディングは以下のようになる。
b(1)=b(0)+a(1)a(2)=a(1)+a(2)a(2)=a(1)+a(2)a(1)=a(0)+a(1)a(1)=a(0)+a(1)a(1)=a(0)+a(1)do i=3,100
do i=3,100a(1)=a(0)+a(1)b(1)=b(0)+a(1)b(1)=b(0)+a(1)b(1)=b(0)+a(1)c(i‑2)=c(i‑3)+b(i‑2)b(1)=b(0)+a(1)c(i‑2)=c(i‑3)+b(i‑2)a(2)=a(1)+a(2)a(2)=a(1)+a(2)a(2)=a(1)+a(2)b(i‑1)=b(i‑2)+a(i‑1)a(2)=a(1)+a(2)b(i‑1)=b(i‑2)+a(i‑1)
do i=3,100 do i=3,100 doa(i)=a(i‑1)+a(i)i=3,100
do i=3,100a(i)=a(i‑1)+a(i)c(i‑2)=c(i‑3)+b(i‑2)
c(i‑2)=c(i‑3)+b(i‑2)
c(i‑2)=c(i‑3)+b(i‑2)
end doend doc(i‑2)=c(i‑3)+b(i‑2)
b(i‑1)=b(i‑2)+a(i‑1)
b(i‑1)=b(i‑2)+a(i‑1)
b(i‑1)=b(i‑2)+a(i‑1)c(99)=c(98)+b(99)c(99)=c(98)+b(99)b(i‑1)=b(i‑2)+a(i‑1)
a(i)=a(i‑1)+a(i)a(i)=a(i‑1)+a(i)a(i)=a(i‑1)+a(i)b(100)=b(99)+a(100)b(100)=b(99)+a(100)a(i)=a(i‑1)+a(i)enddoend doenddoc(100)=c(99)+b(100)c(100)=c(99)+b(100)end doc(99)=c(98)+b(99)c(99)=c(98)+b(99)c(99)=c(98)+b(99)c(99)=c(98)+b(99)b(100)=b(99)+a(100)b(100)=b(99)+a(100)b(100)=b(99)+a(100)b(100)=b(99)+a(100)c(100)=c(99)+b(100)c(100)=c(99)+b(100)c(100)=c(99)+b(100)c(100)=c(99)+b(100)_Ô2=×.
< ソフトウェアパイプラインニング>
do i=1,100a(i)のロード

òęĆèĔ

(1)

(2)

(1)

(2)

b(i)のロードa(i)とb(i)の演算
i番目の結果のストア
end dodo i=1,100a(i)のロードb(i)のロードa(i)とb(i)の演算
i番目の結果のストア
end do2016年4月21日 計算科学技術 特論Ｂ



4
43

4

_Ô2=×.
< ソフトウェアパイプラインニング>
do i=1,100a(i)のロード

òęĆèĔ

(1)

(2)

(1)

(2)

b(i)のロードa(i)とb(i)の演算
i番目の結果のストア
end dodo i=1,100a(i)のロードb(i)のロードa(i)とb(i)の演算
i番目の結果のストア
end do2016年4月21日 計算科学技術 特論Ｂ

_Ô2=×.
< ソフトウェアパイプラインニング>
左の処理を以下のように構成し直す事をソフトウェアパイプラインニングというa(1)a(2)a(3)のロード
b(1)b(2)のロード(1)の演算do i=3,100a(i+1)のロード
b(i)のロード(i-1)の演算
i-2番目の結果のストア
end dob(100)のロード

(1)

(2)

(3) (4)(5)(6)(7)(8)(99)(100)の演算(98)(99)(100)のストア
5uI 
Ě:×_%ÚĎèęĖěĊ×gÏÁâåÃÔĚïĘÿï¸wlïĘÿïÓ_ÓÂã
2016年4月21日 計算科学技術 特論ＢZj-×La２SIMD Multi&Add演算器×２本

vé#vûĶ/Uìv,
( 1 Í+ Í1 ) × Ķ = 8ÚíY ìÐr$h1ĆüíėīăKĺ8dv×2GHz =16Gdv/p
2016年4月21日 計算科学技術 特論Ｂ

wT ¤ÔÑ×wl×

2016年4月21日 計算科学技術 特論ＢwT ¤ÔÑ×wl×æĊĕñěöēę×wT ¤×16ÖàÐÒ=qþđěĄęðÖ¿¼ÒVdÉÛÂdÁbÕã
uuf×zjwT ¤Á6Ç¼
®
¯

＝
2N3ídv±§´
°q%(Byte)/dv(Flop)×
N2íđīČ

N2íđīČuċïĂĖf×zjwT ¤Á1Â¼
¯
®

＝
2N2ídv±§´
°q%(Byte)/dv(Flop)=(N2+N)/2N2≒1/2

×N2íđīČ

=2N2/2N3=1/N#_cÖØªÁ1Â¼e6ÇÕ*.+cPgORYXH #_cÖØªàâ1ÂÕNíđīČ

2016年4月21日 計算科学技術 特論Ｂ*.+cPgORYXH

x|vEx
128byte*kty~} 128byte







x|vEx|v
1 k
@k<5s128byte*kty~}
128byte*kt
=4j.
s=4

M)x|k<5k
@k<5s-[:X1s=4j.
=4j.


M)x|wT ¤ÔÑ×wl×


-[:X

L)x|

-["X



L)x|



,4


,4

_Þø±§´ÕBÛÐüĚĥąīĈģĩìæÐç
*/+QaZVbH */+QaZVbH

)jnìĂġďĈĢíW$ kÕ,
ñßđīČûāĩĂġď
ĈĢìÞøĆīđýĩĄĺ¡«¢Õæ×ìª\ĂġďĈĢíĤ
þĩíđīČûW$ìkÞøĆīđýĩĄĺ¡ª¢Õ
áùÕ@ièÖâè¡¬¢¡­¢Õ 69kDX|s>]rE
69kDXxx|j7Xc
|s>]rE
p._,4s;iYx|j7Xcs^Y`rg,4k9
p._,4s;iYEM)x|*.+cPgORYXH  XrGH%^Y`rg,4k9s*.+cPgORYXH M)x|Xr
< ソフトウェアパイプラインニング>





.

左の処理を以下のように構成し直す事を






M)x|M)x|

ソフトウェアパイプラインニングというx|vEx|vE.
a(1)a(2)a(3)のロード
128byte*kty~}
128byte*kty~}L)x|
b(1)b(2)のロード
x|vEx|vE(1)の演算128byte*kty~} 128byte*kty~}L)x|
do i=3,100
1 k<5kn
@k<5s=4j. a(i+1)のロード
s=4j.
1b(i)のロードk<5kn
@k<5s(i-1)の演算=4j.
s=4j.

-["X
-[:Xi-2番目の結果のストア



-[:X


L)x|end do-["Xb(100)のロード(99)(100)の演算(98)(99)(100)のストア

(1)

(2)

^fZQgS)XcZVgSH(^fZQgS)XcZVgSH(,4,4(3) (4)(5)(6)(7)(8)




!

4#'6)h H J`Pgei_HC?K&N(AG)h-RfZR;-,,$ 5-,,RfZRFF@L)L)x|




,4


,4

*1+H 

２SIMD Multi&Add演算器×２本*/+QaZVbH 
*/+QaZVbH *0+

H"=XTWbidgS

 =4&B

=4&B



R


M)x|M)x|RHL4h4s &j=49 69kDXx
( 1 V+ V1 ) ×  = 8|s>]rE

69kDXx^k(jx|j7Xcs
?X1D|s>]rE
p._,4s;iYE
R
x|j7XcsRHL^Y`rg,4k9s
p._,4s;iYE
 Xr 1{tky!98,4×2GHz =16G,4/0
^Y`rg,4k9s
 Xr

-[:X
.

.

L)x|2016年4月21日 計算科学技術 特論ＢL)x|-["XPTERNLILKKE
V=4LE
V=4ME
QSPEPT^fZQgS)XcZVgSH(^fZQgS)XcZVgSH(GH% ,4
,4< ソフトウェアパイプラインニング> Ug]Pc


4 6)
hfi\jD9:X[OGGI#!)wT ¤ÔÑ×wl×_Þø±§´Õ;ÖÐüĚĥąīĈģĩìæÐç
ħþĐĩĈīÕùâgMìÞøİÚígMèğĠĥ
ĕĩēDíėīă¡ í9.íjî®¬µ±§ÊÂÀ¢ÕàøİħþĐĩĈīÕ ÒçÐøéğĠĥĕĩēDí
ėīăîàëÐİĪğĠĥĕĩēDûÐøÕ;

wk'.


3d[q

wM)x|ty~} ty~}&B,4jty~}bkpks
CarpWr

L)x|


,4


2016年4月21日 計算科学技術 特論Ｂ*.+cPgORYXH 
*.+cPgORYXH 

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






x|vEx|v
128byte*kty~} 128byte*ktyx|vEx|vE

128byte*kty~} 128byte*kty~}
k{uzs j8ZrE
1 k<5kn
@k<5sk{uzk,4l 2 k= E=4j.
s=4j.
M)x| k%lUIOFRGIOFRHLGk= E
1 k<5kn
@k<5s=4j.
s=4j.
-["XM)x|-[:X}tk%lUk E_c[ef }t%l E
-["X
-[:X

,4h }tk+lJhirEL)x|irm\,4k+-sDo}tk+-s\#Zf,4h
<内側ループアンローリング(2)>L)x|}tk+s$sr[A<E

wT ¤ÔÑ×wl×

・以下の様な2つのコーディングを比較する。
_Þø±§´Õ;ÖÐüĚĥąīĈģĩìæÐç
mëíî¡©¢¡ª¢\ìèÖøãÙāĩĂġď
ĈĢÞø¡«¢ÕÚùö¡©¢¡ª¢¡«¢ÕbâÛù
vìJëđīČÕd
v3ì|ÛùâgMèÎ
áùöíđīČû(ÒørEì¡¬¢íĊąĉĢī
ĥĩĄÕèÖçÎÛöì¡­¢ídv3ÕW$ì`kèÖøgMèÏøÕJ


,4


do j=1,m,4
*.+cPgORYXH 
do i=1,n*.+cPgORYXH
*/+QaZVbH  x(i)=x(i)+a(i)*b+a(i+1)*dx|vEx|vE
128byte*kty~} 128byte*kty~} */+QaZVbH
x|vEx|vE
128byte*kty~}end 128byte*kty~}do

1 k<5kn
@k<5s=4j.
s=4j.
1 k<5kn
s=4j.

M)x|

@k<5s=4j.

M)x|

do j=1,mM)x|do i=1,n,2M)x|.
x(i)=x(i)+a(i)*b+a(i+1)*d,4GH%,4L)x|.
x(i+1)=x(i+1)+a(i+1)*b+a(i+2)*d< ソフトウェアパイプラインニング>*0+ H"=XTWbidgSL)x|end do*/+QaZVbH

-["X
-[:X
-["X
-[:X





L)x|L)x|

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





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

=4&B

=4&B

b(1)b(2)のロード(1)の演算do i=3,100

 69kDXx|s>]rE
69kDXxx|j7Xcs|s>]rE
p._,4s;iYE
x|j7Xcs^Y`rg,4k9s Xrp._,4s;iYE
^Y`rg,4k9s Xr^fZQgS)XcZVgSH(^fZQgS)XcZVgSH(,4
69kDXx
69kDXx
・最初のコーディングの演算量は4、ロード／ストア回数は4である|s>]rE|s>]rEx|j7Xcsx|j7Xcs
グの演算量は8、ロード／ストア回数は7である。
p._,4s;iYEp._,4s;iYE
^Y`rg,4k9s^Y`rg,4k9s(1)(2) (3) (4)(5)(6)(7)(8)M)x|M)x| Xr
 Xr
・最初のコーディングの演算とロード/ストアの比は4/4 、2つ目の-[:X!

. .
^fZQgS)^fZQgS)とロード/ストアの比は8/7となり良くなる。
XcZVgSH(,4

a(i+1)のロード
b(i)のロード
R
RHL(i-1)の演算 

R

i-2番目の結果のストア
end dob(100)のロード(99)(100)の演算
PTERNLILKKE(98)(99)(100)のストア
V=4LE
V=4ME
4#'6)h H J`Pgei_HC?K&N(AG)QSPEPT
h-RfZR;-,,$ 5-,,RfZRFF@L)

RHLXcZVgSH(L)x|L)x|-["X



*1+H
,4
GH%,4

< ソフトウェアパイプラインニング>

２SIMD Multi&Add演算器×２本

Ug]Pc

4 6)
hfi\jD9:X[OGGI#!)hfi\GX[OIjRfZRF#!)hIkRfZRF#!)hfi\GGX[OI]P_cPg BME=L
例えば以下の処理をを考える。
do i=1,100a(i)のロードb(i)のロード

(1)

2016年4月21日 計算科学技術 特論Ｂ



i番目の結果のストア
end do4#'6)h2RfZR;-,,$(2)

4h4s &j=49( 1 V+ V1 ) ×  = 8a(i)とb(i)の演算

52,,RfZR>>L^k(j?X1D-

1{tky!98,4×2GHz =16G,4/0

=qX@UwT ¤Á1Â¼0'

䛆diffusion༊㛫䠎䛇ホ౯༊㛫䝹䞊䝥༊㛫䠎䠍㻍㻐㼛㼙㼜㻌㼜㼍㼞㼍㼘㼘㼑㼘㻌㻒㻍㻐㼛㼙㼜㻒㻌㼜㼞㼕㼢㼍㼠㼑㻔㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻕㻌㻒㻍㻐㼛㼙㼜㻒㻌㼒㼕㼞㼟㼠㼜㼞㼕㼢㼍㼠㼑㻔㼒㼘㼡㼤㻕㻌㻌㻌㻌㼐㼛㻌㼘㻩㻝㻘㻭㻰㻹㼋㼘㼍㼘㼘㻌㻌㻌㻌㻌㻌㻌㻍
㻍㻐㼛㼙㼜㻌㼐㼛
㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼗㻩㻌㻝㻘㻌㻭㻰㻹㼋㼗㼍㼘㼘㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻗㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻵㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻗㻝㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛
㻔⥆䛟䠅

㻔⥆䛝䠅
㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻙㻝㻕㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻍㻍㻐㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻡㻣㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻢㻌㼙㼡㼘㻦㻢㻌㼘㼐㻦㻝㻞㻌㼟㼠㻦㻞㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻩㻔㻔㼢㼤㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼤㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼄㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼥㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼥㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼅㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㻔㼢㼦㼠㻔㼚㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻶㻕㻗㼢㼦㼠㻔㼚㻙㻝㻘㼗㻘㼘㻘㻭㻰㻹㼋㼀㻵㻕㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻳㻹㼀㻾㼋㻭㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻭㻰㻹㼋㻭㻶㻘㻳㻹㼀㻾㼋㻭㼋㻴㻺㼆㻕㻕㻖㻜㻚㻡㻰㻜㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻌㻩㻌㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㻔㼗㼔㻔㼚㻘㼗㻘㼘㻕㻗㼗㼔㻔㼚㻗㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㼗㻘㼘㻕㻕㻖㻜㻚㻡㻰㻜㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻍㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼟㼠㼍㼞㼠㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻘㻭㻰㻹㼋㼓㼙㼕㼚㻌㻌㻕㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼚㼑㼚㼐㻌㻌㻌㻩㻌㼟㼡㼒㻔㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻘㻭㻰㻹㼋㼓㼙㼍㼤㻌㻌㻕㻌㻌㻌㻌㻌㻌㻌㼐㼛㻌㼚㻌㻩㻌㼚㼟㼠㼍㼞㼠㻘㼚㼑㼚㼐㻍㻍㻐㻌㻌㻌㻌㻌㻌㻵㼚㼠㼑㼚㼟㼕㼠㼥㻌㻩㻌㻜㻚㻤㻣㻡㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼛㼡㼎㼘㼑㻌㼍㼐㼐㻦㻡㻌㼙㼡㼘㻦㻞㻌㼘㼐㻦㻣㻌㼟㼠㻦㻝㻍㻍㻐㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼕㼚㼠㼑㼓㼑㼞㻌㼍㼐㼐㻦㻞㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼐㼟㼏㼘㻔㼚㻘㼗㻘㼘㻕㻩㻔㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻗㼒㼘㼡㼤㻔㼚㻘㻭㻰㻹㼋㻭㻶㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻘㻭㻰㻹㼋㻭㻵㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻝㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻵㻶㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻙㼒㼘㼡㼤㻔㼚㻙㻭㻰㻹㼋㼓㼍㼘㼘㼋㻝㼐㻘㻭㻰㻹㼋㻭㻶㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻕㻌㻖㻌㻳㻹㼀㻾㼋㻼㼋㼢㼍㼞㻔㼚㻘㻭㻰㻹㼋㻷㻺㻻㻺㻱㻘㼘㻘㻳㻹㼀㻾㼋㻼㼋㻾㻭㻾㻱㻭㻕㻒㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㻖㻌㼒㼍㼏㼠㻌㻌㻌㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛

༊㛫䠎䠏

༊㛫䠎䠐

2016年4月21日 計算科学技術 特論Ｂ

༊㛫䠎䠎

29

¡«­"

高

FUJITSU CONFIDENTIAL

᭱ෆ䝹䞊䝥䛿䠐䛴䛾䝹䞊䝥䛷ᵓᡂ䛥䜜䛶䛔䜛䛯䜑䚸䛭䜜䛮䜜䜢༊㛫䠎䠍䡚༊㛫䠎䠐䛻ヲ⣽໬䛧䛶ศᯒ䜢⾜䛺䛳䛯䚹㻌㻌㻌㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼗㻌㻌㻌㻌㻌㻌㻌㻍
㻌㻌㻌㻌㼑㼚㼐㻌㼐㼛㻌㻍㻌㼘㻍㻐㼛㼙㼜㻌㼑㼚㼐㻌㼜㼍㼞㼍㼘㼘㼑㼘=qþđěĄęð@(5)改良コーディングの性能予測(要求B/Fが高いアプリについて）
14

改良
コーディングAICS サマースクール 2012の予測性能

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

䛆diffusion༊㛫䠎䛇ヲ⣽ศᯒ (3)性能推定(要求B/Fが高いアプリについて）㻷㻌䠿㼛㼙㼜㼡 㼠㼑 㼞ᐇ⾜᫬᝟ሗ

㻞㻝
㻞㻞
㻞㻟
㻞㻠

㡯┠

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

㻲䝢䞊䜽ẚ㻹㻲㻸㻻㻼㻿ᐇ⾜᫬㛫㻔⛊㻕㻝㻣㻚㻟㻜㻑
㻣㻚㻞㻥㻑㻝㻢㻚㻠㻢㻑
㻝㻝㻚㻣㻤㻑
㻝㻡㻚㻡㻥㻑
㻝㻞㻚㻟㻥㻑
㻝㻤㻚㻤㻟㻑
㻝㻠㻚㻢㻤㻑

㻞㻣㻢㻥
㻥㻟㻟㻤
㻞㻢㻟㻟
㻝㻡㻜㻤㻞
㻞㻠㻥㻠
㻝㻡㻤㻢㻠
㻟㻜㻝㻞
㻝㻤㻣㻥㻢

㻜㻚㻣㻡㻞
㻜㻚㻞㻞㻟
㻜㻚㻤㻜㻟
㻜㻚㻝㻠㻜
㻜㻚㻤㻠㻣
㻜㻚㻝㻟㻟
㻜㻚㻠㻠㻜
㻜㻚㻜㻣㻜

性能

༊㛫

オリジナル
㻟㻚㻟㻣
コーディング
㻡㻚㻣㻟
の予測性能
㻢㻚㻟㻢
⥲࿨௧ᩘ

㻞㻚㻟㻥㻱㻗㻜㻥
㻞㻚㻟㻥㻱㻗㻜㻥
㻞㻚㻠㻠㻱㻗㻜㻥
㻞㻚㻠㻡㻱㻗㻜㻥
㻞㻚㻠㻟㻱㻗㻜㻥
㻞㻚㻠㻠㻱㻗㻜㻥
㻝㻚㻢㻡㻱㻗㻜㻥
㻝㻚㻢㻡㻱㻗㻜㻥

㻢㻚㻞㻠

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

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

㻡㻚㻤㻥㻑
㻡㻚㻥㻟㻑
㻢㻚㻜㻣㻑
㻢㻚㻜㻜㻑
㻢㻚㻝㻤㻑
㻢㻚㻜㻣㻑
㻠㻚㻜㻟㻑
㻠㻚㻜㻢㻑

㻸㻝㻐㼙㼕㼟㼟ᩘ

㻟㻚㻣㻡㻑
㻟㻚㻣㻣㻑
㻜㻚㻜㻣㻑
㻜㻚㻝㻝㻑
㻜㻚㻜㻟㻑
㻜㻚㻝㻜㻑
㻜㻚㻤㻞㻑
㻜㻚㻤㻥㻑

༊㛫䠎䠍

༊㛫䠎䠏

༊㛫䠎䠎

㻤㻚㻜㻱㻙㻜㻝

㻸㻝㻐䝭䝇
ෆヂ
㼐㼙

㻝㻚㻟㻠㻱㻗㻜㻤
㻝㻚㻟㻡㻱㻗㻜㻤
㻝㻚㻠㻜㻱㻗㻜㻤
㻝㻚㻟㻥㻱㻗㻜㻤
㻝㻚㻠㻟㻱㻗㻜㻤
㻝㻚㻠㻝㻱㻗㻜㻤
㻢㻚㻝㻠㻱㻗㻜㻣
㻢㻚㻝㻣㻱㻗㻜㻣

⤒㐣᫬㛫

㼇㼟㼑㼏㼉
㻥㻚㻜㻱㻙㻜㻝

䝇䜿䞊䝷䝡
䝸䝔䜱

༊㛫䠎䠐

㻠㻚㻣㻜㻑
㻝㻠㻚㻟㻜㻑
㻣㻚㻟㻤㻑㻝㻤㻚㻡㻥㻑
㻤㻚㻤㻤㻑㻝㻣㻚㻝㻠㻑
㻡㻚㻝㻠㻑㻝㻝㻚㻟㻜㻑

㼇㼟㼑㼏㼉㻞㻚㻜㻱㻗㻜㻜
㻝㻚㻤㻱㻗㻜㻜

㻸㻝㻐䝭䝇
ෆヂ
㼔㼣㼜㼒

㻥㻡㻚㻞㻣㻑
㻤㻡㻚㻢㻡㻑
㻥㻞㻚㻡㻥㻑
㻤㻝㻚㻟㻣㻑
㻥㻝㻚㻜㻥㻑
㻤㻞㻚㻤㻝㻑
㻥㻠㻚㻣㻥㻑
㻤㻤㻚㻢㻜㻑

㻸㻝㻐䝭䝇
ෆヂ
㼟㼣㼜㼒

㻜㻚㻜㻟㻑
㻜㻚㻜㻡㻑
㻜㻚㻜㻟㻑
㻜㻚㻜㻠㻑
㻜㻚㻜㻟㻑
㻜㻚㻜㻠㻑
㻜㻚㻜㻣㻑
㻜㻚㻝㻜㻑

㻸㻞䝭䝇
ෆヂ
㼐㼙

㻸㻞㻐㼙㼕㼟㼟ᩘ㻤㻚㻡㻠㻱㻗㻜㻣
㻤㻚㻡㻥㻱㻗㻜㻣
㻝㻚㻡㻤㻱㻗㻜㻢
㻞㻚㻡㻝㻱㻗㻜㻢
㻤㻚㻜㻟㻱㻗㻜㻡
㻞㻚㻟㻞㻱㻗㻜㻢
㻝㻚㻞㻡㻱㻗㻜㻣
㻝㻚㻟㻢㻱㻗㻜㻣

㻜㻚㻝㻢㻑
㻜㻚㻡㻢㻑
㻞㻚㻣㻝㻑
㻡㻚㻤㻠㻑
㻡㻚㻣㻣㻑
㻝㻚㻝㻝㻑
㻜㻚㻞㻝㻑
㻝㻚㻜㻝㻑

㻸㻞䝭䝇
ෆヂ
㼜㼒

㻥㻥㻚㻤㻠㻑
㻥㻥㻚㻠㻠㻑
㻥㻣㻚㻞㻥㻑
㻥㻠㻚㻝㻢㻑
㻥㻠㻚㻞㻟㻑
㻥㻤㻚㻤㻥㻑
㻥㻥㻚㻣㻥㻑
㻥㻤㻚㻥㻥㻑

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

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

㻝㻤㻚㻣㻜
㻡㻣㻚㻞㻤
㻜㻚㻟㻠
㻞㻚㻣㻡
㻜㻚㻝㻢
㻟㻚㻝㻜
㻠㻚㻤㻝
㻞㻣㻚㻥㻟

(4)性能チューニング
㻯㻼㼁᫬㛫

༊㛫䠎䠍

༊㛫䠎䠎

㻤㻑
㻤㻑
㻤㻑

(2)プロファイラー測定結果を使った問題の発見ͤ䠔䝁䜰䛾ྜィ༊㛫䠎䠏㼟㼠㼛㼞㼑࿨௧
⋡

㻞㻞㻚㻤㻣
㻣㻣㻚㻢㻢
㻞㻞㻚㻠㻜
㻝㻞㻢㻚㻤㻡
㻞㻝㻚㻢㻜㻝㻟㻡㻚㻜㻠
㻝㻣㻚㻤㻣㻝㻝㻞㻚㻝㻡

㻝㻟㻑༊㛫䠎䠐㻝㻚㻢㻱㻗㻜㻜

㻣㻚㻜㻱㻙㻜㻝

㻝㻚㻠㻱㻗㻜㻜

㻢㻚㻜㻱㻙㻜㻝

㻝㻚㻞㻱㻗㻜㻜

㻡㻚㻜㻱㻙㻜㻝

㻝㻚㻜㻱㻗㻜㻜

㻠㻚㻜㻱㻙㻜㻝

㻤㻚㻜㻱㻙㻜㻝
㻟㻚㻜㻱㻙㻜㻝
㻞㻚㻜㻱㻙㻜㻝
ᾋືᑠᩘⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱

㻝㻚㻜㻱㻙㻜㻝

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

㻜㻚㻜㻱㻗㻜㻜
㻝㼠㼔㻌㼟㼕㼙㼐

オリジナル
性能

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

㻤㼠㼔㻌㼟㼕㼙㼐

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

㻝㼠㼔㻌㼟㼕㼙㼐

低

diffusion༊㛫䠎䛻㛵䛧䛶༊㛫䠎䛻㛵䛧䛶

㻢㻚㻜㻱㻙㻜㻝

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

㻤㼠㼔㻌㼟㼕㼙㼐

㻠㻚㻜㻱㻙㻜㻝

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

㻝㼠㼔㻌㼟㼕㼙㼐

㻤㼠㼔㻌㼟㼕㼙㼐

㻝㼠㼔㻌㼟㼕㼙㼐

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

㻤㼠㼔㻌㼟㼕㼙㼐

㻝㼠㼔㻌㼟㼕㼙㼐

㻤㼠㼔㻌㼟㼕㼙㼐

㻝㼠㼔㻌㼟㼕㼙㼐

㻤㼠㼔㻌㼟㼕㼙㼐

㻝㼠㼔㻌㼟㼕㼙㼐

㻤㼠㼔㻌㼟㼕㼙㼐

㻝㼠㼔㻌㼟㼕㼙㼐

㻤㼠㼔㻌㼟㼕㼙㼐

䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛷䛒䜛䛯

䜑L2$䝭䝇䜢ῶ䜙䛩ᨵၿ䛜௒ᚋ䝭䝇䜢ῶ䜙䛩ᨵၿ䛜௒ᚋ(1)プロファイラーを使った測定䛾䠄䜰䝥䝸䛾䠅ㄢ㢟䛷䛒䜛䜎䛪༊㛫䠎䠍䛷L2$䝭䝇䠄䝯䝰䝸䜰䜽䝉䝇)䛩䜛䛯䜑䝯䝰䝸㈇Ⲵ䛜㧗䛟䠔୪ิ᫬䛻䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛䚹୍᪉䚸༊㛫䠎䠎䚸䠎䠏䚸䠎䠐䛿䚸䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛻㝗䜛
計算科学技術 特論Ｂ 䝠䝑䝖䛧䚸༊㛫䠎䠍䛷L2$䛻஌䛫䛯䝕䞊䝍䜢෌฼⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜䛻஌䛫䛯䝕䞊䝍䜢෌฼⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜L2$䝠䝑䝖䛧䚸༊㛫䠎䠍䛷 2016年4月21日
䛻஌䛫䛯䝕䞊䝍䜢෌฼⏝䛩䜛䛯䜑ከ䛟䛾䝕䞊䝍䛜
L2$䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛䚹䝇䝹䞊䝥䝑䝖䛜㧗䛟䛺䜛༊㛫䠎䛾ᾋືᑠᩘⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶э diffusion༊㛫䠎䛾ᾋືᑠᩘⅬ䝻䞊䝗䜻䝱䝑䝅䝳䜰䜽䝉䝇ᚅ䛱䛜ከ䛟䛺䛳䛶䛔䜛୍␒䛾ཎᅉ䛿༊㛫䠎䠍䛾䝯䝰䝸䝇䝹䞊䝥䝑䝖䝛䝑䜽䛾ᙳ㡪䛷䛒䜛䚹䠔୪ิ᫬䛻ᾋືᑠᩘⅬ䝻䞊䝗䜻䝱䝑䝅䝳30䜰䜽䝉䝇ᚅ䛱䛜ቑ䛘䛶䛧䜎䛖䚹

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

ht into
g proarchisigns.
model
g it on値
rs us値ls.

efficiency-level programmers want tomeasure traffic between the caches
and DRAM. This subtle change allows
them to include memory optimizations of a computer into our boundand-bottleneck model. Second, we

4.
A*
a
×
4.1

,

×
b
c
ĖěĈĔèęďāĖsw
aFigure 1: Roofline model for (a) AMD Opteron X2 and (b) Opteron X2 vs. Opteron X4.

A+

and
,25
can
perforrarely
mproveompile diffi-abenchmark,22 for this work we wrote
a series of progressively optimized
microbenchmarks designed to determine sustainable DRAM bandwidth.
They include all techniques to get thebest memory performance, including

w

128

4

×

(a)

r
A+• ĔīēÿĀüí@$nëğĠĥĕĩēDĺ±A+ • ĔīēÿĀüíėīăKĺ´w• üĚĥąīĈģĩídvGEĺ¼°Ã§¿xsr• üĚĥąīĈģĩí_ĘĨďĚĊĺÃ• üĚĥąīĈģĩí_ĕþĒĺ¿
×
A+
8(<
r
w
x u z
roach
lysis.”A+xx yüĚĥąīĈģĩíKĺ
perforrnsightxx
w
A+ÍÍÍÍÍÍÍÍÆÄÇĬ´į±£¼ĭ
ng thep
G>B:
ms. Inof the
,
× x
x
y w
y w
d and
S. Williams, A. Waterman, and D. Patterson: Roofline: an(b)
A* visual performance model for multicore architectures.
sinsightful×x y s wa*perCommun.
ACM, 52:65–76, 2009.
×w
dahl’sx
x
e gainA+rby the±£¼°±£¡Ã§¿¢°±£´£Ã§¡¿£´¢°¡±§´¢§¡¿§Ã¢£´
s s
x
×
A+
w
ogram
eroge- A+ A+
srüĚĥąīĈģĩíKÍÍÍÍĺÆÄÇ¡´¥¡±§´¢§¡¿§Ã¢£´¢×A+üĚĥąīĈģĩíėīăK^ĺÆÄÇ¡©¦¨¥¡±§´¢§¡¿§Ã¢¢
s
s
8(<
w
x u z
f-chipbe the A+A+r
2016年4月21日 計算科学技術 特論Ｂm pers+modelp
G>B:A+
nce toxy w
xy w
d thisA+
nal in×x y s wĖěĈĔèęďāĖ××xG
BSPbP%
B
P]SO_TP%
A+SPbP
9P
x
xA+ P]SO_TP
s s
x
E_TP
y
s
A+
¸Á¾Ë¾ s¡©¢ğĠĥww
BbXsT A+A+ss
• ğĠĥđīČĺ¸Á¾Ë¾
A+
ww
A+bX
9bX T
t
¸¿¾ÇÁ
• @$ğĠĥĕĩēDĺ¸¿¾ÇÁį
A+ T• ğĠĥđīČq%Uĺ¸ËÄÆÂ
A+
A+
y

A+
A+ s

32

peak floating-point performance

am)
(stre
idth
ndw
a
b
ory
mem
peak

16
8

4

2
1

Operational Intensity 2(compute-bound)

Operational Intensity 1(memory-bound)

Attainable GFlops/sec

64

1/2

1/4

1/2

1

2

4

8

16

Operational Intensity (Flops/Byte)

128

Opteron X4

Attainable GFlops/s

64

32

Opteron X2

16
8

4

2
1

1/2

1/4

1/2

1

2

4

8

16

Operational Intensity (Flops/Byte)

R I L 2 0 0 9 | VO L . 5 2 | N O. 4

A+¡ª¢dv
Mtime=Mdata/Mband_peak• ĚĨĄĤĞdvĺ²¾
BSPbP% B P]SO_TP % A+SPbP A+ P]SO_TP
9P• dvėīăKĺºÉÂ¾Å
L2time=L2data/L2band_peak
E_TPys• VBdvUĺ²ËÄÆÂww
BbX T A+s
Ctime=Ca/Ppeak• @Uĺ³Ì½ËÄÆÂ
ww
A+bX T
9bX T
t
y

ºÉÂ¾Å

×
* ×
+ ×
,
Mtime=Mdata/Mband_peak
BbX T A+bX 演算器の処理とメモリのデータ
T 9bX T
L2time=L2data/L2band_peak
Ctime=Ca/Ppeak
fObX T の処理が同時に終わるモデル
9_




×

*

×

+ ×
,
Ex_time=max(Mtime,L2time,Ctime)
BbX T A+bX T 9bX T
fObX T
9_
Cp= Ca/(max(Mtime,L2time,Ctime)*Ppeak)

2016年4月21日 計算科学技術 特論Ｂ Ex_time=max(Mtime,L2time,Ctime) Cp= Ca/(max(Mtime,L2time,Ctime)*Ppeak)rĖěĈĔèęďāĖ××xG
4.
a
b
c
x
x y
Ex_time=Mtimeの場合
ax
Ex_time=Ctimeの場合
x
w
A+
4.1
a
,
× w A+
A+
A*
s
x
s
s
×
w
r
×
A+r
w
A+
r x y
x
x
x
w
A+
×
A+
<
w
x u z
,
×
r
A*
s
p
G>B:
×
w
x
y w
x
y w r
+
× w
x y s w
×
A+
x
A+ x
r
s s
×
A+ x
+ 8(<
w
sx u z2016年4月21日 計算科学技術 特論Ｂ

A+
r
s
s
p
G>B:
A+
x
y w
x
y w
ĎďĕÔîĐÿöđW'\>Ó×=qXďāĖA+×
x y s wA+xx
Ex_time=L2timeの場合¡©¢ğĠĥ
BSPbP%
B
P]SO_TP%
A+SPbPA+P]SO_TP
9P• ğĠĥđīČĺ¸Á¾Ë¾
s sx
A+ E_TP• @$ğĠĥĕĩēDĺ¸¿¾ÇÁįy ss• ğĠĥđīČq%Uĺ¸ËÄÆÂ·ªÁ¾Ë¾s BbX T A+wws ¸¿¾ÇÁs
¡ª¢·ªĂġďĈĢww• ·ªđīČĺ·ªÁ¾Ë¾Í
A+bX T A+
9bX T
t
+
A+
•y@$·ªĕĩēDĺ·ª¿¾ÇÁ
• ·ªđīČq%Uĺ·ªËÄÆÂA+
Mtime=Mdata/Mband_peak·ª¿¾ÇÁ
¡«¢dv BSPbP% B P]SO_TP % A+SPbP A+ P]SO_TP
L2time=L2data/L2band_peak• ĚĨĄĤĞdvĺ²¾
E_TP
ys• dvėīăKĺºÉÂ¾ÅCtime=Ca/Ppeak
ww
BbX T A+s
• VBdvUĺ²ËÄÆÂ• @Uĺ³Ì½ËÄÆÂww
A+bX TėīăK^ĺ²É•
× y* ×
+

9bX T

9P

t

×
,
Mtime=Mdata/Mband_peak
BbX T A+bX T 9bX T
L2time=L2data/L2band_peak
fObX T
Ctime=Ca/Ppeak

9_ Ex_time=max(Mtime,L2time,Ctime)
×
* ×
+ ×
,
 (*)FIT2015，RA-003「キャッシュの効果を考慮したルーフラインモデルのCp= Ca/(max(Mtime,L2time,Ctime)*Ppeak)
BbX T A+bX T 9bX T
拡張によるプログラムの性能予測」南一生他

fObX T2016年4月21日 計算科学技術 特論Ｂ

9_

BbX T6A+bX
T r x A+x
Ex_time=max(Mtime,L2time,Ctime)

u

z

r

ċěøÔÕã=qğĠĥĕĩēDĬĽĿ^ĭħþĐĩĈĬoAĭ

ÍĽĿ^ĻĲİķ(@$:0.36)
ĳĲĲ
kłĴĂġďĈĢÍĸŃĽıĳĴŅļņ
ĳĲ
ÍĽĿ^ĻĴ(j)ÍĆüÍÍÍÍÍÍÍÍÍÍÍÍ
łĳĂġďĈĢĵĴŁıĴŅļņ

ĳ

ĽĿ^ĻĶ(j)ńŀŃľdv3

×ĹĆü

16GFLOPSĎďĚ
2016年4月21日 計算科学技術 特論Ｂ

35ĎďĕÔîĐÿöđæïúøğĠĥĺĨīēĳ

·©ĺĨīē©

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 doend doend doğĠĥĺĨīēĳįĊĒüĳ

2016年4月21日 計算科学技術 特論Ｂ·©ĺĨīēª36ĖěĈĔèęďāĖÖàã=qxfâ
do J = 1, NY
do I = 1, NX

n

(K

n 1

1

do K = 3, NZ-1
3DZV (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 doend do

)4
6
5

Byte

end do30:

1store,2load:

2

4x3 = 12byte
flop:
/.

2016年4月21日 計算科学技術 特論Ｂ

37


Ĝ

2016年4月21日 計算科学技術 特論ＢcĀïĄÿï×ąěăéêæĚòęĆèĔÖÑ¼Ò×{Ø åBÔÈÍ{ÓÉĝ

38

=$L1

øėÿă!
jjループをブロック分割
do j=1,ndo i=1,nix(i, j) = a(i, j)*b(i, j) + c(i, j)

T0 T1 T2 T3 T4 T5 T6 T7
Ti：スレッドiの計算担当

2016年4月21日 計算科学技術 特論Ｂ¡¥U_×øėÿă!
Ø_Ö3òėøîěyåa¼Í¡¥U×æĖóĕùčÓ»ãĞ_ÖØtºÕGUå½ÆÔÁNãĞ
¾Ù.|HÈÍíéøĚõèāĖUiÓ»ãĞ
¡¥U×M Ó»ãuċïĂĖfĚfĚċïĂĖ×+i×_Øk"Ö×ĉĘÿïÇäÍøėÿă!å[YÕÆÔÁNãĞ
1.ICCG法のアルゴリズム
ÈÀÈíéøĚõèāĖ_Ø.}p×à½ÖĕìėęøÁ»ãĞ
ステップ1:

αk = (rik •(LL T )−1 rik )/(Apik • p ik )ステップ2:

xi = xi +α pi

ステップ3:

ri k+ 1 = ri k − αk Apik

ステップ4:

β k = (rik+1 •(LLT ) −1 rik+1 ) /(ri k •(LLT ) −1 rik )ステップ5:

pi = (LL ) ri + β pi

2016年4月21日 計算科学技術 特論Ｂ

k+ 1

k+ 1

k

k

k

T −1 k+1



k k¡¥U_×øėÿă!
ĕìėęøÁ»ãÔ.}p×à½Ö2Á»â_ÁÓÂÕ¼ĞÑÜâÆ×ÜÜÓØøėÿă!ÞÓÂÕ¼Ğ

ËÆÓ¾Ù¬£¢ ¨¡§øçěĊÖJC¾ĕìėęøå$ÈËäÌä×ĖěĊåĉĘÿïÖàãøėÿă!åu½Ğ
RED-BLACKスイープ

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

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

2016年4月21日 計算科学技術 特論ＢĘěăĚøĂæ×]!
ZjÔĘěăĚøĂæS×D, < 内側ループアンローリング>• 以下の様な2 つのコーディングを比較する。
do j=1,m
do i=1,nx(i)=x(i)+a(i)*b+a(i+1)*d
end doend dodo j=1,m
do i=1,n,2x(i)=x(i)+a(i)*b+a(i+1)*dx(i+1)=x(i+1)+a(i+1)*b+a(i+2)*d
end doend do• 最初のコーディングの演算量は4 ,ロード/ストア回数は4 である.2 つ目のコ ーディングの演算量は8 ,ロード/ストア回数は7 である．
• 最初のコーディングの演算とロード/ ストアの比は4/4,2つ目のコーディングの演算とロード/ストアの比は8/7となり良くなる．
2016年4月21日 計算科学技術 特論Ｂ

42

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

ĘěăĚøĂæ×]!

ZjÔĘěăĚøĂæS×D,<外側ループストリップ・マイニング><外側ループストリップ・マイニング>・i j 型のコーディングを以下のようなものとする。
・i j 型のコーディングを以下のようなものとする。
<アウトオブオーダー実行>
do i=1,ndo
i=1,n・do各命令間の依存関係をチェックしレジスタリネーミングによりレジスタ番号付けを行っ
j=1,m
do
j=1,m
たあと、これを効率よく実行するためには、演算器を複数もったプロセッサを用意し動y(i)=y(i)+a(i,j)*x(j)y(i)=y(i)+a(i,j)*x(j)的に順序を入れ換えて命令を実行する必要がある。
・ これをアウトオブオーダー実行という。
・この場合a(i,j)、x(j)の２個をロードして２個の演算を実施する。y(i)はレジスタ上に保・この場合a(i,j)、x(j)の２個をロードして２個の演算を実施する。y(i)はレジスタ上に保持しておけばよい。
持しておけばよい。
<外側ループストリップ・マイニング>・したがって演算とロード/ストアの比は1/1である。
・したがって演算とロード/ストアの比は1/1である。
j 型のコーディングを以下のようなものとする。
・j・i
i 型のコーディングを以下のようなものとする。
・j do
i 型のコーディングを以下のようなものとする。
i=1,ndo j=1,n
do do
j=1,n
j=1,m
do i=1,mdo y(i)=y(i)+a(i,j)*x(j)i=1,my(i)=y(i)+a(i,j)*x(j)y(i)=y(i)+a(i,j)*x(j)・この場合a(i,j)、x(j)の２個をロードして２個の演算を実施する。y(i)はレジスタ上に保・この場合a(i,j)、y(j)の２個をロードし、さらにy(j)をストアし２個の演算を実施する。
・この場合a(i,j)、y(j)の２個をロードし、さらにy(j)をストアし２個の演算を実施する。
持しておけばよい。
・したがって演算とロード/ストアの比は2/3である。
・したがって演算とロード/ストアの比は2/3である。
・したがって演算とロード/ストアの比は1/1である。
・以下のようなコーディングを外側ループストリップ・マイニングという。
・以下のようなコーディングを外側ループストリップ・マイニングという。
2016年4月21日
特論Ｂ

・j i 計算科学技術型のコーディングを以下のようなものとする。
do is=1,m,10
dodois=1,m,10j=1,n
do j=1,ndodoj=1,ni=1,mdo i=is,min(is+9,m)do y(i)=y(i)+a(i,j)*x(j)i=is,min(is+9,m)y(i)=y(i)+a(i,j)*x(j)y(i)=y(i)+a(i,j)*x(j)ĘěăĚøĂæ×]!

・この場合a(i,j)、y(j)の２個をロードし、さらにy(j)をストアし２個の演算を実施する。
・このコーディングの最内ループをアンローリングする。
・このコーディングの最内ループをアンローリングする。
・したがって演算とロード/ストアの比は2/3である。
do is=1,m,10do
is=1,m,10・以下のようなコーディングを外側ループストリップ・マイニングという。
do j=1,ndo
do j=1,n
is=1,m,10y(is)=y(is)+a(is,j)*x(j)doy(is)=y(is)+a(is,j)*x(j)j=1,ny(is+1)=y(is+1)+a(is+1,j)*x(j)y(is+1)=y(is+1)+a(is+1,j)*x(j)doi=is,min(is+9,m)
・・・・
・・・・
・・・・
・・・・
y(i)=y(i)+a(i,j)*x(j)y(is+9)=y(is+9)+a(is+9,j)*x(j)y(is+9)=y(is+9)+a(is+9,j)*x(j)ZjÔĘěăĚøĂæS×D,・このコーディングの最内ループをアンローリングする。
・この場合a(is,j)・・a(is+9,j)の10個とx(j)の1個をロードするのみですむ。y(js)・・
個をロードするのみですむ。y(js)・・
・この場合a(is,j)・・a(is+9,j)の10個とx(j)の1
do is=1,m,10y(is+9)はレジスタ上に保持しておけばよい。この間20個の演算を実行する。
y(is+9)はレジスタ上に保持しておけばよい。この間20個の演算を実行する。
do j=1,n・したがって演算とロード/ストアの比は20/11である。
・したがって演算とロード/ストアの比は20/11である。
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である。
2016年4月21日 計算科学技術 特論ＢĘěăĚøĂæ×]!
ĊĕĈêÿþ×LaĊĕĈêÿþÖØąěăéêæĊĕĈêÿþÔûĈĂéêæĊĕĈêÿþÁ»ãĞąěăéêæĊĕĈêÿþØnÕîĐÿöđĔèę×æïúøÔÕãÖ
Ñ¼Òr cÖRqÉãĞûĈĂéêæĊĕĈêÿþØòęĆèĔÁ<wÓ»äÙr cÖ* åAÉãĞĒěõěÁòęĆèĔëĊöēęßāçėïĀçĉÓAÉãÞÓÂãĞąěăéêæĊĕĈêÿþØĖěĊ×æïúøEÁ4×Eå~¾ãÔÀÕÃÕãĞË×0'ØæïúøÉãåm'ÉãČě÷Ós¼OÁ;áäã0'Á»ãĞ
do i=1,ndo i=1,n・・・・・・・・・・・・

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

・・・・・・・・・・・・

2016年4月21日 計算科学技術 特論ＢĘěăĚøĂæ×]!
インダイレクトアクセスプリフェッチの効果ĊĕĈêÿþ×La（最適化制御行チューニング）ĒěõěÁòęĆèĔëĊöēęßāçėïĀçĉÓAÉãÞÓÂãĞāçėïĀçĉÖàãûĈĂéêæĊĕĈêÿþ`?×Ğ

prefetch指示子を指定することでインダイレクトアクセス（リストアクセス）に対します。その結果、データアクセス待ちコストが改善されました。
改善後ソース（最適化制御行チューニング）

51!ocl prefetch<<< Loop-information Start >>><<< [PARALLELIZATION]<<< Standard iteration count: 616<<< [OPTIMIZATION]<<< SIMD<<< SOFTWARE PIPELINING<<< PREFETCH: 32
インダイレクトアクセス（配列<<<c: 16, b: 16b, c）に対するプリフェッチが<<< Loop-information End
>>>
生成された
1 pp 2v
do i = 1 , n
1 p 2va(i) = b(d(i)) + scalar * c(e(i))
1 p 2v
enddo

52
53
54

3.5E-01
3.0E-01
2.5E-01
2.0E-01
1.5E-01

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

1.0E-01
5.0E-02
0.0E+00
改善前

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

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

改善前[秒]
4.0E-01

改善後
2016年4月21日 計算科学技術
特論Ｂ

0.01%
0.01%

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

42.62%
24.37%

L1D ミス数

2.13E+08
2.19E+08



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

97.24%
37.55%

L1D ミス hwpf 率(/L1D ミス数)

2.76%
5.69%

L1D ミス swpf 率(/L1D ミス数)

0.00%
56.76%

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

6.67%
5.82%

L2 ミス数

3.34E+07
5.24E+07

L2 ミス(/L2 ミ配列マージとはĔèęæïúø×La

配列マージとは、同一ループ内でアクセスパターンが共通の配列が複数あるĕøĂæïúøÓµ¶·²³´×9QåæïúøÉãà½Õ0'Čě÷Ö
場合、１個の配列に融合することです。データアクセスを連続化して、キャッàâîĐÿöđĔèę×æïúø]åÝáäã0'Á»ãĞ
シュ効率を向上させます。
改善前ソース

改善後（コンパイラ最適化イメージ）

parameter(n=1000000)
real*8 a(n), b(n), c(n)integer d(n+10)

parameter(n=1000000)
real*8 abc(3, n)
integer d(n+10)：
do iter = 1, 100
do i = 1 , n：
do iter = 1, 100
do i = 1 , n

配列マージ（L1Dキャッシュ）a(d(i)) = b(d(i)) + scalar * c(d(i)) a( d(i))
・・・
enddo
a( d(i+1))
enddo
・・・
：
b( d(i))・・・
異なるキャッシュラインb( d(i+1))
のアクセス
・・・
c( d(i))・・・c( d(i+1))
キャッシュへのアクセス順番

ii = d(i)abc(1,ii) = abc(2,ii) + scalar * abc(3,ii)
enddo（L1Dキャッシュ）

enddo
：

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

・・・

Copyright 2012 RIKEN AICS

103

2016年4月21日 計算科学技術 特論Ｂ

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))
・・・

RIKEN AICSチューニングチュートリアルよりĔèęæïúø×LaøĂĔèăæïúøånæïúø!ÉãÆÔÖàâĔèęæïúø×
ループ交換のチューニング内容Laå/ãĞ
① 配列aを２次元配列にする

改善前ソース

do j=1,n1
do i=1,n2

do j=1,n1
do i=1,n2a(i) = s1 + c(j,i) / (s1 + s2 / d(j,i))
enddo
do i=2,n2b(j,i) = a(i) / (s2 + s1 / a(i-1))a(j, i) = s1 + c(j,i) / (s1 + s2 / d(j,i))
enddo

ループ１

do i=2,n2b(j,i) = a(j, i) / (s2 + s1 / a(j,i-1))

ループ２

enddo
enddo

enddo
enddo

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

配列b、c、d はストライドア
クセスなので、キャッシュ効率が悪い③ ループを交換する② ループ１とループ２を分割する

do i=1,n2
do j=1,n1

do j=1,n1
do i=1,n2a(j, i) = s1 + c(j,i) / (s1 + s2 / d(j,i))
enddoa(j, i) = s1 + c(j,i) / (s1 + s2 / d(j,i))
enddo

enddo
do i=2,n2
do j=1,n1b(j,i) = a(j, i) / (s2 + s1 / a(j,i-1))
enddo
enddo

2016年4月21日
計算科学技術 特論Ｂ
Copyright 2012 RIKEN AICS

enddo
do j=1,n1

配列b、c、d が連続ア
クセスになりキャッシュ効率が改善される 97

do i=2,n2b(j,i) = a(j, i) / (s2 + s1 / a(j,i-1))
enddo
enddo

îĐÿöđ×Lauuf×zjĉĘÿîęð
®

¯

＝

±§´
°q%(Byte)/dv(Flop)×

2N3ídv

N2íđīČ

N2íđīČ

=2N2/2N3=1/N#_cÖØªÁ1Â¼e6ÇÕ^5×æĊĕñěöēęÓØªÁ»ãe8×1ÂÇÖÕãÔĎďĕocÖØ®ØîĐÿöđÖÐÒÞ¯ØáÕ¼ÔÕã

®

¯

＝

×

ËÆÓuå6uÖĉĘÿïÈ®Þ¯ÞîĐÿöđÖãà½ÖÈÒ
îĐÿöđ×āěüÎÄÓzjÉãà½ÖÉãÓ=q)å5^ÉãĞ
2016年4月21日 計算科学技術 特論ＢîĐÿöđ×LaĉĘÿîęð
paèāã¾ÁA§½È
Ëñþæ×ÿÙ~¾paèāãÎñþæ
×ÿÙ±¼©Épa{&½Ûïā~ ¾èāãÎ T±¸$¾k\Î,<~
¾k\`EÎpa{&½Ûïā~

(1)
N
(2)

N2	

dX½¾Ûïā¿¾Ôāäā¾R¹¤ËµÅ Ôāäā¾k\>v½IÃ
R>v¿/°¥ăN(3)

2016年4月21日 計算科学技術 特論Ｂ実行順序①～④

キャッシュへの格納が２のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなりまキャッシュへの格納（競合）
ソース例す。
注：ストリームとは、ループの回転に伴って参照定義される一連のデータのことです。
（メモリ上のデータ配置） 実行順序
キャッシュスラッシングとは、キャッシュ上の特定のインデックス（キャッシュ上の位置（L1Dキャッシュ）subroutine sub(a, n, m) ※n=256, m=256
①
1WAY
2WAY
a( 1, 1, 1)
情報）のデータだけが頻繁に上書きされる現象のことです。この現象は、配列サイズ

ッシングとはュスラッシングとはキャッシュスラッシングとはュスラッシングとはが２のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなりま
real*8 a(n, m, 4)

実行順序①～④キャッシュへの格納îĐÿöđ×La・ ・ ・
256×256×8B
do j = 1 , m
は、キャッシュ上の特定のインデックス（キャッシュ上の位置
シングとは、キャッシュ上の特定のインデックス（キャッシュ上の位置=32×16KB
キャッシュへの格納（競合）a ( 16, 1, 1)
ソース例 do i = 1 , n
離れたアクセスす。
注：ストリームとは、ループの回転に伴って参照定義される一連のデータのことです。（メモリ上のデータ配置） 実行順序
繁に上書きされる現象のことです。この現象は、配列サイズ
だけが頻繁に上書きされる現象のことです。この現象は、配列サイズ（L1Dキャッシュ）ッシングとは、キャッシュ上の特定のインデックス（キャッシュ上の位置
・・・
subroutine sub(a, n, m) ※n=256,
a(i,キャッシュスラッシングとは、キャッシュ上の特定のインデックス（キャッシュ上j, m=2564) = a(i, j, 1) + a(i, j, 2) + a(i, j, 3)
128エントリ
①
1WAY
2WAY
②
a( 1, 1, 1)a( 1, 1, 2)
びループ内のストリーム数が多い場合に発生しやすくなりま場合およびループ内のストリーム数が多い場合に発生しやすくなりまだけが頻繁に上書きされる現象のことです。この現象は、配列サイズ
real*8 a(n, m, 4)
enddo
キャッシュへの格納
実行順序①～④

情報）のデータだけが頻繁に上書きされる現象のことです。この現象は、配列・ ・ ・
256×256×8B・ ・ ・
256×256×8B
do j = 1 , m
enddoの場合およびループ内のストリーム数が多い場合に発生しやすくなりま
注：ストリームとは、ループの回転に伴って参照定義される一連のデータのことです。
注：ストリームとは、ループの回転に伴って参照定義される一連のデータのことです。
キャッシュへの格納（競合）=32×16KB=32×16KBøĔÿöęð
が２のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすa ( 16, 1, 1)
a ( 16, 1, 2)
ソース例 do i = 1 , n
End
離れたアクセス
離れたアクセス
注：ストリームとは、ループの回転に伴って参照定義される一連のデータのことです。
（メモリ上のデータ配置） 実行順序・ ・ ・（L1Dキャッシュ）・ ・ ・subroutine sub(a, n, m) ※n=256,m=256a(i, j, 4)= a(i, j, 1) + a(i, j, 2) + a(i, j, 3)
128エントリ
今回の例の場合、a(1,1,1)、③
キャッシュへの格納
キャッシュへの格納
実行順序
①～④
実行順序
①～④
①
1WAY
2WAY
②
a( 1, 1,注：ストリームとは、ループの回転に伴って参照定義される一連のデー
1)a( 1, 1, 3)
 L1Dキャッシュスラッシングの目安
a( 1, 1, 2)
アクセス時にキャッシュの追い出しが発生(スラッシング)
real*8 a(n, m, 4)
enddo
a(1,1,2)、a(1,1,3)、a(1,1,4)はそキャッシュへの格納
実行順序①～④キャッシュへの格納（競合）キャッシュへの格納（競合）
・
・
・
・
・
・
・
・
・
256×256×8B
れぞれ32×16KBずつ離れている
256×256×8B
256×256×8B
L1D ミス率L1D ミス dm率
ス例 do j = 1 , m
enddo=32×16KB
キャッシュへの格納（競合）=32×16KB=32×16KB
a （16KB境界にある）ため4つが同( 16, 1, 1)
a ( 16, 1, 3)（メモリ上のデータ配置）（メモリ上のデータ配置）
実行順序
a ( 16, 1, 2)(/ロード・ストア数)(/L1D実行順序
ミス数)
ース例 do i = 1 , n（L1Dキャッシュ）End1way
離れたアクセス
2way（L1Dキャッシュ）離れたアクセス
m=256
離れたアクセスm)※n=256, m=256
キャッシュへの格納
実
じインデックスに割り当てられる。
（メモリ上のデータ配置） 実行順序
単精度
3.125%以上（L1Dキャッシュ）
・
・
・
・
・
・
・
・
・
1WAY
1WAY
2WAY
2WAY
a(i, j,m=2564) = a(i, j, 1) + a(i, j, 2) + a(i, j, 3), m) ※n=256,
a( 1, 1,今回の例の場合、a(1,1,1)、
1) 1,
a(
1, 1)
20%以上
128エントリ
そのため1つ目、2つ目のデータが倍精度
6.250%以上
③
①
④
1WAY
2WAY
②
a( 1, 1, 2)
a( 1, 1, 3)
1, 1, 1)a(キャッシュへの格納（競合）
1, 1, 4)
 L1Dキャッシュスラッシングの目安・ ・ a(enddo
3つ目、4つ目のデータに上書きさ・a(1,1,2)、a(1,1,3)、a(1,1,4)はそ・ 256×256×8B
・ ・
256×256×8B
ソース例
・ ・ ・
・ ・ ・
256×256×8B
256×256×8B・ ・ ・れる。
256×256×8B・ ・ ・L1D ミス率L1D ミス dm率=32×16KB
enddo（メモリ上のデa ( 16, 1,れぞれ32×16KBずつ離れている
a1)( 16,=32×16KB
1, 1) =32×16KB（L1Dキャッシュ）=32×16KB=32×16KB
単精度:1/32（32回に1回ミスをする）
離れたアクセスa ( m=256
16, 1, 2)
a ( 16, 1, 3)
a ( 16, 1, 4)
a（16KB境界にある）ため4つが同( 16, n,1,離れたアクセス
1) ※n=256,
subroutine
sub(a,m)(/ロード・ストア数)
(/L1D
ミス数)
End
離れたアクセス
離れたアクセス
離れたアクセス
・
・
・
・
・
・
1WAY
じインデックスに割り当てられる。
j, 3)
)a(i,
+ a(i,j, 2) + a(i, j, 3)
単精度 3.125%以上
・ ・ ・
倍精度:1/16（16回に1回ミスをする）
・ ・ ・ 2WAY
・ ・ ・
a( 1,
・ ・ ・
128エントリ
1) + a(i, j, 2) +128エントリ
a(i, j, 3)
20%以上
real*84)a(128エントリ
そのため1つ目、2つ目のデータが③a( 1, 1, 4)a(a(n,
1, m,
1,2) 1, 1, 2)
倍精度 6.250%以上 今回の例の場合、a(1,1,1)、④②
a( 1, 1,243)
L1Dキャッシュスラッシングの目安
a( 1, 1, 2)
Copyright
2012 RIKEN AICS・ ・a(1,1,2)、a(1,1,3)、a(1,1,4)はそ
3つ目、4つ目のデータに上書きさ
do j = 1 ・, m
・ ・ ・ ・・ ・256×256×8B
・ ・
256×256×8B
・ ・ ・
れぞれ32×16KBずつ離れている
256×256×8B・ ・ ・L1D ミス率L1D ミス dm率
256×256×8Bれる。
a ( 16=32×16KB=32×16KB=32×16KB
16,, na1,( a2)16,( 16,（16KB境界にある）ため4つが同a ( 16, 1, 3)
do ai (= 1a ( 16, 1, 4)
1, 2)1, 2) =32×16KB(/ロード・ストア数)(/L1D 単精度:1/32（32回に1回ミスをする）
ミス数)
離れたアクセス
離れたアクセス 32×16KBのアドレス差
離れたアクセス
離れたアクセス
じインデックスに割り当てられる。
単精度 3.125%以上
・ ・ ・ ・ ・・ ・・ ・
・ ・
・
・
・
倍精度:1/16（16回に1回ミスをする）
・・・a(i, j, 4) = a(i, j, 1) + a(i, j, ③2) + a(i, j, 3)
20%以上
128エントリ
そのため1つ目、2つ目のデータが今回の例の場合、a(1,1,1)、
倍精度 今回の例の場合、a(1,1,1)、
6.250%以上 今回の例の場合、a(1,1,1)、④
a( 1, 1, 4)a( 1, 1,
3)
a( a(
1, 1,
1,243)
1, 3)
グの目安ュスラッシングの目安
スラッシングの目安
L1Dキャッシュa(1,
Copyright
2012
RIKEN
AICS
注：ストリームとは、ループの回転に伴って参照定義される一連のデータのことで3つ目、4つ目のデータに上書きさa(1,1,2)、a(1,1,3)、a(1,1,4)はそ
a(1,1,2)、a(1,1,3)、a(1,1,4)はそ
a(1,1,2)、a(1,1,3)、a(1,1,4)はそ enddo
・ ・ ・・ ・ ・ ・ ・・ ・・256×256×8B
・れる。
れぞれ32×16KBずつ離れている
256×256×8B
L1Dミス
ミス
dm率
れぞれ32×16KBずつ離れている
れぞれ32×16KBずつ離れている
ミス dm率L1D
256×256×8B
dm率・・
128バイト×128エントリ×2way=32Kバイト
単精度:1/32（32回に1回ミスをする）（16KB境界にある）ため4つが同 enddo
a ( 16, 1, 4)
1,=32×16KB
3)1, 3) =32×16KB=32×16KB
数)(/L1Dミス数)
ミス数)（16KB境界にある）ため4つが同（16KB境界にある）ため4つが同a ( 16, a1,( a3)16,( 16,
D ミス数) (/L1D
離れたアクセス
離れたアクセス
離れたアクセスa ( 16
じインデックスに割り当てられる。
以上
倍精度:1/16（16回に1回ミスをする）
・ ・ ・
キャッシュへの格納
実行順序①
じインデックスに割り当てられる。
じインデックスに割り当てられる。
上End・ ・ ・ ・ ・・ ・・ ・
以上
20%以上
そのため1つ目、2つ目のデータが
以上
0%
20%
以上
④
そのため1つ目、2つ目のデータが・ ・a( 1, 1, 4)
上 Copyright 2012 RIKENそのため1つ目、2つ目のデータがAICS
キャッシュへの格納（競合）4) 1, 1, 4)
3つ目、4つ目のデータに上書きさ 24 a( 1, 1, a(
今回の例の場合、a(1,1,1)、
3つ目、4つ目のデータに上書きさ3つ目、4つ目のデータに上書きさ
ソース例・ ・ ・
れる。
a( 1,
・ ・ ・
・ ・ ・
れる。
れる。
（メモリ上のデータ配置
a(1,1,2)、a(1,1,3)、a(1,1,4)はそ（L1Dキャッシュ）1/32（32回に1回ミスをする）
a ( ※n=256,
16, 1, 4) m=256
subroutine sub(a, n, m)

す。

①

①

メモリ

キャッシュスラッシングとは②②
キャッシュスラッシングとは、キャッシュ上の特定のインデックス（キャッシュ上の位置情報）のデータだけが頻繁に上書きされる現象のことです。この現象は、配列サイズが２のべき乗の場合およびループ内のストリーム数が多い場合に発生しやすくなり
③
③
す。



④

④

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

回ミスをする）32（32回に1回ミスをする）
1/16（16回に1回ミスをする）
回ミスをする）16（16回に1回ミスをする）

a ( 16,a4)( 16, 1, 4)
L1D 1,ミス率
・ ・ ・
・ ・ ・

れぞれ32×16KBずつ離れている
1WAY
2WAY
（16KB境界にある）ため4つが同(/ロード・ストア数)(/L1D ミス数)
do j = 1 , m 単精度 3.125%以上
じインデックスに割り当てられる。
20%以上
そのため1つ目、2つ目のデータが
do i = 1 , n倍精度 6.250%以上
3つ目、4つ目のデータに上書きさa(i, j, 4) = a(i, j, 1) + a(i, j, 2) + a(i, j, 3)
128エントリ れる。
enddo
単精度:1/32（32回に1回ミスをする）
enddo
倍精度:1/16（16回に1回ミスをする）
End
L1D ミス dm率

real*8 a(n, m, 4) ・ ・ ・
24

24

24

配列マージとはCopyright 2012 RIKEN AICS

24

2016年4月21日 計算科学技術
特論Ｂ
L1Dキャッシュスラッシングの目安

今回の例の場合、a(1,1,1)、a(1,1,2)、a(1,1,3)、a(1,1,4)はそ
れぞれ32×16KBずつ離れている
L1D ミス率L1D ミス dm率（16KB境界にある）ため4つが同(/ロード・ストア数)(/L1D ミス数)
配列マージとは、複数の配列を１つの配列とするチューニングです。
じインデックスに割り当てられる。
単精度 3.125%以上
20%以上狙い そのため1つ目、2つ目のデータが
使用条件
倍精度
6.250%以上
配列マージとは、複数の配列を１つの配列とするチューニングです。
使用条件
狙い
3つ目、4つ目のデータに上書きさ配列の要素数が同じである。
ストリーム数削減。
れる。
使用条件
狙い
配列の要素数が同じである。
ストリーム数削減。
単精度:1/32（32回に1回ミスをする）
配列の要素数が同じである。
ストリーム数削減。
副作用
倍精度:1/16（16回に1回ミスをする）
副作用

配列マージとは・ ・1, 1, 1)a ( 16・ ・ ・・ ・a ( 16, 1, 1)
a( 1,
・ ・ ・
・ ・
a( 1, 1, 2)
a ( 16・ ・ ・・ ・a ( 16, 1, 2)
・ ・ ・

a(

a(

1, 1, 3)・ ・ ・a ( 16, 1, 3)
・ ・ ・

配列マージとは、複数の配列を１つの配列とするチューニングです。
配列マージとはîĐÿöđ×Laa(1, 1, 4)・ ・ ・a ( 16, 1, 4)・ ・ ・øĔÿöęð×$Čě÷

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

Copyright 2012 RIKEN AICS

ロード、ストア命令のSIMD化が難しくなる。

ロード、ストア命令のSIMD化が難しくなる。

改善前
改善前

改善後
改善後

改善前

改善後

（L1Dキャッシュ）（L1Dキャッシュ）L1Dキャッシュス
L1Dキャッシュス
L1Dキャッシュス
ラッシング発生
ラッシング発生
ラッシング発生
改善前ソース例
改善前ソース例
改善前ソース例
parameter(n=256,m=256)
parameter(n=256,m=256)
parameter(n=256,m=256)
real*8a(n, m),b(n,m),c(n,m),d(n,m)
real*8 a(n,a(n,m),b(n,m),c(n,m),d(n,m)
real*8m),b(n,m),c(n,m),d(n,m)/com/a,b,c,dcommon common/com/a,b,c,dcommon /com/a,b,c,ddo j = 1 , m
do j = 1 , m
do j = 1 , m
do i = 1 , don i=1,ndo i = 1 , n a(i, j) = b(i, j) + c(i, j) + d(i, j)a(i, j) = b(i, j) + c(i, j) + d(i, j)a(i, j) = b(i,j) + c(i, j) + d(i, j)
enddo
enddo
enddo enddo
enddo
enddo
キャッシュへの格納

キャッシュへの格納

キャッシュへの格納
Copyright
2012 RIKEN AICS
Copyright 2012 RIKEN AICSためデータを有効利用できる（メモリ上のデータ配置）（メモリ上のデータ配置）（L1Dキャッシュ）4つとも同一キャッシュライン上の4つとも同一キャッシュライン上のためデータを有効利用できる
4つとも同一キャッシュライン上のためデータを有効利用できる（L1Dキャッシュ） （メモリ上のデータ配置）（メモリ上のデータ配置）（L1Dキャッシュ）（メモリ上のデータ配置）a( 1, 1)

（L1Dキャッシュ）a( 1, 1)a( 1, 1)256×256×8B
a(a( 2,2, 1)1) 256×256×8B
256×256×8B
a( 2, 1)=32×16KB
・・・ =32×16KB
・・・=32×16KB・・・離れたアクセス
離れたアクセスa(256,
256)a(256,
256)256) 離れたアクセスa(256,b(b( 1,b(1, 1)1,1) 1)b(b( 2,b(2, 1)2,
1) 256×256×8B
1)256×256×8B
改善後ソース例
改善後ソース例
改善後ソース例
256×256×8B
・・・
・・・=32×16KB
・・・=32×16KB=32×16KB
parameter(n=256,m=256)
parameter(n=256,m=256)
parameter(n=256,m=256)b(256,
256)
離れたアクセスb(256,
離れたアクセスb(256,
256)256)
離れたアクセス
real*8abcd(4,n, m)
real*8abcd(4,n,n,m)
real*8abcd(4,m)c(c( 1,c(1, 1)1,
1) 1)
common/com/abcd/com/abcd
2, 256×256×8B
1) 256×256×8Bcommonc(c( 2,c(1)
common/com/abcd2, 1) 256×256×8B
1,m= 1j ,=m・・・・・・=32×16KB=32×16KB do j do
do j = 1 , m
・・・=32×16KBc(256,
離れたアクセス
do ido= 1i =, n1 , nc(256, 256) 256)
離れたアクセス
doabcd(1,i,i = 1 , nj) = abcd(2,i, j) +c(256, 256) 離れたアクセスd( 1,d( 1)1, 1)
abcd(1,i,j) = abcd(2,i, j) +d( 1, 1)abcd(3,i,+ abcdd(4,i,abcd(1,i,j) = abcd(2,i,j) +abcd(3,i,j) + j)abcdd(4,i,j) j)d( 2,d( 1)2, 1)
abcd(3,i,j)enddo + abcdd(4,i, j)
・・・
d(
2,
1)
enddo
・・・
d(256, 256)
enddo
enddo
・・・
d(256, 256)
enddo

d(256, 256)
キャッシュへの格納（競合）

enddo
メモリへのアクセス順番

キャッシュへの格納（競合）キャッシュへの格納（競合）

メモリへのアクセス順番

28（メモリ上のデータ配置）
abcd(1, 1, 1)

abcd(1, 1, 1)
abcd(1, 1, 1)
abcd(2,abcd(2,1, 1) 1, 1)
abcd(2, 1, 1)
abcd(3,abcd(3,1, 1) 1, 1)
abcd(3, 1, 1)
abcd(4,1,abcd(4,abcd(4,
1, 1)
1) 1, 1)abcd(1,2,abcd(1,abcd(1,2, 1)
1) 2, 1)
・・・
・・・
・・・
abcd(1,256,1)
abcd(1,256,1)
abcd(1,256,1)
abcd(2,256,1)
abcd(2,256,1)
abcd(2,256,1)
abcd(3,256,1)
abcd(3,256,1)
abcd(3,256,1)
abcd(4,256, 1)
1)
abcd(4,256,
abcd(4,256, 1)
abcd(1, 1,
1, 2)
2)
abcd(1,abcd(1,
1, 2)
abcd(2, 1,
1, 2)
2)
abcd(2,abcd(2,abcd(3,1, 2)2) 1, 2)abcd(3,1,abcd(3,abcd(4,1, 2) 1, 2)
abcd(4,1,
2)・・・
abcd(4, 1, 2)・・・
abcd(4,256,256)・・・
abcd(4,256,256)

abcd(4,256,256)

メモリへのアクセス順番

28

Copyright 2012 RIKEN AICS

28

RIKEN AICSチューニングチュートリアルより2016年4月21日 計算科学技術 特論Ｂ配列次元移動とは
配列次元移動とは、同一配列で複数のストリームを持つ配列を１つのストリームにする
チューニングです。

îĐÿöđ×La
狙い

使用条件

同一配列で複数のストリームが存在する。

ストリーム数削減。

øĔÿöęð×$èęāÿïø
副作用

C

ロード、ストア命令のSIMD化が難しくなる。

改善前

改善後
（L1Dキャッシュ）（メモリ上のデータ配置）a(a(1, 1, 1)2, 1, 1)・・・
a(256, 256, 1)a( 1, 1, 2)
a( 2, 1, 2)・・・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キャッシュス
ラッシング発生
ソース例
parameter(n=256,m=256)
real*8 a(n,m,4)
common /com/ado j = 1 , m
do i = 1 , na(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離れたアクセス

ソース例

parameter(n=256,m=256)
real*8 a(4, n, m)
256×256×8B
common /com/a=32×16KB
do j = 1 , m
離れたアクセス
do i = 1 , na(1,i, j) = a(2,i, j) + a(3,i, j) + a(4,i, j)
enddo
enddo

キャッシュへの格納（競合）

Copyright 2012 RIKEN AICS

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

a(1, 1, 1)
a(2, 1, 1)
a(3, 1, 1)
a(4, 1, 1)a(1, 2, 1)・・・a(1, 256, 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(4, 256, 256)

メモリへのアクセス順番
33

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

チューニングアプローチについて（2016年4月21日 計算科学技術 特論Ｂ 配列マージîĐÿöđ×Lado i=1,ndo i=1,n…  =  a(i)  +  b(i)                                      …  =  z(1,i)  +  z(2,i)øĔÿöęð×$ĖěĊ
enddo
enddo
üāò¹ÏØáà°ÌËs9©)¥ºàúæÞÿÙ
 配列次元移動©nªÇ²¥ă~üāò²Ë¹³Ì´Ì¾üāò¾s9ÎN
do i=1,ndo i=1,n²Ë©
cº¼Ëă~…  =  a(I,1)  +  a(I,2)                          …  =  a(1,i)  +  a(2,i)
s9©N°ÌË¯º½ÈÊàúæÞÿÙ¾WSÎ6
enddo
enddo
§ÉÌË'!©¤Ëă

ストリーム
リスクその

長

 ループ分割
do i=1,ndo i=1,n…  =  a(i)  +  b(i)                                      …  =  a(i)  +  b(i)  …  =  c(i)  +  d(i)                                  enddo      enddodo i=1,n…  =  c(i)  +  d(i)    enddo パディング

2016年4月21日 計算科学技術 特論Ｂ

common //a(n),b(n)do i=1,ncommon //a(n),p(64),b(n)do i=1,n短パディ

…  =  a(i)  +  b(i)                                      …  =  z(1,i)  +  z(2,i)
同一配列で複数のストリームが存在している。

もしくは

enddo

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

enddo 配列次元移動
複数の配列が存在している。

副作用ストリーム数を削減することで、スラッシングのリスクそのものを改善する解決型のアプローチîĐÿöđ×La
問題規模変更ごとにパディング量の変更が必要

do i=1,ndo i=1,n…  =  a(I,1)  +  a(I,2)                          …  =  a(1,i)  +  a(2,i)一配列で複数のストリームが存在している例
enddo
enddo

øĔÿöęð×$Ćāçęð

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

短所：修正量が多い。SIMD化が複雑
改善後
改善前  ループ分割（メモリ上のデー
注意:ループ分割は除く（L1Dキャッシュ）×÷æÞøÂ¾s¾sb¾PKÎ(?²Ë¹à
a(

1, 1,

（L1Dキャッシュ）（メモリ上のデータ配置）úæÞÿÙ¾iMÎY7²ă~
do i=1,ndo i=1,n
格納場所がa( 2, 1,a( 1, 1, 1)³¾µÅ½s¾-jr½äôā¾sÎsb…  =  a(i)  +  b(i)                                      …  =  a(i)  +  b(i)  ずれたことで・・・a( 2, 1, 1) 256×256×8B
L1Dキャッ²Ë¯º¹àúæÞÿÙ©iM²Ë'!©¤Ëă~
長所：修正量が少ない、SIMD化が容易…  =  c(i)  +  d(i)                                  enddo      a(256,
1,
・・・=32×16KB
シュスラッシDキャッシュス
Äµs-j>½äôā{&Îl­Ë¯º¹àúæÞÿ
a(257,
1,
離れたアクセス
enddo
do a(256,i=1,n 256, 1)
ングは発生
ッシング発生Ù©iM²Ë'!©¤Ëă・・・
せず
a( 1, 1, 2)
短所：パラメタ変更等、問題規模が変化する…  =  c(i)  +  d(i)    a(256, 256,
256×256×8B
a( 2, 1, 2)
度に調整が必要になる
enddo
a(257, 256,
=32×16KB
改善前ソース例

・・・
a(256,
256, 2) 離れたアクセス
rameter(n=256,m=256)
パディング
a( 1, 1, 3)
al*8 a(n,m,4),b(n,m,4),c(n,m,4),d(n,m,4)
common //a(n),b(n)common//a(n),p(64),b(n)a( 2, 1, 3)
mmon /com/a
256×256×8B
do i=1,ndo i=1,n・・・=32×16KB
j=1,ma(256, 256, 3) 離れたアクセス…  =  a(i)  +  b(i)                                      …  =  a(i)  +  b(i)  do i = 1 , na( 1, 1, 4)
enddo
a(i, j, 1) = a(i, j,enddo
2) + a(i, j, 3) + a(i, j, 4)a( 2, 1, 4)
enddo
・・・
Copyright 2012 RIKEN AICS26
nddoa(256, 256, 4)

キャッシュへの格納

キャッシュへの格納（競合）改善後ソース例a( 1, 1,parameter(n=257,m=256)
a( 2, 1,
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
メモリへのアクセス順番

ight 2012 RIKEN AICS

42

2016年4月21日 計算科学技術 特論ＢîĐÿöđ×Laĕëěýĕęð
ğĠĥđīČ
ª\ĂġďĈĢ

đīČĂġďĈĢĤþĩ
128byte]í
üăċĊ

ĳy
8byte]íüăċĊõöûº G×÷æÞø¿×÷æÞøúÑÿ íÑé ¾ÏØáàº¼Ëă~G×÷æÞø¿Ąh_íÑé¾ÏØáàº¼Ëă~¾È¦¼VfºóØéü¾Z©¤ËºªóØéü¿ºÁºÁ½ÏØáà°ÌËă~¯¾óØéü©õöûÇ G×÷æÞø½¤Ë'!ÏØáàQ©z2½4²Ëă~G×÷æÞø¿Ąh_H½ÏØá
à°ÌËµÅ¯¾4©¬¼Ëă~óØéüÎG×÷æÞøÂb¬µÅ¾ÁA§©C½¼Ëă
do i=1,nbuf = 0do j=1,l(i)©\ĂġďĈĢ

đīČk = k +1
buf = buf + a(k)* v(L(k))x(i) = buf
2016年4月21日 計算科学技術 特論Ｂ]×s¼øñ÷đěĕęðĚZj-×LaìĔěĕęð
âðéÒÓÏîÑòúÑÿëÿÙÇ¡[¾àÚßøāûÿÙ¿üāò½.±¸fÍÌËă~üāò¾ÑÿèæØà½·¥¸+w©¤ËºâðéÒÓÏîÑòúÑÿëÿÙÇ¡¿¹ª¼¬¼Ëă~§ÀÖÒàĀÝÑèüL¾R[©³¾¹¤Ëă~³¾'!¿¢LR¾àýæê£¹m=±µ àÐāòÂ¾@8§¹
+wÎx²Ë¯º©EX¹¤Ëă~¿ e¾ÕúāûÿÙ¹¤Ë© e¾ÕúāûÿÙÆ"F¼E©¤Ëă「コーディング」

2016年4月21日 計算科学技術 特論Ｂ



<変更前>
IF(体系内部の場合) THEN
]×s¼øñ÷đěĕęðĚZj-×La
速度の配列 UL の７点差分式<変更後>
IF(外部境界の場合) THEN
ULと速度境界条件の配列 VELBN の混合式¦¤F×$

イレギュラー:Æ¡ ÔòÞùÿÇ~¡èÐýØçÐñÎ
イレギュラーMIM 5-10¦¹¡ÇâðéÒÓÏîÑòúÑÿëÿÙÎf
5
MIM¦¯º©DËă~-1-999±¨±:©gy½¼¶µ'!¿ ¾È¦¼;L¹¾
VELBN:¾x©C¼'!©¤ËăULD
v8í:ìčĝī8û?Üáíì0-1ĲûZxÞøİÚÑÞøÚéìõ÷eé}íe
11Õ/ÝFéë÷¶´TîJèëØëøİ

UL
eé}íeè+feíSÕÑâó
5vFÕÑİáíâóeé}íeû'Þø¶´TÕ>6Þøİ=0
0=○：UL X：VELBN

2016年4月21日 計算科学技術 特論Ｂ

ダミー領域



5

]×s¼øñ÷đěĕęðĚZj-×Laèęāÿïøzj×$§À^*Î ¶µL¾ÏòûÚāÞùÿ¾'!Ă
^*©»¾õæÞø½+%²Ë¨ÎÑÿèæØà¹k\²ËÈ¦¼R©|W²Ëă~¯¾È¦¼gy¼ÑÿèæØàk\Î T±¸¥ËºâðéÒÓÏîÑòúÑÿëÿÙÇ¡[¾àÚßøā
ûÿÙ©¦Ä¬f¨¼¥'!©¤Ëă~¯¾È¦¼'!½¿ ¾È¦¼;L¹¾ÑÿèæØà
k\¾x©C¼'!©¤Ëă
1. w=ÕíğďĈĢì%Ø,KÕÏøİ
2. áíâóçíw=ìæÐçêíğďĈĢìÐøÔíþ
ĩđďăĊvÕÏøİ
3. ÜÔÜíğďĈĢì%Øw
=îCSİ
4. ñßw=îíğďĈĢì
lñøéÜçþĩđďăĊvû*ÜçvÞøİ
5. áíIíğďĈĢìq%Ü
âw=ìæÐçãÙvÞøİ

do i=1,NþĩđďăĊ
ëÜív

do i=1,移動した粒子数þĩđďăĊ
Ï÷ív

チューニングアプローチについて（2016年4月21日 計算科学技術 特論Ｂ 配列マージ

]×s¼øñ÷đěĕęðĚZj-×Lado i=1,ndo i=1,n…  =  a(i)  +  b(i)                                      …  =  z(1,i)  +  z(2,i)
enddo

ĖěĊ
enddo

üāò¾R©gy²«ËºâðéÒÓÏîÑòúÑ
 配列次元移動ÿëÿÙÇ¡©¨¼¥'!©¤Ëă~
do i=1,ndo i=1,nüāò²Ë¹üāò¾R©]U°ÌàÚßøāûÿÙ©¦Ä¬¥¬È¦½¼Ë'!©¤Ëă…  =  a(I,1)  +  a(I,2)                          …  =  a(1,i)  +  a(2,i)
enddo
enddo

ストリーム
リスクその

長

 ループ分割
do i=1,ndo i=1,n…  =  a(i)  +  b(i)                                      …  =  a(i)  +  b(i)  …  =  c(i)  +  d(i)                                  enddo      enddodo i=1,n…  =  c(i)  +  d(i)    enddo パディング

2016年4月21日 計算科学技術 特論Ｂ

common //a(n),b(n)do i=1,ncommon //a(n),p(64),b(n)do i=1,n

短

パディ

]×s¼øñ÷đěĕęðĚZj-×LaĖěĊ

C

üāò¾$o9©0¼¥ºâðéÒÓÏîÑòúÑÿë
ÿÙ©¨¼¥'!©¤Ëă~üāò 8±t¥üāòÎB½²Ë¹âðéÒÓÏ
îÑòúÑÿëÿÙ©¦Ä¬¥¬È¦½¼Ë'!©¤Ëă

do i=1,ndo j=1,10

do j=1,10

do i=1,n

2016年4月21日 計算科学技術 特論Ｂ]×s¼øñ÷đěĕęðĚZj-×LaEĚôĉĖěþę7üāò½w9ÇÜñüāåÿ#±©¤ËºàÚßøā
ûÿÙ©qÄ¼¥ă~³¾'!¿ÛÿîÑúÔòÞùÿ½ÈÊw9ÇÜñüā
åÿÎüāò½1u²Ëă~ìÿêåøāëÿÙ¹1u±µ;©¦Ä¬f¬'!Æ¤Ëă
do i=1,ndo i=1,ncall subroutines

2016年4月21日 計算科学技術 特論Ｂ




• àýæê~•  3cÎ®ËµÅ¾·¾h_~• hJº·¾h_¾w~• 3cO5LhJ©}¥'!~•  XçØëæØ

2016年4月21日 計算科学技術 特論Ｂ