 

 "!#



6=7  *!$()'! 

4/OGId?>ŖųŘŵß ³Ñß ×ß 2.40
ß ñóĀôùþÿüô ĳĸė¿ ½  G º ~ ½ ¦ & I œŕśũÓ  ŦŲŔōŐŝáÊ  ñóĀôùþÿüô ŦŲŔōŐŝâĶĝĚıÓ  ĦŇıĚņŎŵŦųŗŵŕ òñô œŕśũĲęņĘG º ~ ŪŚœŬň Ěı²   łQ  ň ĥĳÁ ª ĶūŜŰ+ ħėF } ĵ " ! m ½ ¦   B ķŁĳĲ9  ķE Y ł ŴķŇ¤ ķ& I ¼ w Ğń0 » + ė¿ ½ s Î + ľĲň´ Ĝņ ` ğęņĘ o  Ó ĦŇıĚņĤĳŁęŅė
l ° Ŵ ¡ Ğń { b  ľĲS T ġ#  ĦŇıĚņŗťŝŌōŊĲęņĘĤĤĲĸėt Ö ¸ ©  áõĊčĊĒćß ôċćČćčĒß øćĒĉĎĆðß õôøâĶŃņW A c ¼ w ūŔŬŵŰ ñóĀôùþÿüôĂýĎċĊĆ ķ J ň´ ěĘÚ | Ë
y H ň Ěĭt Ö ¸ © ¼ w ĲĸėG º ~ Ĳ ĵ´ " ň n Ķg İÌ ¢   p  V ň¼ ġa ¸ ğęŅėŨŰřŒŊ òûÿ  ĲÞ Ě " (  ł ¦ (  ňĩĤĳğ8 Ø ĵ! Ñ ĳĦŇıĚņĘĤŇĶ

M ħėñóĀôùþÿüôĂýĎċĊĆ ĸÝ = ! %  áóĎČăĊčß óćąĎČďĎđĊĒĊĎčß øćĒĉĎĆðß óóøâňh  ĩņĤĳĲė! m Ūūů<  "  B ĶĝĚı ïæàňÄ Ĝņ " (  ň ĩĵĴķÞ ĚK ­ ňt ħıĝŅėŨŰ
řŒŊŐŮŕŘ ĶĝĚıŁÞ c ± ½ ¦ ğu \ ĲĠņŦŲőŮũĲęņĘß

 8<5:9ß ñóĀôùþÿüô ĶĝĢņ óóø Ĳĸė¼ ġĻĠÌ ¢   p  V ň ýąĉēĐ ·  p  V ĺĳE j ĩņp ňh  ħıĚņĘľĪė¼ ġĻĠV ň V Ĳµ ĩĘß!" ! !ß

ß

ß

ß

ß

áèåçåçâß

ĤĤĲė n ´ " !ĸG º ~ Ğİ ĵ´ " ĳĵņĘ Ķėõôø ķŪŚœŬň! ķÏ ! Ý = Ķ! % ħė
Ý = Ô B   ²  U ĺķÙ  ¬ ¨ ň´ ěĤĳĲė V Ĳµ ĦŇņ ýąĉēĐ ·  p  V ğ^ ńŇņĘß! !
!
!!! !!

!

!

! !!

!!! ! !!" !!!

!

!

!!" !! !! !

! !
!
!!! !!

!

!

ĤķV ň [ * Ð  Ĳ¼ ġğėa ¸ ĳĵņ n ´ " ĳ  p 5 ŧŐŝŰķķ ´ " ŧŐŝŰ! !!

!! ! !!" !!!

!!

!

ß

áèåçåèâß ¦ ĸėÏ ! Ý = ĥĳ ¦ è 7 ĳÌ ¢   p  V ¼ w ç 7 Ķ® Ġj ĜńŇņĘñóĀôùþÿüô Ĳĸ½¦ šŵŞĶM ħıŒŊn ŃŅŁF ĚÏ ! Ý = n ň% ŅX ıėŦŲőŮũ èåçåç Ķ ĩŃěĶÏ ! Ý = ĶÕ ĩņŰŵŦ  ň úďćčøû ĲŕűŚŞ " + ĩņķğ ` ĲęņĘß

     
ß c ±  J Ķĸė4 / O G I ķ õāçėv  G I ķ õāçæė P G I ķ òāêææė- Ĺ + I  ¡ eķ ň  ħĭĘīŇĬŇķ B ĶĝĢņŒųţŋŮĳŒųţŋŮŎŦœŭųĸ ķÊ ŅĲęņĘßŴß õāçðß L D Ê ŒųţŋŮėäöĈăđĒãĀïß äöúøûßŴß õāçæðß L D Ê ŒųţŋŮėäöĈăđĒãĎďćčČďßŴß òāêææðß ŋųśŰŒųţŋŮėäúéß äĎďćčČďßŴß  ðß L D Ê ŒųţŋŮėäöĈăđĒãĎďćčČďß

   ß ĸĨŀĶėŕűŚŞğ´ ě½ ¦ ĶİĚıÈ ĻņĘ1 ŕűŚŞĸėÏ ! Ý = ĶÕ ĩņ ´ " ŧŐŝŰ i  ĶŃņÌ ¢   p  V ¼ w ķĭŀķŒűŕŏŵ! ¼ áýď÷ó÷âė$ Í]Éė áýďýú÷Ăçâ ĹĶ áýďýú÷Ăèâň´ ěĘīŇńķŒŵŞĸė§  ğg İ é ²  U áĔãĕãĖâňf ) ŊųŲŵůųőĩņ

ĤĳĲs Î + ħıĚņĘ ĶĝĢņ J « x ňL D Ê ŕŮŋŞÃ o Ķ ĩĘóóø ĶĩņĤĳĲa ¸ ĳĵņ ýď÷ó÷ ĸŤŵŐc ±  èæà U ėýďýú÷Ăç ĸ ïà U ėýďýú÷Ăè ĸ íà U ĲęįĭĘĤŇńķ

½ ¦ ĸŪūůŊŐŖŕŒŕŝğG Ġġė ıķŕűŚŞğ3 } ķ¸  ňĩņĭŀėŪūůŕŰŵŦŚŝŠŚŐ
ĳĵįıĝŅėĤŇ ķc ± k 6 ķ ; ĸN ĵĚĳ¯ ĜńŇņĘßß īŇĶM ĩņM ¥ ĳħıėÌ ¢   p  V ¼ w Ķ. _  ň ĚņĤĳĲ¸  ŪūůŢųŞS ň ģņĤĳňz ¾ ħĭĘ áê šŵŞâĳ õāçæáè šŵŞâĶĝĢņ J « x ň£ î 7

2 ŕŮŋŞÃ o Ķ ĩĘ ķšŵŞ  " (  ĶİĚıė i  Ĳĸ éæäìæà U ĲęņķĶM ħıė. _  Ĳĸ ëæäïæàĳ
ĵįĭĘŒŊęĭŅķ Â ŪūůŢųŞS ğ ŃŅŁ Ě õāçæ Ĳĸ çæàļĴ(  ğ  ħıĚņŁķķė
. _  Ĳĸ, ! ĵc ± ğ^ ńŇĭĘ½ ¦ q Ô ĶİĚıėõāçæáè šŵŞâķ Â ŤŵŐc ± ĸ áè šŵŞâķ æåï   U Ĳęņğė i  Ĳĸ æåëäæåí   U ķc ± R ĳĵįĭĘ p ė. _  ĲĸļĽ3  U ķc ± ĳĵįĭĘ : ĸ i  ķp ğ. _  ŃŅŁ½ ¦ q Ô Û Ĳĸ ŇıĚņğė] ĦńĶŒŊn ğC ' ħėŒŊęĭŅķŪūůŢųŞS ğ  ħĭ@ 2 Ķĸė. _  ŧŵŕķK ¶ ğ 7 ņĤĳğ¯ ĜńŇņĘßß  ĶėŪūůŢųŞS ğ ĜņZ Ü ĶİĚıŃŅÁ ª ĶĿņĭŀĶė ėõāçæėõāçėòāêææ ĶĝĢņ J « x ķ Å ň´ įĭĘ J « x ň£ ï 7 ŕŮŋŞÃ o Ķ ĩĘ3  šŵŞn ĶĝĢņ½ ¦ q
Ô ķ Å « x ňĿņĳė Â ŤŵŐc ±  ňŒŊÆ Ņķ Â ŪūůŢųŞS  Ĳ·  ĩņĤĳĲėK  ĶÇ ġĵņĤĳğ! ĞįĭĘĤŇĸ3  ŒŊn ĶĝĢņ½ ¦ q Ô ķ Å « x ĲŁ3 } ĲęįĭĘ Â ŤŵŐc ±  ĶİĚıŁėŪūůŢųŞS ğÞ ĚœŕśũļĴÞ c ± ĳĵįĭĘß

 3/4ß

7 ķ J Ĳ^ ńŇĭ ¹ ĸ

 ķÊ ŅĲęņĘßăâß óóø ĶĝĢņÏ ! Ý = ŰŵŦň úďćčøû  " + ħĭ@ 2 ė1 ŕűŚŞğÞ ĚŪūůŢųŞS ň¸ ĩņĭŀėŒŊÆ ŅķŪūůŢųŞS c ± ğG ĠġZ Ü ĩņĘßĄâß Ï ! Ý = ĶĝĢņÌ ¢   p  V ¼ w ň i  Ğń. _  ĶE r ĩņĵĴķp  Ĳ¸  ŪūůŢųŞS ň ģņĤĳĲėšŵŞ  " (  ğk 6 ĦŇņĘ½ ¦ Ò ğC Ĝņĭŀ : ĸ½ ¦ q Ô ğ
C ' ĩņğė

] ŪşŵŒŊ+ ğÍ ŉĮ@ 2 ĸ U z À ĩņa ¸ ğęņĘß

8<5:9  ;=81 %-+,#& 
mthread_parallel_start(nthreads);#pragma omp parallel for schedule(dynamic,1) private(i)for (idom = 0; idom < pmesh->n_domain; idom++) {DomMesh dmesh;
DomField dfield;
dmesh= SetDom4CG(optsw, sw_cg, idom, pmesh[0], pfield[0], cgvec[0], sw_kpmat);dfield = SetDomField4CG(optsw, sw_cg, idom, pmesh[0], pfield[0], cgvec[0]);domsolve(sw_cg, optsw, dmesh, dfield, p_hddmmat[idom]);#pragma omp critical
put_domvec_to_cgvec(dmesh, dfield.reac, cgvec.a_w);
UnsetDom4CG(pmesh[0], &dmesh);
UnsetDomField4CG(optsw, &dfield);}mthread_parallel_stop();
GatherCGVectorOf(pmesh, cgvec, CGVEC_AW);C¶¢s!!ADVENTUREp10·J¡²¶¨¹rq!!SpLDLpKSpSOL_1pKSpSOL_¸3GCD ~q,,-/-.,%')$,/0!..'$.$/0'+#3$"0!.0+#
   &.$!#

     !#2)!/ /4* /(4)'+$ )#) #$",*-,/'0$6-    !#2)!/ /4* /(4)'+$ )#) /,)2$6-    !#2)!/ /4* /(4)'+$ )#) /,)2$6- 
   
-$+  ,)2$.  77    

!#2)!/ /4* +5*!0 *!0*1)0 2$" !##!!3G OpenMP

/!!3G pFX10B/F0¨±?1~?1B/F0w
Jsp²¶¨ ¡¤ 
7#%sqlK¨±?1~?1B/F0p
KKK¡±¶«ld/st(rKKKKK¬­±?19}sq

³ ¢|sq$# 
"%(
!"

 

 )' )' )')' )'  








)'

&




nA; 
K?1¥¡ YKPFrfcNij(KKkKKK?1§´ ¨YKPFr5;(
2

SpLDL

&

Copyright 2012 FUJITSU LIMITED+(2/3)

C<,  

  "   " "
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"



'0*1
!

,&().
-/$%#+

  

 

,&().
-/)



 





 

 


 
 

 

 





 
 


 


 
  
 
 
 

 
 
 
 
 
  


 



 









 


 



 

 


 
 


 +&8  +&802)1&(%  +&6
7495 02)1&(
6
36
%6
   #!QMO[LOP







TMO[LOOOMO[LOO

     

  

 

³ ¢{ 5;(¥°xwrp>)G¥°ssq  +&
8  +&6  +&
$ 8  +&6  +&"$ 8  +&6   

 +&802)1&(  +&6
%6





 +&
,-.&/2  &/2*'
 +& 88*'((
 +&6 +&6  "  "



 

 



!! ¬­±¡wxyp¬­±²¶¨ ¡Jsp¬­±²¶¨ ¡¤ r =tq_:`mKKL2ªª(3@6¨±¯¶£µw$?

PMT[LOP
PMO[LOP  

   
 
      

    !" %  )+%
  %  %#*   %#*#*#*#*($,%   &  &  &  &#'
%#'.
!" %#
)+%#'
%#''2(6´¶¢® ¯"2(6´¶¢¬­±"!! ¬­±²¶¨ ¡w¬­±²¶¨ ¡H
8r64GB/sEtsq
mKOpenMPw |up*oos!I &4|q(/©¶-B)²¶¨¥±w^g\Z\KPUjehdbc
5

Copyright 2012 FUJITSU LIMITED1SpSOL_1K+(2/2)

C<,



  !" %  )+%
  %  %#*   %#*#*#*#*($,%   &  &  &  &#'
%#'.
!" %#
)+%#'
%#''  

  !

&/)0
 

+%'(,.#$"*

  

 

 






 -(:  -(:
24+3(*'  -(896;7 24+3(*
8
58
'8

 

"   % # +%'(,.(

 

 

 

     -(!
:  -(8  -(& ":
  -(8  -($& ":  -(8 



 

 

 -(:
24+3(*  -(8
'8



  





 -(!
./0(14  (14,)
 -("::,)** -(8 -(8  $  $   





_:`
PMO[LOPXMO[LOOWMO[LOOVMO[LOOUMO[LOOTMO[LOOSMO[LOO

2(6
´¶¢®
¯
"!!¬­±¡wxyp¬­±²¶¨ ¡Jsp¬­±²¶¨ ¡¤ r =t
q

2(6
´¶¢¬­±
"

!!SpLDL.p¬­±²¶¨ ¡w
HEtsq

RMO[LOOQMO[LOOPMO[LOOOMO[LOO
^g^]\aPKPUjehdbc

8

SpSOL_2K

Copyright 2012 FUJITSU LIMITED+(1/2)

C<,



  !$  (*$
  $  $")   $")")")")'#+$   %,  %,  %,  %,"&$"&!$"(*$"&
$"&&  

   !

&/)0
 

+%'(,.#$"*

 

 

   +%'(,.(  -(:  -(:
24+3(*'  -(896;7 24+3(*
8
58
'8
"   % #



 

 

 

     -(!
:  -(8  -(& ":
  -(8  -($& ":  -(8   _:`
PMS[LOP -(:
24+3(*  -(8
'8



 

 

 





 -(!
./0(14  (14,)
 -("::,)** -(8 -(8  $  $  !! §¡¦¨°µw}ssp2(65;"¡wxsq
mK/©¶¯¶£µ

PMQ[LOP
PMO[LOPWMO[LOO  

2(6
5;"

UMO[LOO!! ¬­±¡wxsw
p¬­±²¶¨ ¡wJszvp's =t
q

SMO[LOOQMO[LOO2(6´¶¢¬­±
"OMO[LOO
^g^]\aQKPUjehdbc

10

Copyright 2012 FUJITSU LIMITED2!"#$.%&'(* ,-@(#)* 
S.$(A.-:6;:<3;<+(<AJRLM-<=1>?+(69>45673









+(,NTM.-,.)/012.)3

4567+(8NTM.-8.)/0692.)3OTJ4,HFK?32;
/0GPLIQ?D>6>:8
"1'47;2E(

!"#$.%&'(* ,-@(&#+)



"1'S. OTJ<A=4567?6@AB8@7!@%41E(
S. OTJ<A=4567ABC!@%(
0897+(,HFK456>E=%4<;6E
1

!"#$%&"#$%B"3:•! VOX'–! 69('5/+#'–! )7* /+('%&&-&'–! 8+'*)(,&&'-JG@

C

ED.'

•! 0)''''''/01234+''''56789:;<'5=>?@1A33<'5>931(''B8C"5>93('5>4AD=39''–! $'!+''''''''''/6EF5,)'$GGGHI'*J&KLM'N5('''''''''NK8"1('''''H??'O!H:12(>A3;4A'–! #$%&+''''/6EF5,)'G$HI'%JN)NKLM'%,5('''PJQK8"1('''H??'O!H:12(>A3;4A'–! #$%+''''''/6EF5,)'RGG'*JPKLM')5('''''''''''%&K8"1('''''H??'O!H:12(RS'O!TB6'–! 5$)&&+''$3>;'UPO*,N&'*JVKLM'N5'I*(''',J)K8"1(''D??'OTQ'O>A3;4A'•! '–! B6GWTA3;B6RHTWMP '–! >E?EBKLNUFQYP %;-)QYP('NQYP.'–! >E?EBKLNUFJG %;-S,JG('%S*JG.'(S2QYPA<=D0)4B"3!"#$

%

)'X><31'
P%*'K#'-2>'!.'-B8C".!.

&'()


&'(


*'+))
S),'K#'-%JNPI.'-%J*QI.

%,&'K#'-&JQ%I.'-&JQSI.

%QN*'K#'-*JV&I.'-*J%,I.

&JQSI%J))IQJQSI

(S2
1

JGA<=D0)4B"3!"#$

%


&'()


S,'5>931'%PQ,'K# %)%S'K#'-2>'!.'-&JS*I.'-B8C".!.
-&J,%I.

&JVQI

&'(*'+))
S,&'K#'-&J,QI.'-&JVNI.

*&VQ'K#'-%JQPI.'-%J&NI.

&JVQI

%J,NI

-Y'X><31.''''''-%*.''-*).''''''''''''''''-,.''-%*.'''''''''''''-*).''-)N.''''''''''''''''-,.'''-%*.
(S2

$1SYI,"B"3

-Y'X><31.''''''-%*.''-*).''''''''''''''''-,.''-%*.''''''''''''''''''-*).''-)N.''''''''''''''''-,.'''-%*.
(S22

2.2 3 次元非圧縮性熱流体計算プログラム COSMOS の測定評価（株）豊田中央研究所

2.2.1

堀之内 成明はじめに自動車の設計・開発における熱流体 CAE (Computer-Aided Engineering) は，日常的なものとして様々な製品・部品を対象に用いられてきているが，実際には，非定常な乱流に加えて，熱，騒音，運動（移動境界），反応などが連成するような現象も多く，これらに対して信頼性の高い結果を得るためには，計算格子幅や，時間ステップ間隔を十分に小さくする必要が出てくるため，その結果として必然的に計算規模が大きくなる．
このような大規模熱流体シミュレーションは，従来ではベクトル演算方式の計算機で行われることが多く，プログラムもこの上で高速計算が可能となるようにチューニング，ならびにアルゴリズム開発がなされてきた．本稿では，このようなプログラムを，ベクトル計算機での性能も維持しつつ，「京」
をはじめとするマルチコアのスカラー型計算機においても高い実効性能を満たすことを目的として，高速化に向けた改良を試みる．

2.2.2

プログラム概要

ここでは，（株）豊田中央研究所で開発した非定常非圧縮性乱流計算プログラム COSMOS を対象にチューニングを行う．このプログラムは，空力や空力騒音といった問題に適用するため，自動車まわりの高 Reynolds 数非定常流れを精度よく計算することを目的に開発された [1]．

2.2.2.1 プログラムの特徴
本プログラムは，以下の特徴を有する．

• Large Eddy Simulation (LES) による非定常乱流の計算に関して，以下の独自技術を開発し，実問題に適用し得る計算精度と実用性を両立させている．

– Grid-scale (GS) 成分計算の離散化スキームとして，質量，運動量のみならず，運動エネル
ギーまでをも高い精度で保存させ，数値粘性を用いなくても安定な計算を可能とする「改良型コロケーション格子法 [2]」– Subgrid-scale (SGS) 成分の乱流モデルとして，様々な問題に対してモデル係数のチューニングが不要で，かつダンピング関数を必要としない「混合時間スケール SGS モデル [3]」• 計算格子には，計算精度に優れているというメリットから「境界適合型構造格子」を用いる．これは，碁盤目状の格子を，対象となる物体の表面に沿わせ，且つ表面近くに格子点を集中させたものである．また，三角形（2 次元の場合）やテトラ（3 次元の場合）を用いる非構造格子に比べて，プログラミングに際して間接参照（リストアクセス）の必要性が軽減でき，計算効率の観点からも有利である．但し，車両などの複雑形状に対しては，格子生成に多くの工数やノウ
ハウを必要とするというデメリットもあり，そのような計算領域全体を一つの格子で覆うこと自体が現実的には困難であったり，計算格子の歪みが大きくなり質が低下するといった課題もある．これを解決するために，局所的な形状に適合させた高品質な部分的構造格子（以下，部分格子）をパッチワーク的に重ね合わせる「重合格子法」を採用している．車両形状に対する重合格子の例を図 1 に示す．

• 非圧縮性流れの基礎方程式は，連続の式と Navier-Stokes 方程式（運動方程式）であるが，SMAC
法に準じて，これらから圧力に関する Poisson 方程式を導いて解く．時間方向の離散化には，Crank-Nicolson 法に基づく陰解法を採用しており，これから速度場に関する連立一次方程式が導かれる．一方，圧力の Poisson 方程式も，連立一次方程式を解くことに帰着される．本プログラムの計算時間の 8 割程度は，これらの連立一次方程式を解くことに費やされるため，これらをいかに効率的に計算できるようにするかがキーとなる．この時，上述した重合格子法との兼ね合いにより，単一格子での行列方程式計算よりも，アルゴリズムや配列の取り方などが，やや複雑になり，この点も含めたチューニングが求められる．

図 1 自動車まわりの重合格子の例

2.2.2.2 連立一次方程式の数値解法
重合格子法の計算アルゴリズムは，領域分割法として提案されている Schwarz 法の中でも，乗法的Schwarz 法 (Multiplicative Schwarz algorithm) の考え方に等しい（付録 p1 参照）．その反復計算自体も数値計算上の研究課題となり得るが，今回は，各部分格子の中で，離散化された連立一次方程式を，
係数行列がスパースな場合に用いられる手法の一つである SOR (Successive Over Relaxation) 法で計算する際の効率化を対象とする．
連立一次方程式の係数行列を A，解ベクトルを x，右辺ベクトルを b とする．すなわち，Ax = b である．また，反復法の第 k ステップ目での近似解ベクトルを x(k) と表すこととする．SOR 法のベースとなる Gauss-Seidel 法は，元の係数行列 A を，A = L + D + U (L: A の対角要素を除く下三角行列，D:A の対角行列，U: A の対角要素を除く上三角行列) と分解した (L + D + U)x = b から，(L + D) x = −U x + b(1)(L + D) x(k+1) = −U x(k) + bx(k+1) = − (L + D)−1 U x(k) + (L + D)−1 b

(2)
(3)

とし，これに基づき，として近似解ベクトルを更新（緩和）する手法である．式 (2) から，近似解ベクトルを要素ごとに逐次計算していく際に，下三角部分 L にかかる要素は，常に最新の値が用いられていることがわかる．このことから，プログラミング上は回帰参照が発生することになる．なお，実際のプログラムでは，式(3) に基づいて x(k+1) を計算するのではなく，
r(k) ≡ b − Lx(k+1) − (D + U) x(k)
とおいた残差ベクトル r(k) を用いて，

x(k+1) = x(k) + D−1 r(k)(4)

のように計算する．さらに，この式 (4) の右辺で，前の近似解ベクトル x(k) に第 2 項を足し込むときに，加速係数（緩和係数とも言う）ω を掛け，x(k+1) = x(k) + ωD−1 r(k)(5)

とするのが SOR 法である．ω は 0 < ω < 2 の範囲の値をとり，ω = 1 の場合が Gauss-Seidel 法ということになる．

Navier-Stokes 方程式，ならびに圧力の Poisson 方程式を，それぞれ 2 次中心差分に相当するスキー
ムで空間的に離散化することで，連立一次方程式を得るわけだが，図 1 のように格子線の曲りや不等間隔も許すため，計算空間（格子線座標 i, j, k の空間）で考えると，計算点から見て，斜め方向の点も参照することとなる．Navier-Stokes 方程式に関しては，対流項の 3 次風上差分（QUICK 法）の可能性を考慮し，i, j, k の各方向に 5 点差分と，斜めの点を合わせて，全部で 27 点の差分，圧力 Poisson 方
程式に関しては全部で 19 点の差分となる．図 2 にその関係を示す．そして，この参照関係から，係数行列の構造は図 3 のようになる．

図 2 格子点の参照関係

図 3 係数行列の形（イメージ）

さて，上記のような依存関係を含む手続きを正しく計算するために，ベクトル計算機向けのプログ
ラミングと同様に，マルチコアで並列計算においても回帰演算を回避する必要があり，本プログラム
ではマルチカラーオーダリングで実現している．オリジナル版では，ベクトル機で用いたものと同じ

1 次元化された配列を最小の色数となる 7 色でオーダリングする．圧力 Poisson 方程式に対するソー
スプログラムを付録 p2 に示す．

2.2.3

測定環境

今回は，円柱まわりの非圧縮性非定常流れの計算を性能評価用の例題とし，付録 p3 にある断面を示
すように，円柱のまわりのみと計算領域全体を覆う２種類の構造格子を重合させた計算格子を用いる．

表 1 利用計算機の概要
機種CPU スペック

CPU 数 / ノード

コア数 / CPU

4

8

RX

Intel Xeon X7560(PRIMERGY RX600S5)(Nehalem-EX), 2.26GHzFX1SPARC64 VII, 2.5GHz

1

4

京

SPARC64 VIII, 2.0GHz

1

8

FX10

SPARC64 IX, 1.848GHz

116

測定に利用した計算機の一覧を表 1 に示す．
また，それぞれの計算機で測定する際のコンパイルオプションは次の通りである．

• RX: -Am -Kfast,parallel,ocl,vppocl,tl trt,prefetch -X9 -w -KXEON55 -Qt -Ectfiu -xdir=inline dir-Karray subscript,array subscript rank=2,array subscript elementlast=25-Kprefetch iteration=15,preex• FX1: -Am -Kimpact,ocl,vppocl,tl trt -X9 -w -Qt -Ectfiu -xdir=$(MKDIR)/inline dir-Kprefetch model=FX1-Karray subscript,array subscript rank=2,array subscript elementlast=25-Kprefetch iteration=15,preex• 京,FX10: -Kfast,parallel,ocl,vppocl -Ntl trt -Nrt tune -X9-Qt -xdir=inline dir -W0,-zmpb=Swpl:message=detail-Karray subscript,array subscript rank=2,array subscript elementlast=25-Kprefetch iteration=15,preex
但し，FX10 については，後述するチューニング実行時 (2.2.4.2 節) には，これに加えてオプション(-Kprefetch stride,prefetch sequential=soft) が追加されている．
2.2.4

測定結果

2.2.4.1 オーダリングの違いに関する性能評価
オリジナル版のままでは，計算点に対するストライドアクセスが発生するために，キャッシュ利用
効率が低下することが予想された．そこで，計算空間座標 (i, j, k) に対して，各 2 色の組み合わせとする計 8 色でのオーダリングを行い（以下，改良版１），オリジナル版と比較した（但し，圧力 Poisson方程式から得られる行列方程式のみ）．後者のソースプログラムを付録 p4 に，FX1 の 1 ノード 4Coreでの比較結果，PA 情報を p5,p6 に示す．これによると，予想通り，改良版１の方がキャッシュアクセ
ス待ちを 7 割程度減らすことができ，プログラム全体で 8% 程度の実効速度向上につながった．
しかしながら，改良版１であっても，実効性能のピーク性能比は 4% 強にしか達しておらず，さらなる性能向上が求められるため，次に，付録 p7 に示す改良を試みた（以下，改良版２）．これは，計算点から遠い参照点を別格子とし，すなわち k 方向に交互にグルーピングする扱いとすることで，さらにキャッシュ利用効率を上げることを狙ったものである．ソースプログラムを付録 p8 に，社内計算機での評価結果を付録 p9 に示す．コア数が少ない場合は，若干の効果は見られたが，残念ながら期待したほどの結果とはならなかった．また，FX1，京，FX10 でのプログラム全体の計算時間計測結果を付録 p10 に示す．

2.2.4.2 コンパイルオプションによるチューニングの結果
前節でより良い性能を示した改良版においても，プロファイラの結果を見ていくと，浮動小数点演
算待ちや，ロード・ストア待ちが多く発生していることがわかる（付録 p11）
．これらの改良のために，
以下のチューニングを行った．

1. 圧力 Poisson 方程式から得られる連立一次方程式の求解ルーチン sor8p b h（改良版２）に対して，ソフトウェアパイプラインによる命令スケジューリング（具体的な詳細は付録 p12〜p13）

2. Navier-Stokes 方程式から得られる連立一次方程式の求解ルーチン sor7v b（オリジナル版）に対して，配列 clp に対するソフトウェアプリフェッチと，ストライドアクセスオプションの指定（具体的な詳細は付録 p16〜p17）
これらのチューニングの結果，付録 p14〜p15, p18 に示すように，それぞれの連立一次方程式の SOR法による求解部分において，10 ％〜11 ％の性能向上（該当サブルーチンのみでの実行時間の短縮）を得ることができた．

2.2.5

まとめ

重合格子を用いた非定常乱流計算プログラムにおける連立一次方程式の反復ソルバーを対象に，マルチコア計算機に対する性能評価，ならびに計算効率化のためのチューニングを行った．しかしながら，ベクトル計算機との併用を前提にした配列構造やオーダリング（演算順序）の範囲内での性能向上には限界があり，必ずしも，マルチコア本来の並列計算性能を十分に引き出せてはいないと考えられる．また，SOR 法を用いたこの反復ソルバーのアルゴリズムをそのまま書き下すと，一つの計算点に対して周辺の 19 点のデータを参照しながらの反復計算が必要となり，このままでは，どうしても

Byte/Flops（演算数に対するデータのロード・ストア数の割合）が大きくなってしまうことも，性能向上が容易でない要因の一つと考えられる．
以上，今回の性能評価とチューニングから得られた知見から，さらに性能を向上させるためには，• 反復解法レベルでの計算アルゴリズムの見直し• マルチコア計算機に特化した配列構造への書き換えなどの，より深い取組みが必要になってくると考えられる．今後の課題としたい．
参考文献[1] 堀之内成明, 稲垣昌英, 加藤由博, 自動車空力騒音のシミュレーション技術, 応用数理, 15 (2005),
60–64.
[2] 稲垣昌英, 安倍賢一, コロケーション格子を用いた LES の計算精度改善に関する一考察, 日本機械学会論文集, B 編, 64, 623 (1998), 1981–1988.

[3] 稲垣昌英, 近藤継男, 長野靖尚, 実用的な LES のための混合時間スケール SGS モデル, 日本機械学会論文集, B 編, 68, 673 (2002), 2572–2579.

3次元非圧縮性熱流体計算プログラムCOSMOSの測定評価 （補足資料）
株式会社 豊田中央研究所
堀之内 成明1

連立一次方程式の求解について

計算時間の大半（6割～8割）は連立一次方程式を解くことに費やされる．
次元数（=格子点数）: 数10万～数100万z 規則非対称帯行列z 各行の非零要素数: ～ 25z

解法: 定常反復法 (SOR, Gauss-Seidel)，クリロフ部分空間法 (Bi-CGSTAB, ...)z

重合格子の場合は，このような行列を格子ブロックごとに解くが， 反復の途中で境界領域の格子点に対する補間を行う．

(1),(2)の変化量が小さくなるまで
繰り返し
Gauss-Seidel like

格子 m=1m=2(1)格子
補間点をディリクレ境界とし，
r ... r格子m=(1)
A補間点をディリクレ境界とし，xΩ m Ωrm = bΩrm を解く
格子
m=NVOL(1)
A補間点をディリクレ境界とし，Ω m xΩrm = bΩrm を解く(2) 他の格子の最新の値から補間(1)rA
補間点をディリクレ境界とし，Ω xΩ =rbΩr を解く(2) 他の格子の最新の値から補間xΓAm m ←xrmΙ x=Ω ′bm を解くrΩ Ω r Ω
常に最新の値(2) 他の格子の最新の値から補間xΓ mm ← mΙ xΩ ′ mrr(2) 他の格子の内部の値から補間x ←Ι x[ ][ ][ Ωr′ ]
ΓrxΓ ← Ι [xΩ ′ ]mm

他の格子の内部領域

Multiplicative（乗法的） Schwarz Method

2

7色オーダリングによるノード内並列化（オリジナル版）
 SOR法を採用（実際には緩和係数を1としているので，Gauss-Seidel法）
 各格子ブロックごとにマルチカラーオーダリングによる自動並列化で対応
z ベクトル機でのオーダリングをそのまま流用 ⇒ 7色飛び（1次元的）配列のとり方も，それに合せて1次元並びになっている．
real*8 :: p0(n1max), bp(n1max)
real*8 :: clp(n1max,19)

real*8 :: p0(n1max), bp(n1max)
real*8 :: fj_clp(19, n1max/7+1, 0:6)

do m=1,nvol
do ic=0,6
do n1=n1min(m)+ic,n1max(m),7res=p0(n1-iip1-1)*clp(n1,1)$+p0(n1-ijp1-1)*clp(n1,2)$+p0(n11)*clp(n1,3)
$
+ ...
$
+p0(n1-ijp1)*clp(n1,9)$+p0(n1)$+p0(n1+ijp1)*clp(n1,11)
$
+ ...
$
+p0(n1+iip1+1)*clp(n1,19)&-bp(n1)p0(n1)=p0(n1)-res*omegap
enddo
enddo
オリジナルのベクトル機用コード
enddo

do m=1,nvol
連続アクセスとした
do ic=0,6
i=1
do n1=n1rs(m)+ic,n1re(m),7res=p0(n1-iip1-1)*fj_clp(1,i,ic)$+p0(n1-ijp1-1)*fj_clp(2,i,ic)$+p0(n1- 1)*fj_clp(3,i,ic)
$
+ ...
$
+p0(n1-ijp1)*fj_clp(9,i,ic)$+p0(n1)$+p0(n1+ijp1)*fj_clp(11,i,ic)
$
+ ...
$
+p0(n1+iip1+1)*fj_clp(19,i,ic)&-bp(n1)i=i+1
p0(n1)=p0(n1)-res*omegap
enddo
enddo
少し修正したコード（これで計測）
enddo

ｃｌｐのみ色ごとに3

性能評価計算の概要
 LESを用いた円柱まわりの非定常流れ場の計算
z （実用計算を踏まえ）重合格子を使用

円柱まわり:
161x56x81=757,188点

背景:121x61x81=620,248点

4

8色オーダリング（改良版１）の概要
 I,j,k各方向に2色，計8色のオーダリングに変更．但し，配列の構造（宣言）は基本的に変えていない．
do m=1,nvol

real*8 :: p0(n1max), bp(n1max)
real*8 :: fj_clp0(19, m2max/7+1, nvol),&fj_clp1(19, m2max/7+1, nvol),&...
&fj_clp7(19, m2max/7+1, nvol)

色ごとのループ

do i=1,ico0max(m)kk=(i-1)/ijp8aa
ij=-kk*ijp8aa+(i-1)
jj=ij/iip8aii=-jj*iip8a+ij
n1=(kk*2)*ijp1+(jj*2)*iip1+(ii*2)+n1rstr
res=p0(n1-iip1-1)*fj_clp0(1,i,m)+p0(n1-ijp1-1)*fj_clp0(2,i,m)+p0(n11)*fj_clp0(3,i,m)+ ...
+p0(n1-ijp1)*fj_clp0(9,i,m)+p0(n1)+p0(n1+ijp1)*fj_clp0(11,i,m)+ ...
+p0(n1+iip1+1)*fj_clp0(19,i,m)-bp(n1)p0(n1)=p0(n1)-res*omegap
enddo

$
$
$
$
$
$
$
$
&

do i=1,ico1max(m)
...
enddo
...

（圧力Poissonのみに適用）

enddo

5

評価結果の概要


JAXA殿FX1（1ノード4Core）での計測結果
スレッド並列：自動並列（VISIMPACT)z ｺﾝﾊﾟｲﾙｵﾌﾟｼｮﾝ: -Am -Kimpact,ocl,vppocl,tl_trt -X9 -w -Qt -Ectfiu -xdir=inline_dirz

7色オーダリング
ルーチン名
sor7p_b_
sor7v_b_sgs_
corvcn_sor7p_
全体

プロファイラ(count数)
31,883
10,455
7,608
4,036
2,995
64,9668色オーダリング

CPU時間
[sec]
[%]
318.8349.1%
104.55
16.1%
76.08
11.7%
40.36
6.2% 4174.03 Mips
29.95
4.6%
649.66100.0% 1608.46 Mflops

ルーチン名
sor8p_b_
sor7v_b_sgs_
corvcn_sgsbnd_全体

プロファイラ(count数)
28,331
10,482
7,618
4,018
1,153
59,442

csms_sor7(全体） - 時間 (sec)整数ロー ドメモリアクセス待ち
整数ロー ドキ ャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキ ャッシュアクセス待ち
命令フェッチ待ち
整数レ ジスタ書き込み制約

ストア待ち
整数演算待ちuOPコミット
浮動小数点レ ジスタ書き込み制約

CPU時間
[sec]
[%]
283.3147.7%
104.82
17.6%
76.18
12.8%
40.18
6.8%
11.53
1.9%
594.42100.0%

5516.60 Mips
1742.24 Mflops

csms_sor8（全体） - 時間 (sec)
I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間(sec)

整数ロー ドメモリアクセス待ち
整数ロー ドキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキ ャッシュアクセス待ち
命令フェッチ待ち
整数レ ジスタ書き込み制約

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間(sec)7.0E+02

FP演算待ち: 10%

7.0E+02

FP演算待ち: 12% (+9sec)
6.0E+02

6.0E+02

5.0E+02

5.0E+02

4.0E+02

4.0E+02

FPﾛｰﾄﾞｷｬｯｼｭｱｸｾｽ待ち: 23%
3.0E+02

3.0E+02

FPﾛｰﾄﾞｷｬｯｼｭｱｸｾｽ待ち: 13% (-74sec)

2.0E+02

2.0E+02

FPﾛｰﾄﾞﾒﾓﾘｱｸｾｽ待ち: 41%

1.0E+02

1.0E+02

0.0E+00

FPﾛｰﾄﾞﾒﾓﾘｱｸｾｽ待ち: 38% (-40sec)

0.0E+00
Process 0 Thread 0

Process 0 Thread 1

Process 0 Thread 2

Process 0 Thread 3

Process 0 Thread 0

Process 0 Thread 1

Process 0 Thread 2

Process 0 Thread 3

6

コスト上位ルーチン別のPA情報

圧力Poisson方程式のSOR計算
7色オーダリング

3.5E+02

8色オーダリング

時間(sec)3.0E+02

3.0E+02

2.5E+02

2.5E+02

2.0E+02

FPﾛｰﾄﾞｷｬｯｼｭｱｸｾｽ待ち: 34%

2.0E+02

1.5E+02
1.5E+02

1.0E+02
1.0E+02

FPﾛｰﾄﾞﾒﾓﾘｱｸｾｽ待ち: 46%

FPﾛｰﾄﾞﾒﾓﾘｱｸｾｽ待ち: 43%
5.0E+01

5.0E+01

0.0E+00

0.0E+00
Process 0 Thread 0

Process 0 Thread 1

Process 0 Thread 2

Process 0 Thread 0

Process 0 Thread 3

Process 0 Thread 1

Process 0 Thread 2

 運動方程式のSOR計算

 SGS項算出

1.2E+02

9.0E+01

Process 0 Thread 3

8.0E+01
1.0E+02
7.0E+01

8.0E+01

6.0E+01

5.0E+01
6.0E+01
4.0E+01

FP演算待ち: 33%
4.0E+01

3.0E+01

FPﾛｰﾄﾞﾒﾓﾘｱｸｾｽ待ち: 70%

2.0E+01
2.0E+01
1.0E+01

0.0E+00

0.0E+00
Process 0 Thread 0

Process 0 Thread 1

Process 0 Thread 2

Process 0 Thread 3

Process 0 Thread 0

Process 0 Thread 1

Process 0 Thread 2

Process 0 Thread 3

7

更なる性能向上に向けた試み（改良版２）
今回
前回

6
8

全てを
一つの配列
p0に持つ

4

5

2

4

1

3
8

7

6

8

8

7

6
8

8

3

2

4

p1

8

p2

4
5

7

7

6

k方向を交互に二つの配列
p1, p2に持つ8を計算するときは同じ配列をみる
はを計算するときに参照される

数字は色分けの番号

キャッシュに乗りやすい近くの点は別の配列をみる
キャッシュに乗りにくい遠くの点

8

ソースのイメージ
real*8 :: p1(m2max,0:1,nvol)
real*8 :: p0(n1max), bp(n1max)
real*8 :: fj_clp0(19, m2max/7+1, nvol),&fj_clp1(19, m2max/7+1, nvol),&...
&fj_clp7(19, m2max/7+1, nvol)

do m=1,nvol
do i=1,ico0max(m)kk=(i-1)/ijp8aa
ij=-kk*ijp8aa+(i-1)
jj=ij/iip8aii=-jj*iip8a+ij
nn1=kk*ijp1+(jj*2)*iip1+(ii*2)+nn1rst
n1 =nn1+kk*ijp1+n1rsg
nn2=nn1-ijp1
$
$
$
$
$
$
$
$
$
$
$
&

ここでは p1,p2 をp1(:,0:1,:) として一つの配列にしてある

res=p1(nn1-iip1-1,0,m)*fj_clp0(1,i,m)+p1(nn2-1,1,m)*fj_clp0(2,i,m)+p1(nn11,0,m)*fj_clp0(3,i,m)+ …
+p1(nn1-iip1 ,1,m)*fj_clp0(8,i,m)+p1(nn2,1,m)*fj_clp0(9,i,m)+p1(nn1,0,m)+p1(nn1,1,m)*fj_clp0(11,i,m)+ …
+p1(nn1+1,0,m)*fj_clp0(17,i,m)+p1(nn1+1,1,m)*fj_clp0(18,i,m)+p1(nn1+iip1+1,0,m)*fj_clp0(19,i,m)-bp(n1)p1(nn1,0,m)=p1(nn1,0,m)-res*omegap

enddo
do i=1,ico1max(m)
...
enddo
...
enddo

9

結果

圧力Poisson部のみの計算時間[秒] 結果的にはあまり速度向上はしなかった．
120
100
80
前回

60

今回

40
20
0
2core

4core

8core

32core但し，以下の社内計算機で評価
PRIMERGY RX600S5 x 11node
Intel Xeon X7560 (Nehalem-EX)
8core/chip, 4chip/node
2.26GHz, 24MB Chache

測定結果
 CSMS_SOR8最新版（改良版２）のFX1、京、FX10での測定結果
 イタレーションは、step=50で測定■FX1、京、FX10 実行時間比較 (timeコマンドのreal)
FX1
京
実行時間
実行時間
スケール Thread
スケール
Thread(秒)(秒)
1th 931.36
1.00
1th 997.14
1.00
csms_
sor8
4th 405.91
2.31
8th 144.59
6.90

FX10
実行時間
スケール
Thread(秒)
1th 1187.14
1.00
16th
90.64
13.10

■FX1比
csms_
sor8

Thread
1th
4th

FX1
1.00
1.00

(目安：FX1とのF演算ピーク性能比)
Thread
FX1
1th
1.00
コア
4th
1.00
ノード

Thread
1th
8th

京
0.93
2.81

Thread
1th
16th

FX10
0.78
4.48

Thread
1th
8th

京
1.59
3.17

Thread
1th
16th

FX10
1.47
5.87

10

Copyright 2013 FUJITSU LIMITED

高コストのPA情報（FX10）
 PA情報スレッド０
step=50

メモリスループットは少し余裕がある。
L2ミス(dm)率が高い。
演算待ちが多い。

FX10 (16スレッド)

浮動小数点待ちが多く
命令スケジューリング
の余地があるか？

メモリスループットは
少し余裕がある。
L2ミス(dm)率が高い。

sor7v_b T0
sgs T0sor8p_b_h T0③②①
Performance

SIMD
実行時間 (sec)浮動小数点演算
ピーク比

11.11
12.71
36.80

2.94%
4.80%
3.55%

MFLOPS
434
710
525

458
1390
1321

SIMD演算命令率 SIMDロード命令率 SIMDストア命令率
SIMD命令率(/SIMD対象命令 (/SIMD対象演算 (/SIMD対象ロード (/SIMD対象ストア
命令数)
命令数)
命令数)
数）
25.21%
31.41%
99.99%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
10.65%
21.57%
99.98%0.00%
0.00%

SIMD命令率(/有効総命令数)

浮動小数点演算数

MIPS

4.82E+09
9.02E+09
1.93E+10

Cache

sor7v_b T0
sgs T0sor8p_b_h T0

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

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

0.05%
0.00%
0.02%

25.99%
4.12%
6.24%

L2 ミス率(/ロード・ストア数)
sor7v_b T0
sgs T0sor8p_b_h T0

9.62%
0.34%
5.46%

L2 ミス数
2.71E+08
2.20E+07
1.03E+09

ロード・ストア数
2.81E+09
6.45E+09
1.89E+10
L2 ミス dm 率(/L2 ミス数)
23.17%
27.26%
7.47%

L1D ミス数

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

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

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

52.05%
70.90%
41.06%

26.33%
3.43%
58.93%

21.62%
25.67%
0.00%

7.32E+08
2.66E+08
1.18E+09
L2 ミス pf 率(/L2 ミス数)

メモリスループット(GB/sec)

L2 スループット(GB/sec)

3.61
0.24
3.92

8.43
2.68
4.09

76.83%
72.74%
92.53%11µDTLB ミス率
mDTLB ミス率(/ロード・ストア(/ロード・ストア数)
数)
0.00292%0.00002%0.00083%0.00001%
0.00424%0.00001%高コスト③sor8p_b_hチューニングについて
 Loop1チューニング
 「浮動小数点演算待ち」と「整数演算待ち」が多い。
ソフトウェアパイプライン(SWP)による命令スケ
ジューリングがされてない。
-KSWPオプションは有効であったが、コンパイラがSWPしても効果が無いと判断して、SWPしていなかった。
そのため、最適化制御行（OCL）で強制的にSWPしたところ、効果が見られた。

12

チューニングソース
 チューニング後のソース
 DOループの前の66行目に !ocl swp を追加
62
63
64
65
66

67
68
69
70
71
72
73
74
75

1 pp
1 p
1 p
1 p
1 p
1 p
1 p
1 p
1 p

*vocl loop,novrec(p1,div)*voption indep(p1,div)!cdir nodep(p1),nosync
追加!cdir on_adb(p1)!ocl swp<<< Loop-information Start >>><<< [PARALLELIZATION]<<< Standard iteration count: 69<<< [OPTIMIZATION]<<< SIMD<<< SOFTWARE PIPELINING<<< Loop-information End >>>v
do i=1,ico0max(m)v
kk=(i-1)/ijp8aav
ij=-kk*ijp8aa+(i-1)
v
jj=ij/iip8av
ii=-jj*iip8a+ijv
k1 =kk*ijp1v
nn1=k1+(jj*2)*iip1+(ii*2)+nn1rstv
n1 =k1+nn1+n1rsgv
nn2=nn1-ijp1

76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

13

1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

p

v
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
&

p
p
p

v
v
v

res=p1(nn1-iip1-1,0,m)*fj_clp0(1,i,m)+p1(nn2-1,1,m)*fj_clp0(2,i,m)+p1(nn11,0,m)*fj_clp0(3,i,m)+p1(nn1-1,1,m)*fj_clp0(4,i,m)+p1(nn1+iip1-1,0,m)*fj_clp0(5,i,m)+p1(nn2-iip1 ,1,m)*fj_clp0(6,i,m)+p1(nn1-iip1 ,0,m)*fj_clp0(7,i,m)+p1(nn1-iip1 ,1,m)*fj_clp0(8,i,m)+p1(nn2,1,m)*fj_clp0(9,i,m)+p1(nn1,0,m)+p1(nn1,1,m)*fj_clp0(11,i,m)+p1(nn2+iip1 ,1,m)*fj_clp0(12,i,m)+p1(nn1+iip1 ,0,m)*fj_clp0(13,i,m)+p1(nn1+iip1 ,1,m)*fj_clp0(14,i,m)+p1(nn1-iip1+1,0,m)*fj_clp0(15,i,m)+p1(nn2+1,1,m)*fj_clp0(16,i,m)+p1(nn1+1,0,m)*fj_clp0(17,i,m)+p1(nn1+1,1,m)*fj_clp0(18,i,m)+p1(nn1+iip1+1,0,m)*fj_clp0(19,i,m)-bp(n1)p1(nn1,0,m)=p1(nn1,0,m)-res*omegap
div(n1)=abs(res)enddo高コスト③sor8p_b_hチューニング結果(Loop1)
 Loop1チューニング
チューニングの結果、「浮動小数点演算待ち」と「整数演算待ち」のコストが減った。
その結果として、
メモリスループットが約68GB/secになった。

約11%
性能向上

性能は約11%向上した。

Performance
実行時間 (sec)浮動小数点演算
ピーク比

0.49
0.43

3.39%
3.79%

オリジナル
SWPL

MFLOPS

MIPS

501
561

浮動小数点演算
数

1272
1537

2.43E+08
2.43E+08

メモリスループットが3.79 ⇒ 4.24 GB/secに改善。
16スレッドで、約68GB/sとなっており、
メモリスループットネックとなっている。

Cache
L1I ミス率L1D ミス率
ロード・ストア数(/有効総命令数) (/ロード・ストア数)
オリジナル
SWPL

0.06%
0.06%

6.18%
5.09%

2.39E+08
2.94E+08

L1D ミス数
1.48E+07
1.50E+07

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

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

42.23%
38.24%

57.75%
61.73%

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

L2 ミス率(/ロード・ストア数)
5.42%
4.38%

L2 ミス数
1.30E+07
1.29E+07

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

L2 ミス pf 率(/L2 ミス数)

8.05%
9.23%

メモリスループット(GB/sec)

L2 スループット(GB/sec)

3.79
4.24

3.90
4.41

91.95%
90.77%

14

高コスト③sor8p_b_hチューニング結果(Loop1-8)
 Loop1-8チューニング結果（16スレッド並列のスレッド０）

Loop1-8は、ほぼ同じ処理のループです。
Loop1-8の合計でもLoop1と同様に、約11%の性能改善とメモリースループット
ネックになっています。

実行時間
(sec)
Loop1
Loop2
Loop3
Loop4
Loop5
Loop6
Loop7

15

Loop8

オリジナル
SWPL
オリジナル
SWPL
オリジナル
SWPL
オリジナル
SWPL
オリジナル
SWPL
オリジナル
SWPL
オリジナル
SWPL
オリジナル
SWPL

0.49
0.43
0.48
0.43
0.49
0.43
0.48
0.42
0.48
0.44
0.47
0.43
0.48
0.43
0.47
0.43

メモリ
スループット(GB/sec)
3.79
4.24
3.83
4.33
3.82
4.28
3.83
4.30
3.90
4.28
3.96
4.33
3.87
4.35
3.88
4.34

高コスト①のチューニングについて 高コスト①のsor7v_b
 -Karray_subscript, array_subscript_rank=2, array_subscript_elementlast=25

が既に指定されていて、 配列clp は次元移動により連続アクセス化がされていました。
 L2ミス(dm)率が高いため、配列clpのプリフェッチ(HWPF)が効果的でないのではないか？と言う観点で、HWPFを止めてSWPで検証しました。
また、コンパイラからは配列clp は 38 2 pp v
do 100 n1=n1rs(m)+ic,n1re(m),7
coef=omegav/clp(n1,10)
ストライドアクセスに見えるため、 404243 222 pp v $ resu=u(n1-iip1-1)*clp(n1,1) +u(n1-ijp1-1)*clp(n1,2)+u(n1- 1)*clp(n1,3) +u(n1+ijp1-1)*clp(n1,4)
44
2
$
+u(n1
+iip1-1)*clp(n1,5) +u(n1-ijp1-iip1 )*clp(n1,6)
ストライドアクセスオプションも
45
2$+u(n1-iip1)*clp(n1,7) +u(n1+ijp1-iip1 )*clp(n1,8)46
2$+u(n1-ijp1)*clp(n1,9) +u(n1)*clp(n1,10)
指定しました。
47
2$+u(n1+ijp1)*clp(n1,11)+u(n1-ijp1+iip1 )*clp(n1,12)48
2$+u(n1+iip1)*clp(n1,13)+u(n1+ijp1+iip1 )*clp(n1,14)
49
2
$
+u(n1
-iip1+1)*clp(n1,15)+u(n1-ijp1+1)*clp(n1,16)
オプションは以下です。
50
2$+u(n1+ 1)*clp(n1,17)+u(n1+ijp1+1)*clp(n1,18)
51
2
$
+u(n1
+iip1+1)*clp(n1,19)-Kprefetch_stride56
2$-bu(n1)58
2pv
resv=v(n1-iip1-1)*clp(n1,1) +v(n1-ijp1-1)*clp(n1,2)-Kprefetch_sequential=soft
59
2$+v(n1- 1)*clp(n1,3) +v(n1+ijp1-1)*clp(n1,4)
60
2
$
+v(n1
+iip1-1)*clp(n1,5) +v(n1-ijp1-iip1 )*clp(n1,6)-Kprefetch_stride (使用手引書より抜粋)
ループ内で使用されるキャッシュのラインサイズよりも大きなストライドでアクセスされる配列データに対して、
prefetch命令を使用したオブジェクトを生成します。
プリフェッチするアドレスが翻訳時に確定しないループを含みます。

61
62
63
64
65
66
67
72
：
：
103
106

2
2
2
2
2
2
2
2

$
$
$
$
$
$
$
$

2
1

p

100
110

+v(n1-iip1)*clp(n1,7) +v(n1+ijp1-iip1 )*clp(n1,8)+v(n1-ijp1)*clp(n1,9) +v(n1)*clp(n1,10)+v(n1+ijp1)*clp(n1,11)+v(n1-ijp1+iip1 )*clp(n1,12)+v(n1+iip1)*clp(n1,13)+v(n1+ijp1+iip1 )*clp(n1,14)+v(n1-iip1+1)*clp(n1,15)+v(n1-ijp1+1)*clp(n1,16)+v(n1+ 1)*clp(n1,17)+v(n1+ijp1+1)*clp(n1,18)+v(n1+iip1+1)*clp(n1,19)-bv(n1)

continue
continue

16

sor7v_b ①
251

do 110 ic=0,6<<< Loop-information Start >>><<< [PARALLELIZATION]<<<
Standard iteration count: 37<<< [OPTIMIZATION]
<<<
SIMD
<<<
SOFTWARE PIPELINING<<<
PREFETCH: 90<<<
v: 54, bw2: 6, bw: 6, w: 18, bv: 6<<< Loop-information End >>>v
do 100 n1=n1rs(m)+ic,n1re(m),7
coef=omegav/clp(n1,10)v
resu=u(n1-iip1-1)*clp(n1,1) +u(n1-ijp1-1)*clp(n1,2)$+u(n11)*clp(n1,3) +u(n1+ijp1-1)*clp(n1,4)$+u(n1+iip1-1)*clp(n1,5) +u(n1-ijp1-iip1 )*clp(n1,6)$+u(n1-iip1)*clp(n1,7) +u(n1+ijp1-iip1 )*clp(n1,8)$+u(n1-ijp1)*clp(n1,9) +u(n1)*clp(n1,10)$+u(n1+ijp1)*clp(n1,11)+u(n1-ijp1+iip1 )*clp(n1,12)$+u(n1+iip1)*clp(n1,13)+u(n1+ijp1+iip1 )*clp(n1,14)$+u(n1-iip1+1)*clp(n1,15)+u(n1-ijp1+1)*clp(n1,16)$+u(n1+
1)*clp(n1,17)+u(n1+ijp1+1)*clp(n1,18)
26
1
$
+u(n1
+iip1+1)*clp(n1,19)$-bu(n1)：100
continue
110
continue

プリフェッチオプションはデフォルト

38
40
42
43
44
45
46
47
48
49
50
51
56

2 pp
2 p
2 p
2
2
2
2
2
2
2
2
2
2

103 2
106 1

p

-Kprefetch_stride-Kprefetch_sequential=soft 指定-Kprefetch_stride,-Kprefetch_sequential=soft
により、配列 clp に対して、
prefetch命令が生成されて
いる。

39
41
43
44
45
46
47
48
49
50
51
52
57

2 pp
2 p
2 p
2
2
2
2
2
2
2
2
2
2

104
107

2
1

17

p

do 110 ic=0,6<<< Loop-information Start >>><<< [PARALLELIZATION]<<<
Standard iteration count: 37<<< [OPTIMIZATION]
<<<
SIMD
<<<
SOFTWARE PIPELINING<<<
PREFETCH: 222<<<
u: 54, v: 54, bu: 6, w: 54, bw2: 6<<<
bw: 6, clp: 36, bv: 6<<< Loop-information End >>>v
do 100 n1=n1rs(m)+ic,n1re(m),7
coef=omegav/clp(n1,10)v
resu=u(n1-iip1-1)*clp(n1,1) +u(n1-ijp1-1)*clp(n1,2)$+u(n11)*clp(n1,3) +u(n1+ijp1-1)*clp(n1,4)$+u(n1+iip1-1)*clp(n1,5) +u(n1-ijp1-iip1 )*clp(n1,6)$+u(n1-iip1)*clp(n1,7) +u(n1+ijp1-iip1 )*clp(n1,8)$+u(n1-ijp1)*clp(n1,9) +u(n1)*clp(n1,10)$+u(n1+ijp1)*clp(n1,11)+u(n1-ijp1+iip1 )*clp(n1,12)$+u(n1+iip1)*clp(n1,13)+u(n1+ijp1+iip1 )*clp(n1,14)$+u(n1-iip1+1)*clp(n1,15)+u(n1-ijp1+1)*clp(n1,16)$+u(n1+
1)*clp(n1,17)+u(n1+ijp1+1)*clp(n1,18)$+u(n1+iip1+1)*clp(n1,19)$-bu(n1)：100
continue
110
continuePA情報 [ sor7v_b ] sor7v_b ①
プリフェッチオプション
デフォルト
[秒]
1.2E+00(PA情報はstep=5)-Kprefetch_stride-Kprefetch_sequential=soft

L2ミスdm率が高く、「浮動小数点ロードメモリアクセス待ち」が発生↓約10%の性能向上

1.0E+00

プリフェッチ生成により約10%の性能向上

8.0E-01
6.0E-01

浮動小数点ロードキャッシュアクセス待ち・オプションによるプリフェッチの生成をした。

4.0E-01
2.0E-01

浮動小数点ロード
メモリアクセス待ち⇒ L2のdmミス削減

0.0E+00

Before T0

OPT Tune T0

Performance

SIMD
実行時間 (sec)浮動小数点演算
ピーク比

1.11
1.00

2.94%
3.25%

Before T0
OPT Tune T0

MFLOPS
434
480

浮動小数点演算
数

MIPS
458
632

4.82E+08 Before T0
4.82E+08 OPT Tune T0

SIMD命令率 SIMD演算命令率 SIMDロード命令率 SIMDストア命令率
SIMD命令率(/SIMD対象命令 (/SIMD対象演算 (/SIMD対象ロード (/SIMD対象ストア(/有効総命令数)
命令数)
命令数)
命令数)
数）
25.20%
31.41%
99.99%
0.00%
0.00%
20.20%
31.41%
99.99%
0.00%
0.00%
16スレッドで、約70.4GB/sとなっており、
メモリスループットネックとなっている。

Cache
L1I ミス率L1D ミス率
ロード・ストア数(/有効総命令数) (/ロード・ストア数)
Before T0
OPT Tune T0

0.05%
0.05%

25.99%
26.91%

2.82E+08
3.02E+08

L1D ミス数

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

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

7.32E+07
8.14E+07

52.05%
54.89%

26.33%
0.01%

L1D ミス swpf 率(/L1D ミス数)
21.62%
45.11%
18

L2 ミス率L2 ミス数(/ロード・ストア数)
9.62%
9.97%

2.71E+07
3.02E+07

L2 ミス dm 率(/L2 ミス数)
23.15%
3.38%

L2 ミス pf 率 メモリスループット L2 スループット(/L2 ミス数) (GB/sec)(GB/sec)
76.85%
96.62%

3.63
4.40

8.42
10.37

2.3

３次元電磁界コード FDTD3 の測定評価
名古屋大学太陽地球環境研究所

2.3.1.

梅田 隆行

はじめに
Finite-Difference-Time-Domain （ FDTD ）法 は、1966 年 に電 磁 場 解 析 用 のシミュレーション

手 法 として考 案 されて以 来 、幅 広 く用 いられている。オリジナルの FDTD 法 は、電 場 と磁 場 を時間 的 にΔt/2 ずらし、また電 場 成 分 (Ex,Ey,Ez)と磁 場 成 分 (Bx,By,Bz)も空 間 的 に半 格 子 ずらす
ことによって、メモリ消 費 量 を増 やさずに Maxwell 方 程 式 に基 づく時 間 空 間 差 分 を 2 次 精 度 で行う手 法 である。近 年 では音 響 解 析 にも利 用 され ており、質 量 密 度 と圧 力 を同 様 に空 間 的 に半 格
子 ずらすことによって 2 次 精 度 の時 間 空 間 差 分 を実 現 している。FDTD3 は、３次 元 の電 磁 場 解
析 をおこなうプログラムであり、プラズマ科 学 を含 む電 磁 場 の諸 問 題 に幅 広 く適 応 されている。

2.3.2.

プログラム概 要
FDTD コードは、Maxwell 方 程 式 による電 場 の更 新 と磁 場 の更 新 を交 互 に行 う。電 磁 場 の各

成 分 （ Ex,Ey,Ez,Bx,By,Bz ） は 、 空 間 差 分 が 2 次 精 度 に な る よ う に 、 Yee 格 子 と 呼 ば れ る
Staggered 格 子 上 に定 義 される。


 1 E  B  0 J  2
 c t
B E  
t

(1)
(2)

また、式 (1)及 び(2)の時 間 積 分 が２次 精 度 になるように、電 場 と磁 場 は互 いにΔt/2 ずれた時
刻 に定 義 される。プログラム１に具 体 的 な計 算 手 順 を示 す。またプログラム２には、配 列 の定 義 の方 法 について示 す。

2.3.3.

測定環境
性 能 測 定 には、名 古 屋 大 学 の FX1、東 京 大 学 の FX10 及 び、京 を使 用 した。なお、本 測 定 は

単 一 ノードで行 い、MPI を用 いた並 列 性 能 の測 定 は行 わない。コンパイラオプションは以 下 のとおりである。
FX1（富 士 通 コンパイラ）: -Kfast,impact,OMP
FX10, 京 （富 士 通 コンパイラ）: -Kfast,visimpact,openmp,preex,simd=2

2.3.4.

測定結果
以 下 の４通 りの計 測 を行 った。また計 算 サイズは 512x512x256(～10GB)とした。

①ループを融 合 （プログラム１）、配 列 の定 義 は Type A②ループを分 割 （プログラム３）、配 列 の定 義 は Type A③ループを融 合 （プログラム１）、配 列 の定 義 は Type B④ループを分 割 （プログラム３）、配 列 の定 義 は Type B
ここで「ループを分 割 」とは、プログラム 1 では１つの 3 重 ループで行 っていた Ex,Ey,Ez 及 び
Bx,By,Bz の更 新 を、プログラム３のようにそれぞれ別 の３重 ループに分 割 して行 うことを意 味 する。
また配 列 の定 義 の違 いは、Type A では添 え字 i に対 して連 続 アクセスとなり、Type B ではある座
標 の電 磁 場 （ Ex,Ey,Ez,Bx,By,Bz ）や定 数 成 分 （ sgx,sgy,sgz,epx,epy,epz ）に対 して連 続 アク セ1

ス と な る 。 な お 、 ベ ク ト ル プ ロ セ ッ サ (VPP 等 ) で は Type A が 、 １ ０ 年 前 の ス カ ラ プ ロ セ ッ サ（PrimePower HPC2500 等 ）では Type B が高 速 であった。
なお本 プログラムでは、逐 次 計 測 に対 して、マルチスレッドでの計 測 では実 効 効 率 がかなり低下 する。これは、ループ内 の和 積 等 の浮 動 小 数 点 演 算 数 が少 ないのに対 して、 配 列 へのアクセ
スが非 常 に多 く、メモリバンド幅 ネックになっているためである。
計 測 結 果 を表 1 に示 す。FX1 及 び FX10 においては、①の場 合 が最 も高 速 であった。この理
由 は 以 下 の と お り で あ る 。 ま ず ① の 場 合 で は 、 プ ロ グ ラ ム １ の ４ -6 行 目 に お い て 、 fff(i,j,k,1),fff(i,j,k,5), fff(i,j-1,k,5), fff(i,j,k,6), fff(i,j,k-1,6), eee(i,j,k,1), eee(i,j,k,4)がキャッシュに読 み
込 まれる。また 7-9 行 目 において、fff(i,j,k,2), fff(i,j,k,4), fff(i,j,k-1,4), eee(i,j,k,2), eee(i,j,k,5)
が キ ャ ッ シ ュ に 読 み 込 ま れ る が 、 fff(i,j,k,6) は 既 に 読 み 込 ま れ て い る 。 10-13 行 目 に お い て は 、fff(i,j,k,3), fff(i,j-1,k,4), eee(i,j,k,3), eee(i,j,k,6)がキャッシュに読 み込 まれるが、fff(i,j,k,5)とfff(i,j,k,4) は 既 に 読 み 込 ま れ て い る 。 同 様 に 19-27 行 目 に お い て 、 fff(i,j,k,1), fff(i,j,k,2),fff(i,j,k,3)は既 にキャッシュに読 み込 まれたデータの再 利 用 が行 われる。 一 方 ループを分 割 する②の場 合 は、キャッシュデータの再 利 用 は行 われないため、読 み込 みが増 える。
③の場 合 では、プログラム１の４ -6 行 目 において、 fff(1,i,j,k) ～fff(4,i+2,j,k), fff(1,i,j-1,k)～fff(4,i+2,j-1,k), fff(1,i,j,k-1)～fff(4,i+2,j,k-1), eee(1,i,j,k)～eee(4,i+2,j,k)がキャッシュに読 み
込 まれる。7-9 行 目 と 10-13 行 目 においては、既 にキャッシュ読 み込 まれているデータを使 用 する
ため、Type A に比 べて読 み込 みが格 段 に減 っているのが分 かる。しかし、読 み込 まれたデータのうち fff(5,i,j-1,k)や fff(6,i,j,k-1)は使 用 されないため、キャッシュ効 率 が落 ちる。同 様 に、19-27
行 目 においても、キャッシュに読 み込 まれたデータのうち fff(2,i,j-1,k)や fff(3,i,j,k-1)は使 用 されないため、キャッシュ効 率 が落 ちる。 ループを分 割 する④の場 合 は、さらに使 用 されないデータが増 えるため、キャッシュ効 率 はさらに落 ちる。
従 って本 プログラムの場 合 、ループを融 合 し、かつ電 磁 場 データ（ Ex,Ey,Ez,Bx,By,Bz）に対 しては Type A の配 列 の定 義 を採 用 し、定 数 成 分 データ（sgx,sgy,sgz,epx,epy,epz 等 ）に対 してはType B の配 列 の定 義 を採 用 したほうが高 効 率 となる。

2.3.5.

まとめ
今 回 の計 測 で得 られた知 見 は、以 下 のとおりである。

A. 一 般 的 には Type B の配 列 の定 義 を使 用 したほうがメモリアクセスは減 るが、キャッシュへ読 み
込 まれたデータの中 で利 用 されないものがある場 合 には、Type A を採 用 したほうが良 い。
B. ループ内 の演 算 における キャッシュデータの 再 利 用 率 が高 い場 合 は 、ループを融 合 したほうが良 い。
C. シングルスレッドにおける実 効 効 率 に対 して、マルチスレッドにおける実 効 効 率 がかなり低 下 する場 合 は、プログラムがメモリバンド幅 ネックになっている可 能 性 が高 い。この場 合 、 計 算 精 度を上 げたりしてループ内 の演 算 を増 やした場 合 でも 、浮 動 小 数 点 演 算 の実 効 効 率 自 体 が上がり経 過 時 間 はそれほど変 わらない可 能 性 がある。
D. ストリーム数 を減 らすために、できるだけ配 列 を融 合 したほうがよい。また、 Type A は、配 列 のパディング（一 次 元 目 に+16 等 をする）が必 要 。

2

表１：FDTD3D の性能。
格子点数 512x512x512、時間ステップ 10 での結果。

FX1－4 スレッド

京－8 スレッド

FX10－16 スレッド

①ループ融 合 ＋Type A

45.82 sec

30.32 sec

35.45 sec

②ループ分 割 ＋Type A

58.12 sec

33.42 sec

42.53 sec

③ループ融 合 ＋Type A

58.60 sec

37.65 sec

46.72 sec

④ループ分 割 ＋Type A

166.50 sec

107.48 sec

151.42 sec

プログラム

プログラム１：計算部分（ループ融合）!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(ii,jj,kk)!$OMP DO SCHEDULE(static,1)
1
2
3

do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1!---- Ex[HFF] ---4

ex(ii,jj,kk)=ex(ii,jj,kk)*sgx(ii,jj,kk) &5+((hz(ii,jj,kk)-hz(ii,jj-1,kk ))*epx(ii,jj,kk) &6-(hy(ii,jj,kk)-hy(ii,jj ,kk-1))*epx(ii,jj,kk))!---- Ey[FHF] ---7

ey(ii,jj,kk)=ey(ii,jj,kk)*sgy(ii,jj,kk) &8+((hx(ii,jj,kk)-hx(ii ,jj,kk-1))*epy(ii,jj,kk) &9-(hz(ii,jj,kk)-hz(ii-1,jj,kk ))*epy(ii,jj,kk))!---- Ez[FFH] ---10ez(ii,jj,kk)=ez(ii,jj,kk)*sgz(ii,jj,kk) &11+((hy(ii,jj,kk)-hy(ii-1,jj ,kk))*epz(ii,jj,kk) &12-(hx(ii,jj,kk)-hx(ii ,jj-1,kk))*epz(ii,jj,kk))

13
14
15

end doend doend do!$OMP END DO!$OMP END PARALLEL!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(ii,jj,kk)!$OMP DO SCHEDULE(static,1)
16
17
18

do kk=nzsm1,nze
do jj=nysm1,nye
do ii=nxsm1,nxe!---- Hx[FHH] ---19

hx(ii,jj,kk)=hx(ii,jj ,kk )

&
3

20

-((ez(ii,jj+1,kk )-ez(ii,jj,kk))*mux(ii,jj,kk) &21-(ey(ii,jj ,kk+1)-ey(ii,jj,kk))*mux(ii,jj,kk))!---- Hy[HFH] ---22

hy(ii,jj,kk)=hy(ii ,jj,kk )&23-((ex(ii ,jj,kk+1)-ex(ii,jj,kk))*muy(ii,jj,kk) &24-(ez(ii+1,jj,kk )-ez(ii,jj,kk))*muy(ii,jj,kk))!---- Hz[HHF] ---25hz(ii,jj,kk)=hz(ii ,jj ,kk)&

26-((ey(ii+1,jj ,kk)-ey(ii,jj,kk))*muz(ii,jj,kk) &27-(ex(ii ,jj+1,kk)-ex(ii,jj,kk))*muz(ii,jj,kk))

28
29
30

end doend doend do!$OMP END DO!$OMP END PARALLEL

プログラム 2：配列の定義!------ Type A ------#define ex(i,j,k) fff(i,j,k,1)#define ey(i,j,k) fff(i,j,k,2)#define ez(i,j,k) fff(i,j,k,3)#define hx(i,j,k) fff(i,j,k,4)#define hy(i,j,k) fff(i,j,k,5)#define hz(i,j,k) fff(i,j,k,6)#define sgx(i,j,k) eee(i,j,k,1)#define sgy(i,j,k) eee(i,j,k,2)#define sgz(i,j,k) eee(i,j,k,3)#define epx(i,j,k) eee(i,j,k,4)#define epy(i,j,k) eee(i,j,k,5)#define epz(i,j,k) eee(i,j,k,6)#define mux(i,j,k) bbb(i,j,k,1)#define muy(i,j,k) bbb(i,j,k,2)#define muz(i,j,k) bbb(i,j,k,3)!---------------------!------- Type B ------#define ex(i,j,k) fff(1,i,j,k)#define ey(i,j,k) fff(2,i,j,k)#define ez(i,j,k) fff(3,i,j,k)#define hx(i,j,k) fff(4,i,j,k)4

#define hy(i,j,k) fff(5,i,j,k)#define hz(i,j,k) fff(6,i,j,k)#define sgx(i,j,k) eee(1,i,j,k)#define sgy(i,j,k) eee(2,i,j,k)#define sgz(i,j,k) eee(3,i,j,k)#define epx(i,j,k) eee(4,i,j,k)#define epy(i,j,k) eee(5,i,j,k)#define epz(i,j,k) eee(6,i,j,k)#define mux(i,j,k) bbb(1,i,j,k)#define muy(i,j,k) bbb(2,i,j,k)#define muz(i,j,k) bbb(3,i,j,k)!-----------------------

プログラム３：計算部分（ループ分割）!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(ii,jj,kk)!$OMP DO SCHEDULE(static,1)
1
2
3

do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1!---- Ex[HFF] ---4

ex(ii,jj,kk)=ex(ii,jj,kk)*sgx(ii,jj,kk) &5+((hz(ii,jj,kk)-hz(ii,jj-1,kk ))*epx(ii,jj,kk) &6-(hy(ii,jj,kk)-hy(ii,jj ,kk-1))*epx(ii,jj,kk))

7
8
9

end doend doend do!$OMP END DO!$OMP DO SCHEDULE(static,1)
10
11
12

do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1!---- Ey[FHF] ---13ey(ii,jj,kk)=ey(ii,jj,kk)*sgy(ii,jj,kk) &14+((hx(ii,jj,kk)-hx(ii ,jj,kk-1))*epy(ii,jj,kk) &15-(hz(ii,jj,kk)-hz(ii-1,jj,kk ))*epy(ii,jj,kk))

16
17
18

end doend doend do!$OMP END DO!$OMP DO SCHEDULE(static,1)
5

19
20
21

do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1!---- Ez[FFH] ---22ez(ii,jj,kk)=ez(ii,jj,kk)*sgz(ii,jj,kk) &23+((hy(ii,jj,kk)-hy(ii-1,jj ,kk))*epz(ii,jj,kk) &24-(hx(ii,jj,kk)-hx(ii ,jj-1,kk))*epz(ii,jj,kk))

25
26
27

end doend doend do!$OMP END DO!$OMP END PARALLEL!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(ii,jj,kk)!$OMP DO SCHEDULE(static,1)
28
29
30

do kk=nzsm1,nze
do jj=nysm1,nye
do ii=nxsm1,nxe!---- Hx[FHH] ---31

hx(ii,jj,kk)=hx(ii,jj ,kk )&32-((ez(ii,jj+1,kk )-ez(ii,jj,kk))*mux(ii,jj,kk) &33-(ey(ii,jj ,kk+1)-ey(ii,jj,kk))*mux(ii,jj,kk))

34
35
36

end doend doend do!$OMP END DO!$OMP DO SCHEDULE(static,1)
37
38
39

do kk=nzsm1,nze
do jj=nysm1,nye
do ii=nxsm1,nxe!---- Hy[HFH] ---40

hy(ii,jj,kk)=hy(ii ,jj,kk )&41-((ex(ii ,jj,kk+1)-ex(ii,jj,kk))*muy(ii,jj,kk) &42-(ez(ii+1,jj,kk )-ez(ii,jj,kk))*muy(ii,jj,kk))

43
44
45

end doend doend do!$OMP END DO!$OMP DO SCHEDULE(static,1)
46

do kk=nzsm1,nze
6

47
48

do jj=nysm1,nye
do ii=nxsm1,nxe!---- Hz[HHF] ---49hz(ii,jj,kk)=hz(ii ,jj ,kk)&

50-((ey(ii+1,jj ,kk)-ey(ii,jj,kk))*muz(ii,jj,kk) &51-(ex(ii ,jj+1,kk)-ex(ii,jj,kk))*muz(ii,jj,kk))

52
53
54

end doend doend do!$OMP END DO!$OMP END PARALLEL

7

FDTD3D 配列の定義
 TypeAとTypeBの配列は以下のように定義されている
配列マージ

Type

最内
○

A
B

アクセス
最外
○
-

連続
○
○

ストライド
○

TypeBallocate(fff(6,nxsm1:nxep1+1,nysm1:nyep1+1,nzsm1:nzep1+1))#define ex(i,j,k) fff(1,i,j,k)#define ey(i,j,k) fff(2,i,j,k)
ストライドアクセス#define ez(i,j,k) fff(3,i,j,k)(一部は連続アクセス)#define hx(i,j,k) fff(4,i,j,k)
配列マージ#define hy(i,j,k) fff(5,i,j,k)#define hz(i,j,k) fff(6,i,j,k)
allocate(eee(6,nxsm1:nxep1+1,nysm1:nyep1+1,nzsm1:nzep1+1))#define sgx(i,j,k) eee(1,i,j,k)#define sgy(i,j,k) eee(2,i,j,k)#define sgz(i,j,k) eee(3,i,j,k)#define epx(i,j,k) eee(4,i,j,k)#define epy(i,j,k) eee(5,i,j,k)#define epz(i,j,k) eee(6,i,j,k)
allocate(mmm(3,nxsm1:nxep1+1,nysm1:nyep1+1,nzsm1:nzep1+1))#define mux(i,j,k) mmm(1,i,j,k)#define muy(i,j,k) mmm(2,i,j,k)#define muz(i,j,k) mmm(3,i,j,k)

TypeA
allocate(fff(nxsm1:nxep1+17,nysm1:nyep1+1,nzsm1:nzep1+1,6))#define ex(i,j,k) fff(i,j,k,1)#define ey(i,j,k) fff(i,j,k,2)
連続アクセス#define ez(i,j,k) fff(i,j,k,3)
配列マージ#define hx(i,j,k) fff(i,j,k,4)#define hy(i,j,k) fff(i,j,k,5)#define hz(i,j,k) fff(i,j,k,6)
allocate(eee(nxsm1:nxep1+17,nysm1:nyep1+1,nzsm1:nzep1+1,6))#define sgx(i,j,k) eee(i,j,k,1)#define sgy(i,j,k) eee(i,j,k,2)#define sgz(i,j,k) eee(i,j,k,3)#define epx(i,j,k) eee(i,j,k,4)#define epy(i,j,k) eee(i,j,k,5)#define epz(i,j,k) eee(i,j,k,6)
allocate(mmm(nxsm1:nxep1+17,nysm1:nyep1+1,nzsm1:nzep1+1,3))#define mux(i,j,k) mmm(i,j,k,1)#define muy(i,j,k) mmm(i,j,k,2)#define muz(i,j,k) mmm(i,j,k,3)●配列のパディング
配列の1次元目に適宜パディングすることにより、16KB境
界からずらす。
●配列マージ
３つの配列を1つの配列にマージすることにより、ストリー
ム数が減るため、L1Dキャッシュスラッシングが回避され、さらなる高速化の可能性あり。

Copyright 2013 FUJITSU LIMITEDFDTD3D TypeA,TypeBの配列アクセス（L1$）
 Type-A

連続アクセスfff(1,1,1,1) fff(2,1,1,1) fff(3,1,1,1) fff(4,1,1,1) fff(5,1,1,1) fff(6,1,1,1) fff(7,1,1,1) fff(8,1,1,1) fff(9,1,1,1) fff(10,1,1,1) fff(11,1,1,1) fff(12,1,1,1) fff(13,1,1,1) fff(14,1,1,1) fff(15,1,1,1) fff(16,1,1,1)
ex(1,1,1)
missex(2,1,1)
hit

ex(3,1,1)
hit

ex(4,1,1)
hit

ex(5,1,1)
hit

ex(6,1,1)
hit

ex(7,1,1)
hit

ex(8,1,1)
hit

ex(9,1,1) ex(10,1,1) ex(11,1,1) ex(12,1,1) ex(13,1,1) ex(14,1,1) ex(15,1,1) ex(16,1,1)
hit
hit
hit
hit
hit
hit
hit
hit

 Type-B (配列( ii , jj , kk )の場合)

連続アクセスfff(1,1,1,1) fff(2,1,1,1) fff(3,1,1,1) fff(4,1,1,1) fff(5,1,1,1) fff(6,1,1,1) fff(1,2,1,1) fff(2,2,1,1) fff(3,2,1,1) fff(4,2,1,1) fff(5,2,1,1) fff(6,2,1,1) fff(1,3,1,1) fff(2,3,1,1) fff(3,3,1,1) fff(4,3,1,1)
ex(1,1,1) ey(1,1,1) ez(1,1,1) hx(1,1,1) hy(1,1,1) hz(1,1,1) ex(2,1,1) ey(2,1,1) ez(2,1,1) hx(2,1,1) hy(2,1,1) hz(2,1,1) ex(3,1,1) ey(3,1,1) ez(3,1,1) hx(3,1,1)
miss
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
hit
ループ内で使用する配列が以下の場合。
(○：使用する、×：使用しない)

ex
ey
ez
hx
hy

 Type-B (配列( ii , jj , kk-1 )の場合)
ストライドアクセスhz(ii,jj,kk-1)
×
×
×
○
○
×

fff(4,3,2,1) fff(5,3,2,1) fff(6,3,2,1) fff(1,4,2,1) fff(2,4,2,1) fff(3,4,2,1) fff(4,4,2,1) fff(5,4,2,1) fff(6,4,2,1) fff(1,5,2,1) fff(2,5,2,1) fff(3,5,2,1) fff(4,5,2,1) fff(5,5,2,1) fff(6,5,2,1) fff(1,6,2,1)hx(3,2,1) hy(3,2,1) hz(3,2,1) ex(4,2,1) ey(4,2,1) ez(4,2,1) hx(4,2,1) hy(4,2,1) hz(4,2,1) ex(5,2,1) ey(5,2,1) ez(5,2,1) hx(5,2,1) hy(5,2,1) hz(5,2,1) ex(6,2,1)
miss
hit
hit
hit
hit
hit
使わない
使わない
使わない
使わない
使わない
使わない
使わない
使わない
使わない
使わない

メリット

デメリット

最外次元をマージしたTypeA

・ロード・ストアのSIMD化ができる

・配列のパディングが必要

最内次元をマージしたTypeB・ストリーム数が減ることでキャッシュス
ラッシングのリスクが減る。(配列のパディングが不要)

・列の次元に+-があるときに配列のマージを行うと、一部ストライドアクセスになる。
・ロード・ストアのSIMD化ができない
Copyright 2013 FUJITSU LIMITEDFDTD3D ループ分割の再利用性
 電場のソースプログラム
ループ融合!---- Ex[HFF] ---do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1
ex(ii,jj,kk)=ex(ii,jj,kk)*sgx(ii,jj,kk)&+((hz(ii,jj,kk)-hz(ii,jj-1,kk ))*epx(ii,jj,kk)*dty &-(hy(ii,jj,kk)-hy(ii,jj ,kk-1))*epx(ii,jj,kk)*dtz) &+ajx(ii,jj,kk)*dt;!---- Ey[FHF] ---ey(ii,jj,kk)=ey(ii,jj,kk)*sgy(ii,jj,kk)&+((hx(ii,jj,kk)-hx(ii ,jj,kk-1))*epy(ii,jj,kk)*dtz &-(hz(ii,jj,kk)-hz(ii-1,jj,kk ))*epy(ii,jj,kk)*dtx) &+ajy(ii,jj,kk)*dt;!---- Ez[FFH] ---ez(ii,jj,kk)=ez(ii,jj,kk)*sgz(ii,jj,kk)&+((hy(ii,jj,kk)-hy(ii-1,jj ,kk))*epz(ii,jj,kk)*dtx &-(hx(ii,jj,kk)-hx(ii ,jj-1,kk))*epz(ii,jj,kk)*dty) &+ajz(ii,jj,kk)*dt;
end do
同一ループ内にあるend dohz(ii,jj,kk) hy(ii,jj,kk) hx(ii,jj,kk)
end doは、キャッシュ上にあるため再利用可能。

「ループ分割」はL2キャッシュの再利用性を低下さ
せる

ループ分割
!---- Ex[HFF] ---do kk=nzs,nzep1
do jj=nys,nyep1
do ii=nxs,nxep1
ex(ii,jj,kk)=ex(ii,jj,kk)*sgx(ii,jj,kk)&+((hz(ii,jj,kk)-hz(ii,jj-1,kk ))*epx(ii,jj,kk)*dty &ループ1-(hy(ii,jj,kk)-hy(ii,jj ,kk-1))*epx(ii,jj,kk)*dtz) &+ajx(ii,jj,kk)*dt;
end doend doend doループ2では、!---- Ey[FHF] ---ループ1にあるhz(ii,jj,kk) hx(ii,jj,kk)
do kk=nzs,nzep1
は再読み込みとなる。
do jj=nys,nyep1
do ii=nxs,nxep1
ey(ii,jj,kk)=ey(ii,jj,kk)*sgy(ii,jj,kk)&+((hx(ii,jj,kk)-hx(ii ,jj,kk-1))*epy(ii,jj,kk)*dtz &ループ2-(hz(ii,jj,kk)-hz(ii-1,jj,kk ))*epy(ii,jj,kk)*dtx) &+ajy(ii,jj,kk)*dt;
end doend doループ3では、end do
ループ1にあるhy(ii,jj,kk)、!---- Ez[FFH] ---ループ2にあるhx(ii,jj,kk)
do kk=nzs,nzep1
は再読み込みとなる。
do jj=nys,nyep1
do ii=nxs,nxep1
ez(ii,jj,kk)=ez(ii,jj,kk)*sgz(ii,jj,kk)&+((hy(ii,jj,kk)-hy(ii-1,jj ,kk))*epz(ii,jj,kk)*dtx &ループ3-(hx(ii,jj,kk)-hx(ii ,jj-1,kk))*epz(ii,jj,kk)*dty) &+ajz(ii,jj,kk)*dt;
end doend doend doCopyright 2013 FUJITSU LIMITED2.4 核融合プラズマ 5 次元格子コード GT5D の測定評価
日本原子力研究開発機構システム計算科学センター 井戸村 泰宏

2.4.1.

はじめに
GT5D コードは磁 場 閉 じ込 め型 の核 融 合 炉 における炉 心 プラズマの閉 じ込 め性 能 を決 定 する

乱 流 輸 送 現 象 の評 価 を目 的 として、日 本 原 子 力 研 究 開 発 機 構 で開 発 された第 一 原 理 プラズマ
乱 流 コードである。 核融合プラズマの第一原理モデルは 5 次元位相空間（3 次元空間×2 次元速度）における粒子分布の発展を記述する移流・拡散方程式で与えられる。GT5D コードはこの方程式を 5 次元格子上で離散化して CFD スキームを適用するため、3 次元流体モデルに比べて〜1002 倍程度大きい自由度の流体計算となる（スライド p2 参照）。現在のペタスケールマシンにおいてようやく既存装置規模の炉
心プラズマの数値実験が可能になったが、国際熱核融合実験炉 ITER のような次世代の大型装置の数値実験を行うには京コンピュータ、あるいは、将来のエクサスケールマシンが必要となる。このような大規模計算を実現する上で超並列マルチコアクラスタマシンの利用技術の高度化が必要不可欠となっている。本測定評価作業では、特に、今後の超並列マルチコアクラスタマシンにおいて重要になる、小さい
メモリバンド幅を有効利用する技術、および、10 万コア以上の超並列計算の並列化効率を向上する技術に焦点を当てて最適化技術の開発およびその有効性検証を行った。

2.4.2.

プログラム概 要
GT5D ではスライド p3 に示 すプラズマ粒 子 分 布 関 数 の移 流 ・拡 散 方 程 式 と乱 流 場 を決 めるポ

アソン方 程 式 をカップルさせてプラズマ乱 流 の非 線 形 発 展 を追 跡 する。移 流 ・拡 散 方 程 式 については移 流 項 G を取 り扱 う Gyrokinetic Solver に 4 次 精 度 無 散 逸 保 存 型 差 分 スキームを適 用し、粒 子 衝 突 項 C を取 り扱 う Collision Operator に 6 次 精 度 中 心 差 分 を適 用 する。一 方 、ポア
ソン方 程 式 を取 り扱 う Field Solver においてはトーラス方 向 にフーリエモード展 開 を適 用 し、トーラス断 面 上 で 2 次 元 有 限 要 素 近 似 を用 いる。スライド p14 に並 列 化 モデルを示 すが、GT5D では、
演 算 子 が持 っている物 理 的 対 称 性 （例 えば、移 流 項 G は v ⊥ をパラメータとする 4 次 元 演 算 子 となるのに対 し、粒 子 衝 突 項 C は R,  ,Z をパラメータとする 2 次 元 演 算 子 となる）に基 づいて各 ソル
バーの並 列 化 軸 を選 択 する。さらに、それを複 数 の MPI コミュニケータおよび OpenMP によって
構 成 する階 層 的 通 信 ネットワーク上 で実 装 することによって、全 ての通 信 処 理 を MPI コミュニケー
タの部 分 空 間 に閉 じ込 めて全 ノード間 の集 団 通 信 を回 避 する。これによってバイセクションバンド
幅 の有 効 活 用 を図 り、並 列 化 率 を向 上 する。移 流 ・拡 散 方 程 式 の時 間 積 分 には半 陰 解 法 を適用 し移 流 項 G に含 まれるスティフな線 形 移 流 項 を陰 的 に扱 う。この陰 的 ステップでは線 形 移 流 項の差 分 演 算 子 （~10 1 0 自 由 度 の非 対 称 行 列 ）が与 える連 立 一 次 方 程 式 を反 復 法 （共 役 残 差 法 ）によって解 く。このアルゴリズムをスライド p6 に示 すが、この反 復 法 ソルバーが GT5D において最 もコストが大 きいカーネルとなる。

2.4.3.

測定環境
本 測 定 評 価 作 業 では 2 種 類 の機 種 間 比 較 を実 施 した。一 つ目 の機 種 間 比 較 では、スライド p

4 にまとめるように、BX900（Nehalem-EP+InfinibandQDR8x）、Helios（SandyBridge-EP+Infinib
andQDR4x）、および、京 （SPARC64VIIIfx+Tofu）という 3 つのマルチコアクラスタ環 境 を使 用 した。Helios と京 はどちらも 8 コアのプロセッサを採 用 しているが、ネットワークについては FatTree ト
ポロジの InfinibandQDR、および、6DTorus トポロジ（ユーザービューは 3DTorus）の Tofu と大 き
く異 なる機 構 を採 用 している。このような共 通 点 と相 違 点 に着 目 して各 環 境 の性 能 を比 較 した。

もう一 方 の機 種 間 比 較 では参 考 資 料 p8 にまとめる FX1（SPARC64VII+InfinibandQDR4x）、FX
10（SPARC64IXfx+Tofu）、および、京 （SPARC64VIIIfx+Tofu）という世 代 の異 なる 3 つの SPAR
C プロセッサを使 用 した。

2.4.4.

測定結果
本 測 定 評 価 作 業 では、4.1 単 体 性 能 評 価 、4.2 通 信 性 能 評 価 、および、4.3 コード全 体 のスケ

ーラビリティ評 価 に取 り組 んだ。
2.4.4.1. 単 体 性 能 評 価
単 体 性 能 評 価 は GT5D の反 復 法 ソルバーカーネルを対 象 とし、性 能 推 定 モデルの適 用 、性能 評 価 、推 定 値 と実 測 値 の比 較 、および、機 種 間 比 較 を実 施 した。性 能 推 定 モデルの概 要 お
よびその適 用 例 をスライド p5 および p7-9 にそれぞれ示 す。このモデルは基 本 的 にいわゆるルー
フラインモデルに基 づいており、ハードウェアの B/F 比 （最 大 実 効 メモリバンド幅 /理 論 演 算 性 能 ）とアプリケーリョンの演 算 密 度 、あるいは、Byte/Flop の比 較 によって実 効 演 算 性 能 を与 えるものである。ここで、メモリアクセス Byte の評 価 においてはソースコードレベルでデータのオンキャッシュ
判 定 を行 うことによって、実 際 のメモリアクセス状 況 に近 い性 能 推 定 を行 う。オリジナル版 差 分 カーネルの評 価 をスライド p7 に示 すが、この例 では 4 次 元 差 分 において j~l 方 向 のデータはオンキ
ャッシュとなるのに対 し、i 方 向 はメモリアクセスとなる。この結 果 、Byte/Flop~1 となる。これに対 して、OpenMP のサイクリックループ分 割 による最 適 化 を適 用 した例 をスライド p8 に示 すが、この場
合 には i 方 向 のデータも隣 接 スレッドがロードしたデータの再 利 用 によってオンキャッシュとなる。
この結 果 、Byte/Flop~0.5 となり、演 算 密 度 が大 幅 に向 上 する。インテル系 の BX900 および Helios ではこのカーネルを採 用 している。スライド p9 はさらに差 分 演 算 を i,j 方 向 と k,l 方 向 に分 割 した京 における最 適 化 カーネルの例 を示 す。この例 では演 算 密 度 が Byte/Flop~0.85 まで低 下 するが、京 においてはデータプリフェッチの観 点 からループボディを調 整 することが必 要 であった。
スライド p10 は上 記 最 適 化 前 後 でのカーネル処 理 性 能 の測 定 結 果 を示 す。最 適 化 によって反 復 法 ソルバーの差 分 演 算 部 分 、ベクトル演 算 部 分 、どちらのメモリバンド幅 も STREAM ベンチ
マークが与 える最 大 実 効 メモリバンド幅 （コアあたり 5.76GB/s）に近 づき、演 算 性 能 も向 上 している。これに伴 い、ベクトル演 算 部 分 の実 効 演 算 性 能 は推 定 値 （スライド p6 参 照 ）にかなり近 づいている。しかしながら、差 分 演 算 部 分 の実 効 演 算 性 能 は依 然 として推 定 値 の 2/3 程 度 にとどまっている。この原 因 を特 定 するために、スライド p11 ではプロファイラ情 報 を詳 細 に調 べた。この結 果 、
演 算 待 ちや SIMD 化 率 の低 下 は見 られなかったが、SIMD 演 算 における積 和 SIMD 演 算 の比率 が全 体 の 1/3 程 度 に留 まっており、FLOPS 換 算 で 2/3 程 度 の性 能 となっていることがわかった。
積 和 SIMD の比 率 は実 効 演 算 性 能 に大 きく影 響 する要 因 であるが、カーネルのアルゴリズム、コ
ンパイラ最 適 化 等 に依 存 する要 素 であるためルーフラインモデルのような系 統 的 な数 値 化 が難 しい。このため、性 能 推 定 においてはそれぞれの問 題 に応 じて積 和 SIMD の比 率 を考 慮 した補 正が必 要 になる。
スライド p12 は GT5D カーネル処 理 性 能 の Intel 系 プロセッサと京 の機 種 間 比 較 を示 す。ベク
トル演 算 部 分 の処 理 性 能 はほぼメモリバンド幅 に比 例 して決 まっており、京 の処 理 性 能 が最 大 となる。一 方 、差 分 演 算 部 分 に関 しては Intel 系 のプロセッサ環 境 の処 理 性 能 が高 い。Intel 系 の環 境 では演 算 密 度 が最 も高 いスライド p8 の最 適 化 版 を使 用 していることがこの原 因 と考 えられる。
Intel 系 の環 境 においても差 分 演 算 部 分 において推 定 値 と実 測 値 の乖 離 が大 きい。

参 考 資 料 p4-7 はスライド p12 と同 じテストを 3 つの SPARC プロセッサで比 較 した結 果 を示 す。
このテストでは全 て京 と同 じ最 適 化 カーネルを使 用 したため、演 算 の最 適 化 に大 きな違 いが無 く、ベクトル演 算 部 分 （スライドで main と表 記 ）および差 分 演 算 部 分 （スライドで l4dx と表 記 ）の両 方において、処 理 性 能 は参 考 資 料 p8 に示 すメモリスループット（Stream Triad）の性 能 比 と良 く対
応 することがわかった。
2.4.4.2. 通 信 性 能 評 価
GT5D における MPI 通 信 の一 覧 をスライド p14 に示 す。ここで、Gyrokinetic Solver の 2 次 元
方 向 の袖 領 域 通 信 と Collision operator のデータ転 置 が主 要 なコストを占 めるため、これらの通信 を演 算 とオーバーラップして通 信 コストを削 減 する通 信 マスク手 法 を開 発 した。
袖 領 域 通 信 に関 しては、差 分 演 算 を袖 領 域 データを参 照 する部 分 としない部 分 に分 割 し、後者 を通 信 と同 時 処 理 することによって通 信 のオーバーヘッドを削 減 する。開 発 にあたり、まず、ス
ライド p15 に示 す非 同 期 通 信 （mpi_isend/irecv）と演 算 の同 時 処 理 の問 題 を調 査 したところ、従来 の多 くの MPI ライブラリ（富 士 通 、Intel、Bull）で採 用 している RendezVouz プロトコルでは、MPI 処 理 と演 算 処 理 の干 渉 によって、非 同 期 通 信 を開 始 するのに必 要 な制 御 通 信 がスタックし、通信 と演 算 の同 時 処 理 が機 能 しないことがわかった。この問 題 を回 避 するためにスライド p16 に示
す 2 つの通 信 マスク手 法 を開 発 した。演 算 中 に mpi_test を定 期 的 に呼 び出 す方 法 では、演 算
中 に一 時 的 に MPI 処 理 を復 帰 させて、RendezVouz プロトコルの制 御 通 信 を促 進 する。一 方 、O
penMP によって通 信 スレッドを実 装 する方 法 では、マスタースレッドを通 信 完 了 まで通 信 専 用 に割 り当 てることによって MPI 処 理 と演 算 処 理 の干 渉 を回 避 する。スライド p17 に示 す測 定 結 果 では、これらの手 法 によって通 信 のオーバーヘッドを大 幅 に削 減 できることを確 認 した。京 は 4 つの通 信 コントローラを搭 載 するため、mpi_sendrecv を mpi_isend/irecv に変 えるだけで通 信 コストが半 減 する。さらに、通 信 マスク手 法 を適 用 すると、mpi_test を呼 ばない場 合 には上 記 問 題 によって通 信 コストが mpi_wait のコストとして残 るのに対 し、mpi_test を呼 び出 すことによって通 信 と演
算 の同 時 処 理 が機 能 し、通 信 のオーバーヘッドが大 幅 に削 減 される。ここで、マスタースレッドで発 生 する mpi_test のコストは僅 かである。一 方 、通 信 スレッドを用 いる場 合 にも通 信 のオーバー
ヘッドは大 幅 に削 減 されるが、これはマスタースレッドで発 生 する通 信 コストを 8 コアで分 け合 うことに相 当 する。FatTree トポロジの Helios では袖 領 域 通 信 コストが京 に比 べてかなり大 きく、その分 、通 信 マスク手 法 のインパクトも大 きい。
通 信 スレッドを用 いる手 法 は非 同 期 通 信 だけでなく、同 期 通 信 や集 団 通 信 にも適 用 できる汎用 性 の高 い手 法 である。そこで、GT5D ではスライド p.18 に示 すようにデータ転 置 にこの手 法 を適用 した。スライド p13 に示 すように Gyrokinetic Solver と Collision Operator は異 なる並 列 化 軸を用 いるため、Collision Operator の処 理 前 後 でデータ転 置 、逆 転 置 が発 生 する。ここでは、この並 列 化 軸 と関 係 ない  方 向 に処 理 全 体 を分 割 し、さらに、データ依 存 性 のないインデックス間
でデータ転 置 、逆 転 置 、および、演 算 を組 み合 わせて通 信 スレッドを実 装 した。スライド p19 に示す測 定 結 果 では、この通 信 マスク手 法 の適 用 によって 2〜3 割 の処 理 コスト削 減 を確 認 した。
2.4.4.3. コード全 体 のスケーラビリティ評 価
スライド p20 に既 存 装 置 規 模 の中 規 模 パラメータを用 いて測 定 した GT5D コードのストロングス
ケーリングを示 す。まず、FatTree トポロジの Helios と BX900 では Torus トポロジの京 に比 べて通信 コストのスケーリングがかなり異 なる。しかしながら、どの環 境 においても通 信 マスク手 法 の適 用によって、通 信 コストが大 幅 に削 減 され、実 効 演 算 性 能 が 2〜3 割 増 大 する。

この傾 向 は、参 考 資 料 p2-3 に示 す 3 つの SPARC 環 境 の測 定 結 果 にも見 られ、最 適 化 前 のバージョンに比 べて、通 信 マスク手 法 の適 用 によって大 幅 な処 理 性 能 向 上 が実 現 している。ただし、8 コアの京 、16 コアの FX10 に比 べて 4 コアの FX1 では通 信 スレッドのオーバーヘッドが大 き
くなることから、性 能 向 上 は~7%程 度 に留 まっている。また、通 信 コストが削 減 された結 果 、参 考
資 料 p3 に示 す機 種 間 の性 能 比 が単 体 性 能 比 に近 い値 となっていることもわかった。
スライド p21 に ITER 規 模 の大 規 模 パラメータを用 いて測 定 した GT5D コードのストロングスケ
ーリングを示 す。この性 能 測 定 では通 信 マスク手 法 の適 用 によって通 信 コストをほぼ一 定 のレベ
ルに抑 制 し、その結 果 、約 20 万 コアまで良 好 なストロングスケーリングを確 認 した。このデータから
評 価 した並 列 化 率 は~99.9998%に達 し、スライド p20 に示 した BX900 上 の as is コードのストロ
ングスケーリングに比 べて一 桁 以 上 の並 列 化 率 向 上 を達 成 した。

2.4.5.

まとめ
今後の超並列マルチコアクラスタマシンで重要となる、小さいメモリバンド幅を有効利用する技術、および、超並列計算の並列化率を向上する技術の一例として、共有キャッシュ利用手法、および、通信
マスク手法を GT5D コードに適用し、その有効性をペタスケールのマルチコアクラスタマシンで検証した。特に、今回開発した通信マスク手法は、将来のエクサスケール計算に向けて重要となるストロング
スケーリングの向上に極めて有効であることが示された。

ĞħĕěƎƠŲƜƖŖRÝ|6O.·¾ù±pQSS·ƔƞſŴŨűƜŹŽmÍWG
! Ã6©ƎƜźƔ ŴƤƄGT5DŖ×! RªJ! ůƤƇƞŴƤƄŕUŉŤ5mÍÝ! ìƔŹűqŕUŉŤìmÍÝ! GT5DŴƤƄŖŹƃƠƢŲŹųƤƝƢŲ
1

Ð;ƎƜźƔŖ ŷƕƚƟƤŷƛƢ!

Gyrokinetic Torodial 5D Eulerian Code GT5D
[Idomura et al., Comput. Phys. Commun (2008); Nuclear Fusion (2009)]

v⊥"
v//
z
y
x

!
!
!



v⊥"

v//

jmÍƦÕËŶŪźƧŧRŉŤƎƜźƔ éêŧÝƣ ËŒí_Ŗ¯ŔŤƎƜźƔÅOŖžŪƅƕűŹŧ5¿úőÓ¨ÕËŶŪź1mŀŢ ŖWŹųƤƞ1mmŜő%Û
Ĵ1005=1010Î­_ÙŖ ÜÄ2Ð;ƎƜźƔÛĞħĕěŴƤƄŖÜÄƘƂƞ[Idomura et al., J. Comput. Phys. (2007); Comput. Phys. Commun. (2008); Nucl. Fusion (2009)]
!

ƎƜźƔ%\Ŗºƣrx{»` (R,f= G[f ] + C[f ]t⇥f
G[f ] = U1 [ ] ·⇥R, Z, vk , v? )U2 [ ]
2

C[f ] =v

· (D1 f ) +v v¢ñ1Š IŕšŤºƦGyrokinetic SolverƧ

: (D2 f )űƤƠƢÒÀ0ƦCollision OperatorƧ

4Æ_ xðPF[%ƦÖŹŰƤƖƧ+3ü²~ú½%b[ŕšŤāU¹Ñ&ŖîÁ{»`ŖüÛżƞƊƤ!
!

IŧŞŤƓŨżƢ{»` (⇥,

!

⇥f
⇥vk

⌅? · (P1 ⌅? ⇥) + P2 (⇥!
!

2û×É (⇥,FFT(')

)

, ⇤)

Z

ζ"

⇥⇥⇤) = [f ]aψ"ƦField SolverƧ

θ
ϕ"

R

R0
3

mÍRŕ¬ŇōƔƞſŴŨªJ

K(Riken)

Helios(IFERC)
BX900(JAEA)

CPU

BX900(Fujitsu,Rank84)

Helios(Bull,Rank12)

K(Fujitsu/Riken,Rank2)

Nehalem-EP(4core)

SandyBridge-EP(8core)

SPARC64VIIIfx(8core)

1.5PF(172.8GF/CPU)

11.3PF(128GF/CPU)

Performance 0.2PFlops(46.88GF/CPU)
Memory

51TB

282TB

1,410TB

B/F ratio

0.54

0.3

0.5

Cores

17,072

70,560

705,024

Network

InfinibandQDR8x(8GB/s) InfinibandQDR4x(4GB/s)

Tofu(5GB/s x 4)

Topology

Fat TreeFat Tree

6D Torus

Power

0.83MW

2.2MW

12.7MW
4

5mÍvRƘƂƞŖ×!

×żƤŹŴƤƄƟƐƞőŰƙƀŷƚ0ŧÌnŇōByte/Flopŧ½Ä
! MS0ƗƘƝƊƢƄ]B/FŒŖ§ŀŢS0ÍŧÄ$ƦrooflineƧ
Ex. B/F=0.36ƦSTREAMƧŕĿńŤByte/Flop=1ŖŴƤƄmÍ Ĵ 36%!

!

mÍvRŕĿńŤR
!
!
!
!

!

ŐŖ1WyÄ?Ł½@Ä?
ŐŖ1WyÄ?/ƗƘƝŨűŻŹ?ŁSIMD2ņťŐļŤƗƘƝŨűŻŹŖŝŧÌnŇL1/L2ŰƙƀŷƚŨűŻŹŗÌnŇŔļ
MS0ƗƘƝƊƢƄ]ŧSTREAMƐƢſƔƤűmÍŒRŉŤ

mÍvRß[Ŗ×C!
!
!
!

ŴƢƋŪƜó2ŕšŤ1WyÄŖŰƙŷƚŨűŻŹdŎŖ-;ŁMłļI;½@?ĿšŘSIMDŁŦťŔļI;
1WyÄdŎĹ?ƍŬƀſdŎŁ±«ŇŐļŤI;5ĞħĕěůƤƇƞ!

!

[%ÄOŖāU¹Ñ&AŁľŤîÁ{»`Ax=bŧ8iőÛŃ! 4Æ_4[%ÄOƦÖŹŰƤƖƧĴ17ŹƁƢŷƞ
10! 10 ŖāU¹Ñ&
Ĵ°Ñ&ÈƘƤƄőşÑ&ŒŇŐsŉŤŅŒŁEĀ
b[r0 = b – Ax0, p0 = r0
" [%Äõ%do j=0,1,…
Byte/Flop~1Ʀ0.85Ƨ
αj = (rj, Arj) / (Apj, Apj)→©ãƌƤű~36%Ʀ42%Ƨ
" ƐűƃƞÄõ%
xj+1 = xj +αj pj
Byte/Flop~7
rj+1 = rj –αj Apj→©ãƌƤű~5%βj = (rj+1, Arj+1)/(rj, Arj)
ĳstream benchmark B/F~0.36
pj+1 = rj+1 + βj Apj
cf.[4ĹHPCS2012; Williams,ACM2009]
Apj+1 = Arj+1 + βjApj
enddoĴ8iĻōţƪBŖÑ&Ɛűƃƞ½Ĺè²µƗƘƝ
6  
        !"# ! " #      






Byte/FlopŖÝĵŮƝŸƅƞ[%ůƤƇƞ!

ö&ŶŪźƮ132x68x44x44#  !&  !*  !)  !( 5;68?AC "" !(!( @8:&@='6?&9<*>%
" !)!) 
!A7?;(&.0+
" !*!* 
!A7?;$)&451
"  !&!& A,2/-3$)&451
(    (#    (&(# (# &(  ( ()    
)#   
 )&)# )# &)  ) )
*    
*#   
132 *&*# *# &*  * *&  &#  
 !! 
 &&&# &# &&  & & "" ( 
## (# 
 
!

( &(#  (# &(  (( !
)   
!!!!!!
)#    
" 

) &)#  )# &)  ) ) "
*   
""""""#

*#   
#

* &*#  *# &*  * * ######&  
&#   



& &&#  &# &&  & & 
!
"' 
 ( ) * &   (  )  *  & !

 "' $ 
 %
! ! ! ! ! !     "  

 "  
!"" " " " " " !"#  
#  
!"# # # # # # !"  
  

f(-1:nv+2,-1,nz+2,-1:ny+2,-1:nx+2)
1kb
71kb
3mb
140mb
!

ƭ[%ŖŮƢŰƙƀŷƚ'RƦ6mbƧlƮć8b x 5 = 40b Ĵon cachek: 1kb x 5 = 5kb Ĵon cache
j: 71kb x 5 = 355kb Ĵon cache
i: 3mb x 5 = 15mb Ĵmemory access" ƗƘƝŨűŻŹ
L/S + 6 x L = 8 = 64Byte" Ä
add 24 + sub 11 + mult 31 = 66FlopĴByte/Flop~17        !"# ! " #  JAD-JG.>I-BF1H,

   &( K@IE/-572

&( K@IE+0-<=8
#K3964:+0-<=8

(%!
&+

&/

&.

&- 


Byte/FlopŖÝĶŶŪűƝƀű%-£ůƤƇƞ!

ƭ[%ŖŮƢŰƙƀŷƚ'RƦ6mbƧ)**" 0312456.%"

lƮć8b x 5 = 40b Ĵon cachek: 1kb x 5 = 5kb Ĵon cache
j: 71kb x 5 = 355kb Ĵon cachei: Ĵon cache!
i{=[%Ŗi±1Ĺi±2ƂƤŽŗŶŪ
űƝƀű%-őŗþuŹƟƀƄŁƠ
ƤƄŇōŰƙƀŷƚƜŪƢŧ"(¬!
ŹƟƀƄúŪƢƊƜƢŹŗi±1Ĺi±2ŖƗƘƝŨűŻŹŖŮƤƊƤƏƀƄ
ŕšŏŐÎe²ŕ" ƗƘƝŨűŻŹ
L/S + 2 x L = 4 = 32Byte" Ä
add 24 + sub 11 + mult 31 = 66FlopĴByte/Flop~0.5'" &-&- @8:&@='6?&9<*>%
'# &.&. 
!A7?;(&.0+
'$ &/&/ 
!A7?;$)&451
'% &+&+ 132!-%!%$#"!%$#"  A,2/-3$)&451
!-(!%$#"!%$#" !%-+-(%!-( +-%%!-%-"!.%!%$#"!%$# "!.(!%$#"!%$# "!%.+.(%!.( +.%%!.%."!/%!%$#"!%$ #"!/(!%$#"!%$ #"!%/+/(%!/( +/%%!/%/"
132!+%!%$#"!% $#"!+(!%$#"!% $#"!%+++(%!+( ++%%!+%+"!-% !%$#"!%$#" !-( !%$#"!%$#" !%- +-( %!-( +-% %!-% - "!.% !%$#"!%$# "!.( !%$#"!%$# "!%. +.( %!.( +.% %!.% . "!/% !%$#"!%$ #"!/( !%$#"!%$ #"!%/ +/( %!/( +/% %!/% / "!+% !%$#"!% $#"!+( !%$#"!% $#"!%+ ++( %!+( ++% %!+% + "!%',  !%-!%.!%/!%+  !%- !%. !%/ !%+ !%$#"!%$#" *!%', )%
! ! !%$#" !!!%$#"!%$#" &' &' &' &'


A 

8

  Byte&

 

L2




 


!%$#"

$ #%/"#!
2 Byte64  
        !"# ! " #      




( %! &+  &/  &.  &- )**" 0312456.%"
'" &-&- '# &.&. @8:&@='6?&9<*>%
'$ &/&/ '% &+&+ 
!A7?;(&.0+
!/%!%$#"!%$ #"!A7?;$)&451
!/(!%$#"!%$ #"A,2/-3$)&451
!%/+/(%!/( +/%%!/%/"!+%!%$#"!% $#"!+(!%$#"!% $#"!%+++(%!+( ++%%!+%+"!/% !%$#"!%$ #"!/( !%$#"!%$ #"!%/ +/( %!/( +/% %!/% / "!+% !%$#"!% $#"!+( !%$#"!% $#"!%+ ++( %!+( ++% %!+% + "
132 
!%$#"  !%/!%+  !%/ !%+ &' &' &' &')**" 0312456.%"
'" &-&- '# &.&. '$ &/&/ '% &+&+ !-%!%$#"!%$#" !-(!%$#"!%$#" !%-+-(%!-( +-%%!-%-"!.%!%$#"!%$# "!.(!%$#"!%$# "!%.+.(%!.( +.%%!.%."!-% !%$#"!%$#" !-( !%$#"!%$#" !%- +-( %!-( +-% %!-% - "!.% !%$#"!%$# "!.( !%$#"!%$# "!%. +.( %!.( +.% %!.% . "!%',!%$#"  !%-!%.  !%- !%. !%$#"!%$#" *!%', )%
! ! !%$#" !!!%$#"!%$#" &' &' &' &'

Byte/FlopŖÝķƞƤƎ%-£ůƤƇƞ!

ƭ[%ŖŮƢŰƙƀŷƚ'RƦ6mbƧlƮć8b x 5 = 40b Ĵon cachek: 1kb x 5 = 5kb Ĵon cache
j: 71kb x 5 = 355kb Ĵon cachei: Ĵon cache!
ƞƤƎƒƂũŖâzŧ´²ŒŇ
ōƞƤƎ%cf.ƉƤƄūŬŨƎƝƍŬƀſŖûŹƃƝƤƖyŗ16!
4[%ŕĿļŐăG%-{=Ʀi,jƧŒŌťKƦk,lƧŕƞƤƎ%" ƗƘƝŨűŻŹ
2 x L/S + 3 x L = 7 = 56Byte" Äadd 22 + sub 11 + mult 33 = 66FlopĴByte/Flop~0.85

A 

9

Byte&
134

ŕĿńŤĞħĕěůƤƇƞŖó2
!

!

KŕĿńŤó2! ö&ŖƋƂũƢŲĴŰƙƀŷƚÂ;BôƦƐűƃƞÄƧ! OpenMPŶŪűƝƀűƞƤƎ%-ĴŰƙƀŷƚ(¬0§=Ʀ[%ÄƧ! Ƭxyzv[%ŧvz[%ƦŮƢŰƙƀŷƚƧƨxy[%ŕƞƤƎ%ĴŹƃƝƤƖy+ŕšŤÄó2ŖïƦ[%ÄƧƈƤƄ!SMP#©mÍĳƈƤƄĻōţö&ŶŪźƮ48x80x64x100=200MB
¼

#©

msec

[%Ä

64.60

K
ƐűƃƞÄ 66.11
ƦASISƧ
130.68

[%Ä

45.15

K
ƐűƃƞÄ 60.65
Ʀó2Ƨ
105.80
!
!

GF/core peak ratioGB/s/corepeak ratio
3.08

19.24%

3.67

45.91%

0.67

4.19%

4.78

59.80%

1.86

11.63%

4.23

52.91%

4.29

26.78%

4.49

51.57%

0.74

4.64%

5.20

63.85%

2.26

14.10%

4.90

58.55%

ƐűƃƞÄõ%ŗŚśvRìţŖmÍ
[%Äõ%ŗvRŖ2/3»_ŖmÍĴŴƢƋŪƜó2ŖAĄƯ10ŕĿńŤĞħĕěůƤƇƞ¥m%
ĦĠĢě?§Ĳ
ĦĠĢěÄ?§Ĳ ĦĠĢěƠƤƄ?§Ĳ ĦĠĢěŹƃŨ?§ĲĉďĦĠĢěUäĲ
ĉďĦĠĢěUäÄĲ ĉďĦĠĢěUäƠƤƄ ĉďĦĠĢěUäŹƃŨ
?yƧ
?yĊ
?yĊ
?yĊ
ĘėĎĒđĈęęĎĘĘĈęęĎĘėĈęęĎĘęĈđĐĐĎĐĐĈėĘĎęĒĈęęĎĒęĈęĘĎđęĈđĐĐĎĐĐĈđĐĐĎĐĐĈ1WyÄ ĦĠĢě1WyĲ
1WyĲ
ĦĠĢě1WyĲ
1WyĲ?yÄ?y
Ä?y
½@Ä?y ½@Ä?yĕĎĘĔĜċđĐēĎĘēĜċđĐėĎĕēĜċĐėĒĎĐĐĜċđĐĕĎĘĒĜċĐĔęĎĕĘĜċĐęėĎĒĐĜċĐĘđĎėĔĜċĐĘĘĎĖęĜċĐęđĎĐđĜċĐē

ĦĠĢě?§Ĳ
ĉď0Ê?yĊ[%ÄƐűƃƞÄ[%ÄƐűƃƞÄ



 





4 
 


2/3  

1 



FP 
 

FP   



FP 

FP 











!

FP   

!

 











ÄdŎŖaĂŗŌťŚœØŢťŊĹSIMD2§şŚś100%ĺ[%ÄŖ½@SIMDŖ§ŗ1/3»_ƦFLOPSwÄő2/3»_Ƨ
11¯ŔŤƔŷƢúőŖĞħĕěůƤƇƞ#©mÍŖè
¼

#©

msec

GF/corepeak ratio

FX1
4SMP
S0B/F~0.3
ó2Ķ
BX900
4SMP
S0B/F~0.37ó2Ķ
Helios
8SMP
S0B/F~0.21
ó2Ķ
K
8SMP
S0B/F~0.36
ó2ķ

[%Ä

146.682.64

26.38%

ƐűƃƞÄ

184.46

0.49

4.89%



331.171.44

14.42%[%Ä

101.293.82

32.60%

ƐűƃƞÄ134.53

0.67

5.72%



235.822.02

17.28%

[%Ä

28.14

6.88

31.83%

ƐűƃƞÄ

66.27

0.68

3.15%



94.40

2.53

11.71%

[%Ä

45.15

4.29

26.78%

ƐűƃƞÄ

60.65

0.74

4.64%



105.802.26

14.10%

FX1:SPARC64 VII (2.5Ghz, 10Gflops/core, L1-64kB/core, L2-6MB/CPU, B/F=1)
BX900:Nehalem-EP (2.93Ghz, 11.72Gflops/core, L3-8MB/CPU, B/F=0.546)
Helios:SandyBridge-EP (2.7Ghz, 21.6Gflops/core, L3-20MB/CPU, B/F=0.3)
K: SPARC64VIIIfx (2Ghz, 16Gflops/core, L1-32kB, L2-6MB/CPU, B/F=0.5)
12ĞħĕěŴƤƄŖýY²&2SÕ!

4×Ʀ2×1ƧMPI-2SMPŖ

Field solver(ψ,θ,ϕ) !

1DFFT+2DFEM

[Idomura,SC11,Seattle]

MPI$
layer1

µ1

µ1

µ2

µ2

µ3

µ3

µ4

µ4

MPI$
layer2

n1

n2

n1

n2

n1

n2

n1

n2

SMP$layer (ψ,θ)1 (ψ,θ)2 (ψ,θ)1 (ψ,θ)2 (ψ,θ)1 (ψ,θ)2 (ψ,θ)1 (ψ,θ)2 (ψ,θ)1 (ψ,θ)2 (ψ,θ)1 (ψ,θ)2 (ψ,θ)1 (ψ,θ)2 (ψ,θ)1 (ψ,θ)2

layer2$transpose$(R,Z,µ1) ↔$(n,µ1)

layer2$transpose$(R,Z,µ2) ↔$(n,µ2)

layer2$transpose$(R,Z,µ3) ↔$(n,µ3)

MPI$
layer1

µ1

µ1

µ2

µ 2

µ3

µ 3

µ4

µ 4

Gyrokinetic solver(R,ζ,Z,v//)!

MPI$
layer2

(R,Z)1

(R,Z)2

(R,Z)1

(R,Z)2

(R,Z)1

(R,Z)2

(R,Z)1

(R,Z)2

4Dº

SMP$layer(ζ,v)1 (ζ,v)2

(ζ,v)1 (ζ,v)2 (ζ,v)1 (ζ,v)2 (ζ,v)1 (ζ,v)2 (ζ,v)1 (ζ,v)2 (ζ,v)1 (ζ,v)2 (ζ,v)1 (ζ,v)2 (ζ,v)1 (ζ,v)2

MPI$layer1$transpose$[(R,Z)1,µ] ↔$(R,Z)1a~d
MPI$
layer1,2

Collision operator!
(v//,µ)!

2Dºƣrx
!
!
!

SMP$layer

(R,Z)1a
(ζ,v,
µ)1

(ζ,v,
µ ) 2

layer2$transpose$(R,Z,µ4) ↔$(n,µ4)

(R,Z)2a(ζ,v,µ ) 1(ζ,v,µ ) 2

(R,Z)1b
(ζ,v,
µ)1

(ζ,v,
µ)2

MPI$layer1$transpose$[(R,Z)2,µ] ↔$(R,Z)2a~d(R,Z)2b
(ζ,v,
µ)1

(ζ,v,
µ)2

(R,Z)1c
(ζ,v,
µ)1

(ζ,v,
µ)2

(R,Z)2c
(ζ,v,
µ)1

(ζ,v,
µ)2

(R,Z)1d
(ζ,v,
µ)1

(ζ,v,
µ)2

:żƞƊƤŖ¤©²U¹mŕlňŐ¯ŔŤ&2çŧt¬ýY²ìSÕŕšţƈƤƄúÿDìŧBô¨¦ŖM&_ŗ32×Ʀ32×24ƧMPI×8SMP=196,608&(R,Z)2d
(ζ,v,
µ)1

(ζ,v,
µ)2

13

ĢĤĠìƋŽƤƢ!

16,384ŴŨŖì÷
Problem Size:(NR,Nζ,NZ,Nv//,Nµ)=(240,64,240,128,32)
Parallelization: nMPI1 × nMPI2 × nSMP = nµ × (nR × nZ ) × nSMP = 32 × (8 × 8) × 8 = 16,384

Solverfield

gyrokinetic

collision

MPI
mpi_gather
mpi_allreduce
mpi_scatter
mpi_sendrecv
mpi_sendrecv
mpi_allreduce
mpi_sendrecv
mpi_sendrecv
mpi_alltoall
mpi_alltoall

CommunicatornR × nZnµnR × nZnR
nZnR × nZ
nR
nZ
nµ
nµ

Byte/node
14,400126,608
14,40087,52287,5228
3,932,160
3,932,160
1,959,936
1,959,936

Call/step222
22
8 × Niter
2 × Niter
2 × Niter22e 1: Summary of
R , Nζ , NZ , Nv! , Nµ ) = (240, 64, 240, 128, 32), (Nψ , Nθ , N
ĳ communication
ŖI;ŗnµ × nR data
× nZ =size
32 × for(8 × (N8)ŖƫƃƓƠŸŧ¬384, 64), and nR × nZ × nµ = 8 × 8 × 32 = 2048 processes. Ntier is the number of iterations in an iteraĴsendrecvŗþuì
rix solver for the implicit part of the ASIRK.

Ĵalltoallŗ1ƃƓƠŸĳ8byteŖallreduceŗ V¬ŨƞŵƝźƖ
of this traditional problem, and resolved it with two
the communication processes are 2D buffer data comm!
ŴŹƃŖMłļÔìƦsendrecvƧŒƂƤŽæËƦalltoallƧŖìƔŹűqŧù±
ent approaches. mpi_isend/irecv with the buffer size
cations in (R, Z). We decompose the calculation proce a threshold value is processed based on so called theezvous protocol, in which an exchange of control seces between two communication nodes is required to

14
in two approaches. In the first approach (Surface-cor
composition), we decompose the calculation into a (Rsurface part, which refers the buffer data, and the remìƔŹűqù±ŕĿńŤā<ìŖAĄ!

øƗƀŻƤŸƦ512KiBƧŖæêŗRendezVousƎƠƃŴƞŕšŏŐ#©
ņťŤōŞƩSƂƤŽŖæê,ŕMPIŖ)hìŁ1cik×
MPI_Isend)h

MPI_Irecv

Ä

cf. [ ƎƠŻŹ&ſƚƤƆƢŲſƚƤƃƝŨƞ]
ĸĸ[¶ZĹÃ1B ìH³WSĹŭűŶWG]ĸĸ[Sayantan,PPoPP2006]ĸĸĸÄ

MPI_WaitŕŏŐŠŏŒŖ)hì
ŧ$ŋŤ

)h
æê

MPI_Wait

MPI_IsendŀŢŖ)hìŁXļō~ŕŖ)hìŧ$ŋŔļ

MPI_WaitìŒÄŁ
ŮƤƊƤƜƀƎŇŔļ)h
15ìƔŹűqŖSÕƦÔìƧ!

!

ÔăGŧ7¡ŉŤÜÄŒ7¡ŇŔļÜÄŕ%! ÜÄăGŖjăGŒÔŧ7¡ŉŤJ®ăG! ÔìŧÑĽƦxyƧŒÑŦŔļƦzvƧ

ĵÔì

Ķ[%

ÔăGŧ7¡ŇŔļÄŒÔìŧŮƤƊƤƜƀƎ
B. mpi_testŧÜÄëŕ>Ř$ŉŅŒŕšŏŐ)hì#©ŧïC. ƔŹŽƤŹƟƀƄŁŐŖì#©ŧSÑŇĹÄ#©ŧdynamic%Ĵā<ìĹ<ìĹÿDìő(¬9Í

A. Blocking comm.

calc.

copy

B. Overlap with Testall

sendrecv

Isend/Irecv

C. Overlap with OpenMP

testall

waitall16ĞħĕěŖÔì#©ŖmÍÝ
Gyrokinetic solverŕĿńŤ[%ÄŖ#©ŴŹƃ!

ƂƤŽŶŪźƮć(NR,Nζ,NZ,Nv//,Nµ)=(240,64,240,96,32)
ăG%-ƮnR×nZ×nµ=8×8×32ƦÔìƮnR×nZ=8×8Ƨ
(a)K
copy"

comm."

800"

calc."

700"

700"

600"

600"

500"

500"

msec

msec

800"

400"

300"

200"

200"

100"

100"

comm."

calc."

B"(w/o"testall)"

B"

C"

0"
A"(sendrecv)" A"(isend/
irecv)"

ĳ

copy"

400"

300"

0"

(b)Helios

B"(w/o"testall)"B"

C"

A"(sendrecv)" A"(isend/
irecv)"

ŖmÍŗzŷŹƁƖŕšŤR
!
!
!
!

ħĪİıĩĬĬ£ĹģįĪĭĢĤ£œŎŢŖ{őşìŖŮƤƊƤƜƀƎŕo/ŮƤƊƤƜƀƎŕšŤ[%ÄřŖaĂŗûR²őÇđĕƥĹğĪĬīĮİőÇĔđƥŖmÍ=ĚĨęĐĐČĝĨđőş0mŧ¸Þ17ìƔŹűqŖSÕƦƂƤŽæËƧ!

#©Ŗ×
Step1:transpose f from (R,Z,µ)-decomposition to (R,Z)-decomposition
Step2:calculations for collision operator in (v//,µ)Step3:transpose f from (R,Z)-decomposition to (R,Z,µ)-decompositionĴStep1~3ŧζ%-ŇĹ<ÿDìŧìŹƟƀƄőSÑ
Originalcalc.

ζ-decomposition

alltoall for transpose

Overlap with OpenMP

alltoall for inverse-transpose18ĞħĕěŖƂƤŽæË#©ŖmÍÝCollision operatorŖ#©ŴŹƃ!

ƂƤŽŶŪźƮć(NR,Nζ,NZ,Nv//,Nµ)=(240,64,240,96,32)
ăG%-ƮnR×nZ×nµ=8×8×32→nR×nZ×nµ=64×32×1(a)K(b)Helios

800"

comm."

calc."

600"

600"

500"

500"

400"
300"

calc."

400"
300"

200"

200"

100"

100"

0"

0"
Original"

ĳ

comm."

700"
msec

msec

700"

800"

Overlap"

Original"

Overlap"ŖmÍŗzŷŹƁƖŕšŤR
!
!
!
!

ēĒƎƠŻŹúŖĩĬĬıĮĩĬĬŧìŹƟƀƄŧ¬ļŐŮƤƊƤƜƀƎŮƤƊƤƜƀƎŕšŤÄřŖaĂŁMłļĴŰƙƀŷƚ^ƯőÇđęƥĹğĪĬīĮİőÇēĒƥŖmÍ=ĚĨęĐĐČĝĨđőş0mŧ¸Þ19ĞħĕěŴƤƄŖŹƃƠƢŲŹųƤƝƢŲƦġħčĖĐÙƧ
JT-60UÙƮ(NR,Nζ,NZ,Nv//,Nµ)=(240,64,240,128,32)~1.5×1010!

ìŴŹƃ§(%)

S0mÍ(Tflops)
50"

K*asis"Helios*asis"

K*tune"Helios*tune"

BX900*asis"

40"
30"
20"
10"

50"
45"
Communica)on*Cost*(%)

Sustained*Performance*(TF)

60"

40"

K)asis"Helios)asis"K)tune"Helios)tune"

BX900)asis"

35"
30"
25"
20"
15"
10"
5"
0"

0"
0"

0"

5000" 10000" 15000" 20000" 25000" 30000" 35000"
cores

K
25TF(9.5%)Ĵ30TF(11.3%)
Helios 23TF(6.4%)Ĵ29TF(8.3%)
BX900 19TF(9.8%)
!
!
!

ĳ

5000" 10000" 15000" 20000" 25000" 30000" 35000"
cores

ŖmÍŗzŷŹƁƖŕšŤR

Torus(K)ŒFatTree(BX900,Helios)ő¯ŔŤìŴŹƃŖŹųƤƝƢŲ
ìƔŹűqŕšŏŐì#©mÍŖąå²=ŧS¨ì#©Ŗ+ŕšŏŐS0mÍŧ2030%=
20ĞħĕěŴƤƄŖŹƃƠƢŲŹųƤƝƢŲƦĠħĜĥÙƧ!

ITERÙƮ(NR,Nζ,NZ,Nv//,Nµ)=(768,64,768,128,32) ~ 1.5×1011
1ŹƁƀƎĻōţ#©~úS0mÍ(Tflops)
100000%%90000%%

300"

1207%%

comm.%

80000%%
250"

calc.%

70000%%

200"

msec/step

Sustained*Performance*(TF)

350"

150"
100"

60000%%
50000%%
40000%%

965%%
84534%%

30000%%

50"

20000%%

0"10000%%
0"50000"

100000"cores

150000"200000"!

942%%
23632%%

13040%%

0%%24576%

ĳ!

911%%
43791%%

49152%

98034%

196068%ŖmÍŗzŷŹƁƖŕšŤR

S0mÍ~10%»_ő~20ŴŨŜőÏNŔŹƃƠƢŲŹųƤƝƢŲ
Ĵ307TFlops@196,608coresg šţĆļ&2§ƦŨƖžƤƞ*Ƨ~99.9998%ŧòo
c.f.BX900ŕĿńŤASISŴƤƄŖ&2§~99.996%
21

ŜŒŞ
!

!

!

!

5mÍvRq! ŰƙƀŷƚŖ0ŧÌnŇōByte/FlopÝŕšŤƞƤƍƜŪƢƘƂƞ
! ŶŪűƝƀűƞƤƎ%-ŕšŤŹƟƀƄúŰƙƀŷƚ"(¬ŧà}! ÄT_ŖĆļůƤƇƞőŗß[ŁMłŃŔŤI;ŁĻŤ
ŕĿńŤìƔŹűq! Testall£ĹìŹƟƀƄ£ŖìƔŹűqŧSÕ! ìŹƟƀƄ£ŗ¬mŁĆŃ<ìĹÿDìŕşó¬9Í! ìƔŹűqŖó¬ŕšŏŐ&2§ŧąå²ŕ=ŒHeliosŖmÍè! [%ÄƦƐűƃƞÄƧŖS0mÍŗHeliosƦ
ƧŖ{ŁĆļ
! TofuƇƀƃơƤűŒInfinibandő¯ŔŤìŴŹƃŖŹųƤƝƢŲ
! ŴƤƄŒŇŐŗ
Ŗ{ŁĆļS0mÍĹ&2§
ŕĿńŤ fŖáĄ! ìƔŹűqŖŹƑűƃƞ
ŴƤƄƦL&2FFTƧřŖó¬! MÙ&IOƦPOSIXĹMPIIOĹHDF5ƧĹ9Ú2ƦPBVRĹOpenGLƧ
22

サイエンティフィック・システム研究会
マルチコアクラスタ性能WG資料

GT5DプログラムとGT5Dカーネルプログラムの評価結果（ご報告）
富士通株式会社
次世代ＴＣ開発本部 ＰＡプロジェクト
内藤 俊也
参考資料p1

Copyright 2013 FUJITSU LIMITED

GT5Dプログラム測定結果
 FX1、京、FX10で、実行時間を測定 (評価区間)しました。

 asis版とtune版(井戸村様提供)の２パターンを測定しました。
■FX1、京、FX10で、演算時間を測定 (全ての測定で96ノードを使用）
Type Thread

asis

tune

FX1
演算時間

1th
4th

Thread

演算時間

スケール

1th
831.53

1th
4th

スケール

■マシンの性能比

京

8th

8th

演算時間

スケール

1th

2100.351.00

318.9216th

195.4410.75

1th 1686.71

1.00

266.70

16th

11.17

1th
778.02ThreadFX10

150.94

Type

asis

tune

FX1

京

FX10

2.61

4.25

2.92

5.15

1.00
1.00
1.00
1.00

 高コストループのPA情報(FX10)
スレッド0のPA情報

Loop 1Loop 2Loop 3Loop 4Loop 5Loop 6

メモリスループット(GB/sec)
3.20
4.14
4.14
4.16
4.16
2.95

Loop2～5は、16スレッドで、約64GB/sとなっており、
メモリスループット
ネックとなっている。
参考資料p2

Copyright 2013 FUJITSU LIMITEDまとめ（GT5Dプログラム）
 GT5Dプログラムは、メモリスループットネックのプログラムとなっている。
 そのため、各マシンの性能比は、メモリスループットの実効性能比とほぼ同等であった。
FX1
FX10
京
4
8
16
マシン
演算時間
演算時間 マシン
演算時間 マシン
ThreadThreadThread
(sec)
(sec)
(sec)
性能比
性能比
性能比
asis
831.531.00 asis318.922.61 asis195.444.25
tune
778.021.00 tune
266.702.92 tune
150.94
5.15

メモリスループット
ピーク性能比

マシン名
1チップ性能1ノード性能

FX1
1.00
1.00

京
3.37
3.37

FX10
4.67
4.67

参考資料p3Copyright 2013 FUJITSU LIMITED

GT5Dカーネルプログラム測定値・プロファイル情報(FX10)

 測定ソースは、2012-04-19版（最新の最適化版）を利用
 FX1、京、FX10で、実行時間を測定 とマシン性能比
4
Thread
main
l4dx

FX1
8
実行時間
マシン
Thread(msec)
性能比
179.921.00 main
141.761.00 l4dx

 プロファイル情報(FX10)

参考資料p4

京
16
実行時間
マシン
Thread(msec)
性能比
60.97
2.95 main
45.57
3.11 l4dx

FX10
実行時間
マシン
(msec)
性能比
40.82
4.41
30.81
4.60

main = ★１＋★２
l4dx = ★３

Copyright 2013 FUJITSU LIMITED

高コストループ 高コストループのソース

参考資料p5

4

Copyright 2013 FUJITSU LIMITED

PA情報 1プロセス16スレッド(FX10)
 キャッシュの情報とPAグラフ(スレッド0から抜粋)
Performance

4.12
3.11

浮動小数点演算ピーク比
3.73%
21.28%

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

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

VEC1+VEC2 スレッド0
l4dx_s スレッド0

0.02%
0.01%

4.37%
3.14%

VEC1+VEC2 スレッド0
l4dx_s スレッド0

L2 ミス率(/ロード・ストア数)
4.53%
1.41%

実行時間 (sec)
VEC1+VEC2 スレッド0
l4dx_s スレッド0

MFLOPS
551
3146

MIPS

浮動小数点演算数
467
2299

2.27E+09
9.80E+09

16スレッドで、約64GB/sとなっており、
メモリスループットネックとなっている。

Cache

L2 ミス数
8.43E+07
7.35E+07

ロード・ストア数
1.86E+09
5.21E+09
L2 ミス dm 率(/L2 ミス数)
6.96%
5.23%

L1D ミス数
8.15E+07
1.64E+08

L1D ミス dm率(/L1D ミス数)
1.96%
16.26%

L2 ミス pf 率
メモリスループット(/L2 ミス数)(GB/sec)
93.04%
3.87
94.77%
4.03

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

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

98.04%
70.23%

0.00%
13.50%

L2 スループット
μ DTLB ミス率
mDTLB ミス率
(GB/sec)(/ロード・ストア数) (/ロード・ストア数)
2.53
0.00173%0.00002%6.74
0.00055%
0.00001%

main
参考資料p6

Copyright 2013 FUJITSU LIMITEDまとめ（GT5Dカーネルプログラム）
 前回の会合で報告したGT5Dと同様に、今回のGT5Dのカーネル
ソースもメモリスループットネックとなっていた。
そのため、各マシンの性能比は、メモリスループットの実効性能比と同等であった。

メモリスループット
ピーク性能比

マシン名
1チップ性能1ノード性能

京
3.37
3.37

FX1
1.00
1.00

FX10
4.67
4.67

参考資料p7

Copyright 2013 FUJITSU LIMITED

添付資料
マシン諸元
マシン名
CPU数
メモリ容量
名称
周波数
core数

FX1
京
1CPU
1CPU
ノード
32GB
16GB
SPARC64™VIISPARC64™VIIIfx
2.5GHz2.0GHz4core
8core
L1命令キャッシュ
L1命令キャッシュ
CPU
64KB コア毎
32KB コア毎
L1データキャッシュ L1データキャッシュキャッシュ容量64KB コア毎
32KB コア毎
L2キャッシュL2キャッシュ
6MB コア共通
6MB コア共通
倍精度
1コア性能
10GFLOPS
16GFLOPS
演算性能
1チップ性能40GFLOPS128GFLOPS(理論性能)
1ノード性能40GFLOPS128GFLOPS
1チップ性能13.7GB/s
46.2GB/s
メモリスループット(実効性能(*))
1ノード性能13.7GB/s
46.2GB/s

FX10
1CPU
32GB
SPARC64™  IXfx
1.848GHz
16core
L1命令キャッシュ
32KB コア毎
L1データキャッシュ
32KB コア毎
L2キャッシュ
12MB コア共通
14.78GFLOPS
236.54GFLOPS
236.54GFLOPS
64.0GB/s
64.0GB/s*:STREAM benchmark のTriad性能(目安：FX1との倍精度演算性能ピーク性能比)

FX1比 倍精度
演算性能
ピーク性能比メモリスループット
ピーク性能比参考資料p8

マシン名
1コア性能
1チップ性能1ノード性能1チップ性能1ノード性能

FX1
1.00
1.00
1.00
1.00
1.00

京
1.95
3.17
3.17
3.37
3.37

FX10
1.47
5.87
5.87
4.67
4.67
Copyright 2013 FUJITSU LIMITED2.5 圧縮性流体解析プログラム UPACS の京での性能評価
宇宙航空研究開発機構 宇宙科学研究所
高木 亮治

2.5.1

はじめに
UPACS は航 空 宇 宙 分 野 の計 算 流 体 力 学 （CFD）のための統 合 的 ソフトウェアを目 指 し JAX

A で研 究 開 発 された三 次 元 圧 縮 性 流 体 解 析 プログラムである。ここでは、FX1 並 びに京 での性
能 評 価 ならびにチューニングを実 施 したのでその結 果 について紹 介 する。

2.5.2

プログラム概 要
UPACS では複 雑 形 状 への適 用 性 と解 析 精 度 のトレードオフにより複 合 構 造 格 子 法 を採 用 している。並 列 化 には MPI を用 いており、複 合 格 子 （マルチブロック格 子 、重 合 格 子 ）を並 列 計 算における領 域 分 割 にマッピングを行 っている。その際 に 1 プロセスに複 数 のブロックを割 り当 てることで柔 軟 な並 列 計 算 （並 列 度 の変 更 が容 易 ）が可 能 となっている（図 1 を参 照 ）。

図 1：ブロックのプロセスへの割 り付 けプログラムは図 2 で示 すようにシングルブロックの計 算 部 、複 合 格 子 処 理 /並 列 処 理 部 、全 体
制 御 部 の三 つの階 層 構 造 を有 している。また Fortran90/95 のモジュール機 能 を積 極 的 に利 用したカプセル化 を行 うことで、各 モジュールの独 立 性 を高 め、拡 張 性 を担 保 している。そのために構 造 体 、動 的 配 列 （pointer, allocatable）を利 用 しており、最 適 化 での課 題 となっている。

図 2：階 層 構 造

12.5.3

測定環境
FX1（JAXA の JSS）、京 を利 用 して性 能 評 価 を行 った。FX1 および京 の諸 言 を表 1 に示 す。
表 1：測 定 環 境使 用 システム

JSS-M システム（通 常 運 用 時 間 で測 定 ）Fujitsu FX1（計 1 ノード使 用 ）機種構成

CPU：SPARC64Ⅶ 2.5GHz 1CPU 構 成 (4core/1CPU)
Memory：32GB

OS

Open Solaris

言語環境
使 用 システム
機種構成
OS

Parallelnavi Language Package V3.2
次 世 代 スパコン「京 」
CPU：SPARC64Ⅷfx 2.0GHz 1CPU 構 成 (8core/1CPu)
Memory：32GB
Linux ベース（ハードウェア機 構 に合 わせて拡 張 ）言語環境

Fujitsu Fortran Compiler Version 1.2.0

プログラムの測 定 条 件 等 を表 2 に示 す。なお、本 性 能 評 価 で用 いたプログラムはターボ機 械 な
ど回 転 機 械 の流 体 解 析 を行 う UPACS_turbo を用 いた。
表 2：プログラムの概 要プログラム名計 算 データ

UPACS_turbo
5 種 類 の計 算 データ(Case01～Case05)を使 用 。
いずれも１ブロック格 子 で、格 子 サイズ(格 子 点 数 )は以 下 の通 り。

ケース名

格 子 サイズ（格 子 点 数 ）Case0160x60x60 （216,000）

Case0230x60x120 （216,000）

Case0350x50x50 （125,000）

Case0440x40x120 （192,000）

Case0570x70x70 （343,000）

並列化

プロセス並 列 ：なし、スレッド並 列 ：VISIMPACT、OpenMP[JSS 向 け標 準 オプション(f90jx)] -Kfast,ocl -NRtrap -Ktl_trt -Kimpact Kmfunc=2 -Kpreex,prefetch_model=FX1

翻 訳 オプション[JSS 向 けユーザ追 加 オプション] -Uomp -Kparallel,reduction-Am[「京 」向 けユーザ追 加 オプション(frtpx)] -Kfast,visimpact,ocl -x30 -Karr
ay_private -Knoalias=s -Kcalleralloc=2 -Kauto -Kthreadsafe -KNOFL
TLD -DGETTOD -Kopenmp -Ntl_trt -Nrt_tune –Cpp
①タイマー計 測 情 報 ：gettod 関 数 を使 用 し、各 計 算 区 間 の経 過 時 間 を計 測

採取情報

②プロファイラ情 報 ：プログラム全 体 を対 象 範 囲 として各 種 性 能 情 報 を計 測
③PA 情 報 ： 各 計 算 区 間 を対 象 範 囲 として、PA 情 報 を計 測
22.5.4

測定結果
オリジナルプログラムの測 定 結 果 を表 3 に示 す。京 は FX1 に比 べて平 均 で 1.5 倍 高 速 な結 果となった。PA ツールを用 いて詳 細 な解 析 を行 ったところ、京 では FX1 に比 べてスレッド非 並 列 ルーチンのコストが大 きく、マスタスレッド以 外 はバリア同 期 待 ちの時 間 が長 くなっていることが判 明した。これは京 でのスレッド化 が FX1 より後 退 していることが原 因 であった。そのため、京 に向 けた
チューニングとして 1)スレッド並 列 化 の促 進 、2) L1 キャッシュ競 合 の回 避 （初 期 配 列 ）、3) アリ
ーナ開 放 処 理 の抑 止 、4) L1 キャッシュ競 合 の回 避 （作 業 配 列 ）、5) ループの SIMD 化 を行 った。
表 3：オリジナルプログラムの測 定 結 果
JSS（FX1）
プログラム全体時間[秒]計算 STEP 時間[秒]（time コマンド計測)(gettod 関数計測)

Case01757.15751.30

Case02207.88204.57

Case03119.84117.03

Case04184.73180.22

Case05326.26321.79

計算データ

次世代スパコン「京」Case01

320.23314.21

Case02182.09178.54

Case03

90.83

88.45

Case04136.51133.34

Case05239.71

234.77

1) スレッド並 列 化 の促 進 ：バリア同 期 待 ち時 間 を短 縮 するためには、スレッド並 列 化 を促 進 し、非 並 列 コストを削 減 するのが効 果 的 である。FX1 と京 のコスト分 布 を比 較 すると、FX1 では自 動 並 列 化 されるが、京 では
非 並 列 になる Do ループがいくつか存 在 するため、それらについては最 適 化 制 御 行 または OpenMP 指 示 行 を挿 入 することにより、スレッド並 列 化 を促 進 した。その結 果 性 能 が向 上 することがわかった。
2) L1 キャッシュ競 合 の回 避 （初 期 配 列 ）：格 子 点 数 が最 も多 い Case05 よりも Case01 が遅 くなっている。L2 キャッシュミス率 には大 きな
差 が無 く、L1 キャッシュミス率 が Case01、Case02 で他 より大 きくなっていることから、Case01、Cas
e02 では L1 キャッシュ競 合 による性 能 低 下 が発 生 していると考 えられる。領 域 確 保 時 のサイズを
確 認 したところ、Case01、Case02 では領 域 確 保 のサイズに 2 のべき乗 を含 むため、L1 キャッシュのインデックス値 に競 合 が発 生 していることがわかった。そのため手 動 でパディングを実 施 した。その結 果 性 能 が向 上 することがわかった。
3) アリーナ開 放 処 理 の抑 止 ：3

計 算 step 中 の配 列 の allocate 処 理 に時 間 がかかっていることが判 明 した。つまりアリーナ開
放 処 理 を頻 繁 に繰 り返 すことで性 能 が低 下 しており、アリーナの開 放 を抑 止 するように環 境 変 数を設 定 することで性 能 が向 上 することがわかった。
（参 考 ）京 では、プログラム実 行 時 のメモリ獲 得 /開 放 要 求 に対 して、処 理 性 能 を上 げるため、
あらかじめ確 保 したメモリ領 域 （メモリプール）を使 用 する。このメモリプールおよび管 理 領 域 を合わせたものをアリーナと呼 んでいる。
4) L1 キャッシュ競 合 の回 避 （作 業 配 列 ）：2）で配 列 サイズを調 整 したのは、初 期 設 定 時 に確 保 される配 列 であったが、実 行 中 に作 業
配 列 として領 域 確 保 ・解 放 を繰 り返 す配 列 でも L1 キャッシュが競 合 する場 合 があるため、2）と同様 の回 避 処 置 を適 用 した結 果 性 能 が向 上 することがわかった。なお、オフセット値 の設 定 は 2）と同 じとした。
5) ループの SIMD 化 ：
コスト上 位 ルーチンのうち、SIMD 命 令 率 が低 いルーチンの SIMD 化 阻 害 要 因 は、①DO ルー
プ中 に IF 文 の条 件 分 岐 が存 在 する、②DO ループ中 にライブラリの呼 出 しが存 在 する、である。
このうち、①に関 しては条 件 分 岐 を固 定 することで当 該 ループの SIMD 化 を促 進 し、性 能 が向 上することがわかった。但 し、一 部 のループでは SIMD 化 を促 進 しても性 能 向 上 が見 られなかった。
これは該 当 ループがメモリアクセスネックになっていることが原 因 であった。
以 上 の項 目 1)から 5)を適 用 した結 果 、表 4 に示 しように全 Case とも性 能 向 上 が見 られた。
特 に Case01 は、計 算 STEP 時 間 で 314.21 秒 から 72.78 秒 と、約 4.3 倍 の改 善 効 果 が得 られた。PA 情 報 より、チューニングを行 った結 果 バリア同 期 待 ちおよび浮 動 小 数 点 キャッシュアクセス
待 ち時 間 が短 縮 されたことがわかった。
表 4：チューニング結 果
計 算 STEP 時 間 [秒 ] (gettod 関 数 計 測 )
計 算 データオリジナル＋項 目 １＋項 目 ２＋項 目 ３＋項 目 ４＋項 目 ５

Case01

314.21210.41

99.86

84.66

79.90

72.78

Case02178.54112.92

97.44

81.46

81.99

76.09

Case03

88.45

55.30

55.72

47.91

48.96

44.85

Case04133.34

80.39

80.78

66.12

68.29

62.29

Case05234.77144.74144.91

120.19119.33110.16

2.5.5

まとめ
UPACS を対 象 として FX1 と京 での性 能 評 価 ならびにチューニングを実 施 した。FX1 と京 ではコンパイラの自 動 スレッド並 列 化 能 力 に差 があったため、スレッド並 列 化 を促 進 するためのチューニ
ングを実 施 した。またメモリアクセスネックになっている部 分 に関 しては SIMD 化 を促 進 しても性 能
向 上 が見 られないので、チューニングの際 は注 意 が必 要 である。
4

圧縮性流体解析プログラム
UPACSの性能評価
宇宙航空研究開発機構
宇宙科学研究所
高木亮治

1

UPACS
Unified Platform for Aerospace Computational Simulation
 航空宇宙分野の計算流体力学（CFD）のための統合的ソフトウ
ェアを目指しJAXAで研究開発


少数の研究者の協力によって、複雑化するCFDコード開発における困難を克服する試み 複雑形状、並列計算、…



ユーザー会を通じて公開


UPACS v1.0の公開 (2000. 10. 2)
 パッケージ化したソースプログラムとサンプルデータをリリース
 ユーザー会規約の範囲内（国内の学術目的）で自由に無償で利用可能



ユーザー登録数 (2010年4月22日現在)
 総数124名（JAXA

51名、教育 40名、企業25名、国立機関8名）

現在はUPACS v2.0を公開

成果
共同開発を可能とする基盤コード、比較基準となるコードの提供
 産官学連携を含むコミュニティ活動に貢献

2マルチブロック構造格子法と並列計算


複雑形状への適用性と解析精度のトレードオフ
マルチブロック構造格子法・重合格子法を優先
 構造格子ブロックの非構造性を持った接続 接続/重合情報の作成 createConnect3d, createOversetIndex




領域分割
マルチブロック/重合格子を領域分割にマッピング
 1プロセスに複数のブロックを割り当て
 MPIによる並列化


3

基本構造と拡張性プログラムの階層化
概念的に三つの階層が必要
 「マルチブロック、データ通信」と「ソルバー」の分離


モジュール化、カプセル化
Fortran90のモジュール機能を積極的に活用したカプセル化
 モジュール毎の独立性を高めることで分担作業を容易に 機能追加などの拡張性を担保

4

マルチブロック構造格子

ブロック内は構造格子、ブロック間接続は非構造的

ブロックの大きさ、アスペク
ト比はまちまち

格子作成の都合で決まる。

階層構造をそのままデータ

3次元空間を離散化したブロック

構造に反映


非構造格子だと階層構造は
必要なし。



アドレス計算が多くなる。
各格子点（セル）に物理量：5変数以上

作業環境と実行条件
使用システム
機種構成
ＯＳ
言語環境
使用システム
機種構成
ＯＳ
言語環境
プログラム名
計算データ
ケース名
Case01
Case02
Case03
Case04
Case05
計算条件
並列化

JSS-Mシステム（通常運用時間で測定）
Fujitsu FX1（計1ノード使用）
CPU：SPARC64Ⅶ 2.5GHz 1CPU構成(4core/1CPU)
Memory：32GB
Open Solaris
Parallelnavi Language Package V3.2
次世代スパコン「京」CPU：SPARC64Ⅷfx 2.0GHz 1CPU構成(8core/1CPu)
Memory：32GB
Linuxベース（ハードウェア機構に合わせて拡張）
Fujitsu Fortran Compiler Version 1.2.0
UPACS_turbo
5種類の計算データ(Case01～Case05)を使用。
いずれも１ブロック格子で、格子サイズ(格子点数)は以下の通り。
格子サイズ（格子点数）
60x60x60 （216,000）
30x60x120 （216,000）
50x50x50 （125,000）
40x40x120 （192,000）
70x70x70 （343,000）
計算条件ファイルinput.txtはCase01～Case05共通。（計算step回転数：itrctrl_limit_number=100）
プロセス並列：なし、スレッド並列：VISIMPACT,OpenMP[JSS向け標準オプション(f90jx)] -Kfast,ocl -NRtrap -Ktl_trt -Kimpact -Kmfunc=2 -Kpreex,prefetch_model=FX1[JSS向けユーザ追加オプション] -Uomp -Kparallel,reduction -Am

翻訳オプション

採取情報[「京」向けユーザ追加オプション(frtpx)] -Kfast,visimpact,ocl -x30 -Karray_private -Knoalias=s -Kcalleralloc=2 Kauto -Kthreadsafe -KNOFLTLD -DGETTOD -Kopenmp -Ntl_trt -Nrt_tune –Cpp
①タイマー計測情報：gettod関数を使用し、各計算区間の経過時間を計測②プロファイラ情報：プログラム全体を対象範囲として各種性能情報を計測③PA情報： 各計算区間を対象範囲として、PA情報を計測

6

オリジナルソースの性能評価


JSS

計算データ
Case01
Case02
Case03
Case04
Case05

プログラム全体時間[秒]（timeコマンド計測)
757.15207.88119.84184.73326.26

Case02
ルーチン名
implhs_sgs_mn_new._PRL_1_
cellfacevariables_woedge
corner._PRL_1_
tm_source_sa_
muscl_2ndorder._PRL_1_
derivative._PRL_1_
calcvoverdx_
muscl_va._PRL_1_
flux_roe._PRL_1_
jwe_gpwd
rhs_viscous._PRL_2_
lhs_gaussseidel_
rhs_convect._PRL_2_
diffusion._PRL_1_
muscl._PRL_1_
スレッド0全体計算STEP時間[秒](gettod関数計測)
751.30204.57117.03180.22321.79時間情報
Time(s)Cost(%)
20.9
10.1%

Instructions
5.93E+10

CPU演算性能MIPS
MFLOPS2835.51075.0

実効効率
10.8%

MEM性能
L2-miss(%)
0.10

20.1

9.7%

5.65E+102808.0

790.1

7.9%

0.18

14.3
11.8
11.5
9.5
8.5
8.3
8.1
7.0
6.2
6.0
5.4
5.3
206.6

6.9%
5.7%
5.6%
4.6%
4.1%
4.0%
3.9%
3.4%
3.0%
2.9%
2.6%
2.5%
100.0%

2.74E+10
2.43E+10
2.89E+10
1.84E+10
1.08E+10
1.17E+10
1.48E+10
7.64E+09
1.38E+10
8.30E+09
1.15E+10
6.97E+09
4.24E+11

1910.12059.82516.21945.51274.61412.7
1834.91093.32211.21392.22153.51325.22051.3

411.6
418.5
380.8
210.4
546.9
868.9
387.5
404.5
386.4
768.8
433.6
694.4
544.5

4.1%
4.2%
3.8%
2.1%
5.5%
8.7%
3.9%
4.0%
3.9%
7.7%
4.3%
6.9%
5.4%

0.06
0.21
0.17
0.09
0.54
0.44
0.08
0.76
0.22
0.54
0.21
0.48
0.21

色付きはスレッド非並列
7

オリジナルソースの性能評価


「京」

計算データ
Case01
Case02
Case03
Case04
Case05

SEC: UPACS-turbo 次世代スパコン「京」(Case02-asis)

プログラム全体時間[秒]（timeコマンド計測)
320.23182.0990.83
136.51
239.71

計算STEP時間[秒](gettod関数計測)
314.21178.5488.45
133.34234.77整数ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち

浮動小数点ロードメモリアクセス待ち
整数演算待ちストア待ち
浮動小数点演算待ち

I/Oアクセス待ち
分岐命令待ち整数ロードキャッシュアクセス待ち
命令フェッチ待ちバリア同期待ち浮動小数点レジスタ書き込み制約

uOPコミット
2/3命令コミット

その他の待ち4命令コミット

1命令コミット

整数レジスタ書き込み制約[秒]
2.0E+02
1.8E+02
1.6E+02

4命令コミット
2/3命令コミット

1.4E+02
1.2E+02

1命令コミット

1.0E+02
8.0E+01

浮動小数点演算待ち

6.0E+01
4.0E+01
2.0E+01
0.0E+00
c ase 0 2 _8 t h # 0

Case02
ルーチン名
muscl_2ndorder_
implhs_sgs_mn_new._PRL_1_
muscl_va_
cellfacevariables_woedge
corner._PRL_1_
rhs_viscous_
derivative._PRL_1_
diffusion._PRL_1_
flux_roe._PRL_1_
rho_p_check_rhs_viscous._PRL_1_
muscl._PRL_1___jwe_gdl_gemm_p
tm_source_sa._PRL_2_
exit_subsonic_
スレッド0全体

時間情報
Time(s)Cost(%)
62.8
33.1%
18.7
9.8%
17.4
9.2%

Instructions
1.15E+11
2.00E+10
3.12E+10

c ase 0 2 _8 t h # 1

c ase 0 2 _8 t h # 2

CPU演算性能MIPS
MFLOPS
1865.91058.51100.1
801.6
1782.02734.2c ase 0 2 _8 t h # 3

c ase 0 2 _8 t h # 4

実効効率
6.6%
5.0%
17.1%

c ase 0 2 _8 t h # 5

c ase 0 2 _8 t h # 6

c ase 0 2 _8 t h # 7

MEM性能
L2-miss(%)
0.97
1.43
4.35

13.1

6.9%

2.00E+101480.0

834.3

5.2%

2.26

10.8
8.5
4.8
4.1
3.6
3.1
2.7
2.4
2.2
2.2
189.8

5.7%
4.5%
2.5%
2.1%
1.9%
1.6%
1.4%
1.3%
1.2%
1.1%
100.0%

1.72E+10
1.60E+10
8.90E+09
8.19E+09
5.52E+09
3.73E+09
5.91E+09
4.86E+09
3.36E+09
2.36E+09
3.15E+111617.1
1934.6
1816.51851.91646.51144.52248.12388.41550.11032.01665.0

162.9
523.1
710.6
2770.1526.2
793.4
4171.5
417.5
724.3
271.8
1055.2

1.0%
3.3%
4.4%
17.3%
3.3%
5.0%
26.1%
2.6%
4.5%
1.7%
6.6%

2.48
0.80
0.60
3.93
1.08
2.71
5.43
0.50
0.80
1.97
1.67

色付きはスレッド非並列
8

オリジナルソースの性能評価＠「京」SEC: UPACS-turbo 次世代スパコン「京」(Case02-asis)
整数ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち

浮動小数点ロードメモリアクセス待ち
整数演算待ちストア待ち
浮動小数点演算待ち

I/Oアクセス待ち
分岐命令待ち整数ロードキャッシュアクセス待ち
命令フェッチ待ちバリア同期待ち浮動小数点レジスタ書き込み制約

uOPコミット
2/3命令コミット

その他の待ち4命令コミット

1命令コミット

整数レジスタ書き込み制約[秒]
2.0E+02
1.8E+02

4命令コミット

1.6E+02

2/3命令コミット

1.4E+02
1命令コミット

1.2E+02
1.0E+02

浮動小数点演算待ち

8.0E+01
6.0E+01
4.0E+01
2.0E+01
0.0E+00

c ase 0 2 _8 t h # 0

c ase 0 2 _8 t h # 1

c ase 0 2 _8 t h # 2

c ase 0 2 _8 t h # 3

c ase 0 2 _8 t h # 4

MFLOPS

MIPS

浮動小数点
演算数

SIMD演算
命令率

1113
333

1683
606

2.00E+11
5.99E+10

2.07%
2.07%

331
331

602
571

5.95E+10
5.95E+10

179.88179.88

1.99%
1.99%

319
318

558
551

5.73E+10
5.73E+10

179.88179.88

1.99%
1.99%

318
318

549
549

5.73E+10
5.72E+10

23.26%
5.11%
5.15%
5.15%
5.31%
5.23%
5.22%
5.23%

PAデータ
測定区間
case02_8th#0
case02_8th#1

実行時
間(sec)
179.88179.88浮動小数点
演算ピーク比6.96%
2.08%

case02_8th#2
case02_8th#3

179.88179.88case02_8th#4
case02_8th#5
case02_8th#6
case02_8th#7

c ase 0 2 _8 t h # 5

c ase 0 2 _8 t h # 6

c ase 0 2 _8 t h # 7

PAデータ
測定区間
case02_8th#0

L1D ミ
ス率
5.85%

L2 ミス
率
1.72%

メモリスループット(GB/sec)
1.93

L2 スループット(GB/sec)
3.66

case02_8th#1

7.90%

1.66%

0.66

2.17

case02_8th#2

7.90%

1.66%

0.65

2.15

case02_8th#3

7.95%

1.63%

0.63

2.14

case02_8th#4

7.67%

1.63%

0.62

2.03

case02_8th#5

7.70%

1.59%

0.59

2.01

case02_8th#6

7.69%

1.58%

0.58

2.00

case02_8th#7

7.69%

1.58%

0.59

2.00

9

高速化チューニング
項目
1
2
3
4
5



チューニング内容
指示行の挿入によるスレッド並列化の促進
L1キャッシュ競合の回避によるキャッシュアクセスコストの削減（初期配列）
アリーナ開放処理の抑止によるメモリ開放コストの削減
L1キャッシュ競合の回避によるキャッシュアクセスコストの削減（作業配列）
強制的なループSIMD化

項目1：指示行/OpenMPの挿入によるスレッド並列化の促進


JSSでは自動並列化されるが「京」では自動並列化されないループ

blk_tm_common.f90ソースリスト（抜粋）!ocl norecurrence(q_r,u_r)
do k = isrt(3),iend(3)do j = isrt(2),iend(2)do i = isrt(1),iend(1)ip = i + delta(1) ; jp = j + delta(2) ; kp = k + delta(3)im = i - delta(1) ; jm = j - delta(2) ; km = k - delta(3)!----------------------------dx0=blk%fDelta(i ,j ,k ,dir)dxP=blk%fDelta(ip,jp,kp,dir)dxM=blk%fDelta(im,jm,km,dir)dxP=1.0/(dxP+dx0+EPS)
dxM=1.0/(dxM+dx0+EPS)(中略)df=dx0*lim*fM
q_r(m,im,jm,km)=rho_r*(f0-df)
q_l(m,i ,j ,k )=rho_l*(f0+df)
end doend doend doend doblk_rhsViscous.f90ソースリスト（抜粋）!$omp parallel do default(none) private(i,j,k) shared(blk,cface)do k=-1,blk%kn
do j=-1,blk%jn
do i=-1,blk%in
cface(i,j,k)%dudx = 0.0
cface(i,j,k)%dTdx = 0.0 ; cface(i,j,k)%u = 0.0
cface(i,j,k)%area = 0.0 ; cface(i,j,k)%nv = 0.0
cface(i,j,k)%mu = 0.0 ; cface(i,j,k)%mu_t= 0.0
cface(i,j,k)%flux = 0.0
end doend doend do!$omp end parallel do【挿入前診断メッセージ】
jwd5101p-i "blk_rhsViscous.f90", line 31: DOループ内に,自動並列化の制約となる文が存在します.
【挿入後診断メッセージ】
なし（OpenMP指示行によりスレッド並列化済み）【挿入前診断メッセージ】
jwd5208p-i "blk_tm_common.f90", line 610: 定義引用の順序が分からないため,引用順序が逐次実行と異なる可能性があり,このDOループは並列化されません.(名前:q_r)jwd5208p-i "blk_tm_common.f90", line 610: 定義引用の順序が分からないため,引用順序が逐次実行と異なる可能性があり,このDOループは並列化されません.(名前:u_r)【挿入後診断メッセージ】
jwd5001p-i "blk_tm_common.f90", line 611: このDOループは,並列化されました.(名前:k)10

高速化チューニング


項目２，４：L1キャッシュ競合の回避


L1キャッシュのindex競合 → 可変要素数のパディングで回避

配列要素に対するindex値（色付きは3個以上が重複）
配列要素
blk%dq_star(1,1,1,1)
blk%dq_star(1,1,1,2)
blk%dq_star(1,1,1,3)
blk%dq_star(1,1,1,4)
blk%dq_star(1,1,1,5)
blk%dt(1,1,1)
blk%eddy_vis(1,1,1)
blk%fArea(1,1,1,1)
blk%fArea(1,1,1,2)
blk%fArea(1,1,1,3)
blk%fNormal(1,1,1,1,1)
blk%fNormal(1,1,1,1,2)
blk%fNormal(1,1,1,1,3)
blk%fNormal(1,1,1,2,1)
blk%fNormal(1,1,1,2,2)
blk%fNormal(1,1,1,2,3)
blk%fNormal(1,1,1,3,1)
blk%fNormal(1,1,1,3,2)
blk%fNormal(1,1,1,3,3)
blk%fNormal_t(1,1,1,1)
blk%fNormal_t(1,1,1,2)
blk%fNormal_t(1,1,1,3)
blk%inv_vol(1,1,1)
blk%p(1,1,1)
blk%q(1,1,1,2)
blk%q(1,1,1,3)
blk%q(1,1,1,4)
blk%vis(1,1,1)

Case01
91
91
91
91
91
84
11
123
123
123
43
43
43
43
43
43
43
43
43
75
75
75
29
20
27
27
27
123

Case02
7
103
71
39
7
0
23
23
119
87
119
23
55
87
119
23
55
87
119
55
23
119
32
48
39
7
103
64

Case03
22
7
121
106
92
30
74
22
7
121
38
122
79
23
108
64
9
93
50
6
119
105
9
54
87
73
58
86

Case04
74
102
2
30
58
33
65
106
6
34
26
110
66
54
10
94
82
38
122
58
86
114
12
109
38
66
94
35

Case05
40
23
5
116
98
8
120
40
23
5
88
36
111
71
18
94
53
1
76
120
103
85
74
97
55
37
20
56

base_blockDataType.f90ソースリスト（抜粋）subroutine get_str_end(blk,is,ie,js,je,ks,ke)
type(blockDataType),intent(inout) :: blk
integer,intent(out):: is,ie,js,je,ks,ke
is = 1 - bdtv_bdpts; ie = blk%in + bdtv_bdpts
js = 1 - bdtv_bdpts; je = blk%jn + bdtv_bdpts
ks = 1 - bdtv_bdpts; ke = blk%kn + bdtv_bdpts
end subroutine get_str_end(中略)subroutine allocatePhys(blk)type(blockDataType),intent(inout) :: blk
integer :: is,ie, js,je,ks,kecall get_str_end(blk,is,ie,js,je,ks,ke)
allocate(blk%q(is:ie,js:je,ks:ke, bdtv_nphys))
allocate(blk%dq(is:ie,js:je,ks:ke, bdtv_nphys))
allocate(blk%p(is:ie,js:je,ks:ke))allocate(blk%temp(is:ie,js:je,ks:ke))allocate(blk%dt(is:ie,js:je,ks:ke))allocate(blk%dq_star(is:ie,js:je,ks:ke, bdtv_nFlowVar))
・・・

ケース名
Case01
Case02
Case03
Case04
Case05

格子サイズ(60,60,60)(30,60,120)(50,50,50)(40,40,120)(70,70,70)

領域確保時のサイズ(-1:62,-1:62,-1:62) → 64x64x64(-1:32,-1:64,-1:122) → 34x64x124(-1:52,-1:52,-1:52) → 54x54x54(-1:42,-1:42,-1:122) → 44x44x124(-1:72,-1:72,-1:72) → 74x74x74

11

高速化チューニング


項目３：アリーナ開放処理の抑止
アリーナ：実行時のメモリ獲得/開放要求に対して高速に処理するため、あらかじめ確保したメモリ領域（メモリプール）とその管理領域
 allocate/deallocateが多い場合、アリーナを開放すると性能が悪化
 アリーナ開放を抑止 環境変数：XOS_MMM_L_ARENA=2

XOS_MMM_L_ARENA=1（デフォルト）XOS_MMM_L_ARENA=2

機能

メモリ開放要求に対してアリーナを開放する

メモリ開放要求に対してアリーナを開放しない長所

メモリ使用量を節約できるメモリ獲得/開放のコストが低い

短所

メモリ獲得/開放のコストが高い

メモリ使用量が増大する

12高速化チューニング


項目５：ループのSIMD化（未対応）

SIMD化されない原因
ループ中のIF文

ループ中のライブラリ呼び出し

サブルーチンimplhs_sgs_mn_new
do k=is(3),ie(3),istep(3)do j=is(2),ie(2),istep(2)do i=is(1),ie(1),istep(1)rho = blk%q(i,j,k,1)
rhoi = 1.d0/(rho+epsilon(rho))
・・・
if(bv_viscous%yes) thenmu = blk%vis(i,j,k)if(bv_tm%yes) mu = mu + blk%eddy_vis(i,j,k)sigma_vis = 2.*mu * blk%inv_vol(i,j,k)*rhoi
sigma_ui = uu_ui + c + sigma_vis*blk%fArea(i ,j ,k ,1)sigma_li = uu_li + c + sigma_vis*blk%fArea(i-1,j ,k ,1)sigma_uj = uu_uj + c + sigma_vis*blk%fArea(i ,j ,k ,2)sigma_lj = uu_lj + c + sigma_vis*blk%fArea(i ,j-1,k ,2)sigma_uk = uu_uk + c + sigma_vis*blk%fArea(i ,j ,k ,3)sigma_lk = uu_lk + c + sigma_vis*blk%fArea(i ,j ,k-1,3)
else
sigma_ui = uu_ui + csigma_li = uu_li + csigma_uj = uu_uj + csigma_lj = uu_lj + csigma_uk = uu_uk + csigma_lk = uu_lk + c
endif

サブルーチンscalarMeasure
do k=1,blk%kn
do j=1,blk%jn
do i=1,blk%in!- velocity gradient --------・・・
dudxi(:,1) = ( blk%q(i+1,j ,k ,2:4)/blk%q(i+1,j ,k ,1) &&- blk%q(i-1,j ,k ,2:4)/blk%q(i-1,j ,k ,1) )*0.5
dudxi(:,2) = ( blk%q(i ,j+1,k ,2:4)/blk%q(i ,j+1,k ,1) &&- blk%q(i ,j-1,k ,2:4)/blk%q(i ,j-1,k ,1) )*0.5
dudxi(:,3) = ( blk%q(i ,j ,k+1,2:4)/blk%q(i ,j ,k+1,1) &&- blk%q(i ,j ,k-1,2:4)/blk%q(i ,j ,k-1,1) )*0.5
・・・
xix_atcell(1,:)=(blk%xix(i,j,k,1,:)+blk%xix(i-1,j ,k ,1,:))*0.5
xix_atcell(2,:)=(blk%xix(i,j,k,2,:)+blk%xix(i ,j-1,k ,2,:))*0.5
xix_atcell(3,:)=(blk%xix(i,j,k,3,:)+blk%xix(i ,j ,k-1,3,:))*0.5
dudx(:,:)=matmul(dudxi(:,:),xix_atcell(:,:))
・・・
end doend doend do

マスク処理？

インライン展開で対応か？

・・・

後述のチューニング評価ではIF文を取ったものを評価

13

チューニング後の性能評価


チューニングにより全ケースで計算時間が短縮した。


Case01は314.21秒から72.28秒へと約4.3倍となった。
計算STEP時間[秒](gettod関数計測)

計算
データ
オリジナル

＋項目１

＋項目２

＋項目３

＋項目４

＋項目５

Case01

314.21210.41

99.86

84.66

79.90

72.78

Case02178.54112.92

97.44

81.46

81.99

76.09

Case03

88.45

55.30

55.72

47.91

48.96

44.85

Case04133.34

80.39

80.78

66.12

68.29

62.29

Case05234.77144.74144.91

120.19119.33110.1614

チューニング後の性能評価
CPU演算性能

時間情報

Case02
ルーチン名

Time(s)cellfacevariables_woedge
corner._PRL_1_
implhs_sgs_mn_new._PRL_1_
flux_roe._PRL_1_
rho_p_check_rhs_viscous._PRL_1_
derivative._PRL_1_
muscl_va._OMP_1___jwe_gdl_gemm_p
muscl._PRL_1_
diffusion._PRL_1_
muscl_2ndorder._PRL_1_
tm_source_sa._PRL_2_
flux_vis._PRL_1_
スレッド０全体
Case02
ルーチン名
muscl_2ndorder_
implhs_sgs_mn_new._PRL_1_
muscl_va_
cellfacevariables_woedge
corner._PRL_1_
rhs_viscous_
derivative._PRL_1_
diffusion._PRL_1_
flux_roe._PRL_1_
rho_p_check_rhs_viscous._PRL_1_
muscl._PRL_1___jwe_gdl_gemm_p
tm_source_sa._PRL_2_
exit_subsonic_
スレッド0全体

Cost(%)

InstructionsMIPS

MFLOPS

メモリアクセス性能
L1missL2miss
(%)
(%)

SIMD
[%]

実効
効率

10.8

14.0%

1.71E+10

1580.8

998.9

6.2%

19.2

2.21

1.76

8.9
4.2
3.8
3.3
3.0
2.8
2.5
2.2
2.2
2.2
2.1
1.9
77.3

11.5%
5.5%
4.9%
4.3%
3.8%
3.6%
3.2%
2.8%
2.8%
2.8%
2.7%
2.4%
100.0%

1.64E+10
5.69E+09
6.87E+09
4.34E+09
7.46E+09
3.90E+09
6.98E+09
5.61E+09
2.47E+09
3.64E+09
4.74E+09
3.18E+09
1.38E+11

1856.01348.5
1804.71349.1
2561.11389.22700.51186.12390.22632.01801.71664.31782.01399.81504.6829.8
952.1
1487.91316.6470.71305.31501.71552.61245.11238.71046.5

8.7%
9.4%
5.2%
6.0%
9.3%
8.2%
2.9%
8.2%
9.4%
9.7%
7.8%
7.7%
6.5%

1.0
24.1
0.4
20.5
18.3
14.2
3.4
29.2
19.4
19.4
15.0
21.3
10.9

5.51
4.73
1.95
2.66
2.40
4.18
1.51
6.40
2.24
3.59
2.52
1.95
2.86

1.52
4.67
1.15
2.17
1.77
4.13
0.60
6.27
1.51
3.28
1.50
1.40
1.97

時間情報
Time(s)Cost(%)
62.8
33.1%
18.7
9.8%
17.4
9.2%

Instructions
1.15E+11
2.00E+10
3.12E+10

CPU演算性能MIPS
MFLOPS
1865.91058.51100.1
801.6
1782.02734.2

実効効率
6.6%
5.0%
17.1%

MEM性能
L2-miss(%)
0.97
1.43
4.35

13.1

6.9%

2.00E+101480.0

834.3

5.2%

2.26

10.8
8.5
4.8
4.1
3.6
3.1
2.7
2.4
2.2
2.2
189.8

5.7%
4.5%
2.5%
2.1%
1.9%
1.6%
1.4%
1.3%
1.2%
1.1%
100.0%

1.72E+10
1.60E+10
8.90E+09
8.19E+09
5.52E+09
3.73E+09
5.91E+09
4.86E+09
3.36E+09
2.36E+09
3.15E+111617.1
1934.6
1816.51851.91646.51144.52248.12388.41550.11032.01665.0

162.9
523.1
710.6
2770.1526.2
793.4
4171.5
417.5
724.3
271.8
1055.2

1.0%
3.3%
4.4%
17.3%
3.3%
5.0%
26.1%
2.6%
4.5%
1.7%
6.6%

2.48
0.80
0.60
3.93
1.08
2.71
5.43
0.50
0.80
1.97
1.67

15

チューニング後の性能評価


ASIS:

SEC: UPACS-turbo 次世代スパコン「京」(Case02-asis)
整数ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち

浮動小数点ロードメモリアクセス待ち
整数演算待ちストア待ち
浮動小数点演算待ち

I/Oアクセス待ち
分岐命令待ち整数ロードキャッシュアクセス待ち
命令フェッチ待ちバリア同期待ち浮動小数点レジスタ書き込み制約

uOPコミット
2/3命令コミット

その他の待ち4命令コミット

1命令コミット

整数レジスタ書き込み制約[秒]
2.0E+02
1.8E+02

4命令コミット

1.6E+02

2/3命令コミット

1.4E+02
1命令コミット

1.2E+02
1.0E+02
8.0E+01

浮動小数点演算待ち

6.0E+01
4.0E+01
2.0E+01
0.0E+00
c ase 0 2 _8 t h # 0

c ase 0 2 _8 t h # 1

c ase 0 2 _8 t h # 2

c ase 0 2 _8 t h # 3

c ase 0 2 _8 t h # 4

c ase 0 2 _8 t h # 5

c ase 0 2 _8 t h # 6

c ase 0 2 _8 t h # 7

SEC: UPACS-turbo 次世代スパコン「京」(Case02-tune)

TUNED:
整数ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち

浮動小数点ロードメモリアクセス待ち
整数演算待ちストア待ち
浮動小数点演算待ち

I/Oアクセス待ち
分岐命令待ち整数ロードキャッシュアクセス待ち
命令フェッチ待ちバリア同期待ち浮動小数点レジスタ書き込み制約

uOPコミット
2/3命令コミット

その他の待ち4命令コミット

1命令コミット

整数レジスタ書き込み制約[秒]
8.0E+01
7.0E+01
6.0E+01
5.0E+01
4.0E+01

4命令コミット
2/3命令コミット
1命令コミット
浮動小数点演算待ち

3.0E+01
2.0E+01
1.0E+01
0.0E+00
c ase 0 1 _8 t h # 0

c ase 0 1 _8 t h # 1

c ase 0 1 _8 t h # 2

c ase 0 1 _8 t h # 3

c ase 0 1 _8 t h # 4

c ase 0 1 _8 t h # 5

c ase 0 1 _8 t h # 6

c ase 0 1 _8 t h # 7

16

チューニング後の性能評価


ASIS:

PAデータ
測定区間
case02_8th#0
case02_8th#1
case02_8th#2
case02_8th#3
case02_8th#4
case02_8th#5
case02_8th#6
case02_8th#7



実行時
間(sec)
179.88179.88179.88179.88179.88179.88179.88179.88浮動小数点
演算ピーク比
6.96%
2.08%
2.07%
2.07%
1.99%
1.99%
1.99%
1.99%

MFLOPS

MIPS

1113
333
331
331
319
318
318
318

1683
606
602
571
558
551
549
549

MFLOPS

MIPS

1133
1071
1059
1059
1029
1028
1028
1027

1747
1439
1425
1338
1308
1289
1285
1284

PAデータ
測定区間
case02_8th#0

L1D
ミス率
5.85%

L2
ミス率
1.72%

メモリスループット(GB/sec)
1.93

L2 スループット(GB/sec)
3.66

5.11%
5.15%

case02_8th#1

7.90%

1.66%

0.66

2.17

case02_8th#2

7.90%

1.66%

0.65

2.15

5.15%
5.31%

case02_8th#3

7.95%

1.63%

0.63

2.14

case02_8th#4

7.67%

1.63%

0.62

2.03

5.23%
5.22%

case02_8th#5

7.70%

1.59%

0.59

2.01

case02_8th#6

7.69%

1.58%

0.58

2.00

5.23%

case02_8th#7

7.69%

1.58%

0.59

2.00

SIMD演算命令率
37.19%
39.74%
39.85%
39.85%
41.44%
41.38%
41.40%
41.46%

PAデータ
測定区間
case02_8th#0
case02_8th#1
case02_8th#2
case02_8th#3
case02_8th#4
case02_8th#5
case02_8th#6
case02_8th#7

L1D
ミス率
3.68%
4.02%
4.02%
4.02%
3.91%
3.89%
3.87%
3.87%

L2
ミス率

メモリスループット(GB/sec)
2.39
2.00
1.98
1.92
1.90
1.82
1.81
1.82

L2 スループット(GB/sec)
2.83
2.55
2.53
2.48
2.38
2.32
2.31
2.30

浮動小数点
演算数
2.00E+11
5.99E+10
5.95E+10
5.95E+10
5.73E+10
5.73E+10
5.73E+10
5.72E+10

SIMD演算
命令率

浮動小数点
演算数
7.87E+10
7.44E+10
7.36E+10
7.36E+10
7.15E+10
7.15E+10
7.14E+10
7.14E+10

23.26%

TUNED:

PAデータ
測定区間
case02_8th#0
case02_8th#1
case02_8th#2
case02_8th#3
case02_8th#4
case02_8th#5
case02_8th#6
case02_8th#7

実行時
間(sec)
69.51
69.51
69.51
69.51
69.51
69.51
69.51
69.51

浮動小数点
演算ピーク比
7.08%
6.69%
6.62%
6.62%
6.43%
6.43%
6.42%
6.42%

17

演算密度とメモリアクセス


SIMD化率とFLOPSの関係
SIMD化を促進しても性能が向上せず（項目５：IF文の削除）
SEC: UPACS-turbo 次世代スパコン「京」(Case01-cellfacevariables_wc)

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

浮動小数点ロードメモリアクセス待ち
整数演算待ちストア待ち
浮動小数点演算待ち

I/Oアクセス待ち
分岐命令待ち整数ロードキャッシュアクセス待ち
命令フェッチ待ちバリア同期待ち浮動小数点レジスタ書き込み制約

uOPコミット
2/3命令コミット

その他の待ち4命令コミット

1命令コミット

整数レジスタ書き込み制約[秒]
1.2E+01

1.0E+01

4命令コミット
2/3命令コミット

8.0E+00
1命令コミット
浮動小数点演算待ち
6.0E+00

4.0E+00

2.0E+00

0.0E+00
適用前# 0

適用前# 1

適用前# 2

適用前# 3

適用前# 4

適用前# 5

適用前# 6

適用前# 7

適用後# 0

適用後# 1

SIMD化促進前
PAデータ
測定区間
適用前#0
適用後#0

実行時間
(sec)
10.31
11.21

浮動小数点
演算ピーク比9.45%
8.69%

適用後# 2

適用後# 3

適用後# 4

適用後# 5

適用後# 6

適用後# 7SIMD化促進後
MFLOPS

MIPS

1512
1391

1929
1707

浮動小数点
演算数
1.56E+10
1.56E+10

SIMD演算命令率(/対象演算命令数)
0.00%
98.85%

18

演算密度とメモリアクセス
PAデータ
測定区間
適用前#0
適用後#0

実行時間
(sec)
10.31
11.21

PAデータ
測定区間

L1D ミス率(/ld・st数)

適用前#0
適用後#0

SIMD演算命令率(/対象演算命令数)
0.00%
98.85%MFLOPS

MIPS

1512
1391

1929
1707

浮動小数点
演算数
1.56E+10
1.56E+10

L1D ミス数

L2 ミス率(/ld・st数)

L2 ミス数

メモリスループット(GB/sec)

L2 スループット(GB/sec)

3.60%

2.66E+08

1.45%

1.07E+08

1.88

3.30

2.62%

2.53E+08

1.11%

1.07E+08

1.74

2.88

PAデータ
測定区間

ロード・ストア命
令数

浮動小数点演
算命令数

プリフェッチ
命令数

分岐
命令数

その他
命令数

有効総命令数

適用前#0
適用後#0

7.39E+09
9.65E+09

9.88E+09
4.86E+09

4.98E+04
4.87E+04

8.11E+07
1.65E+07

2.54E+09
4.60E+09

1.99E+10
1.91E+10

PAデータ
測定区間

浮動小数点
ロード命令数
2.54E+09
2.54E+09

適用前#0
適用後#0

浮動小数点
演算ピーク比
9.45%
8.69%

浮動小数点
ストア命令数
5.63E+08
5.68E+08

整数
ロード命令数
3.10E+09
4.32E+09

整数
ストア命令数
1.19E+09
2.22E+09

ロード・ストア命令数
7.39E+09
9.65E+09

PAデータ
測定区間

浮動少数点演算命令数

浮動小数点積和演算命令数

SIMD

非SIMD

SIMD

非SIMD

浮動小数点
演算命令数

適用前#0

0.00E+00

4.17E+09

0.00E+00

5.71E+09

9.88E+09

適用後#0

1.86E+09

2.53E+07

2.95E+09

3.07E+07

4.86E+0919

演算密度とメモリアクセス


浮動小数点演算ネックのものはSIMD化により性能が向上
SEC: UPACS-turbo 次世代スパコン「京」(Case01-muscl2ndOrder)

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

浮動小数点ロードメモリアクセス待ち
整数演算待ちストア待ち
浮動小数点演算待ち

I/Oアクセス待ち
分岐命令待ち整数ロードキャッシュアクセス待ち
命令フェッチ待ちバリア同期待ち浮動小数点レジスタ書き込み制約

uOPコミット
2/3命令コミット

その他の待ち4命令コミット

1命令コミット

整数レジスタ書き込み制約[秒]
6.0E+00
4命令コミット

5.0E+00
2/3命令コミット

4.0E+00

3.0E+00

1命令コミット

2.0E+00
浮動小数点演算待ち

1.0E+00

0.0E+00
適用前# 0

適用前# 1

適用前# 2

適用前# 3

適用前# 4

適用前# 5SIMD化促進前

適用前# 6

適用前# 7

適用後# 0

適用後# 1

適用後# 2

適用後# 3

適用後# 4

適用後# 5

適用後# 6

適用後# 7SIMD化促進後20

2.6 流体解析プログラムのデータ&ループ構造に関して
宇宙航空研究開発機構 宇宙科学研究所
高木 亮治
2.6.1

はじめに

一般的に流体解析プログラムは高いメモリバンド幅を要求するプログラムであり、高いメモリバンド幅を有するベクトル計算機との相性が良いと言われてきた。しかしながら、科学技術計算の分野においても専用計算機的なベクトル計算機から汎用計算機的なスカラー並列計算機へと計算機アーキテクチャの移行が行われ、しかも急激に増加する演算性能に比して、メモリ性能の伸びが追いつかず、B/F は確実に減少する傾向にある。例えば、現在検討が進められているエクサフロップス級計算機のうち、様々な計算に適用可能な汎用性を指向したものでは、B/F は 0.1 へと減少し次世代スーパーコンピュータ「京」の 1/5 と予想されている。そのため低い B/F においてもそれなりの実行性能を発揮する流体解析プログラムを開発する必要がある。
ここでは、低 B/F を前提とした圧縮性流体解析プログラムの実現を目指して、どの様なプログラム構造が適切かについての検討を試みた。まず、手始めに JAXA が開発している UPACS の主要部分を抜き出してカーネルプ
ログラムを作成し、これを用いてループ構造の検討を行った。

2.6.2

ループ構造の検討

カーネルプログラムでは、一般曲線座標系で記述された支配方程式を対象として、右辺対流項の計算部分 (基本変数を用いた 2 次精度 MUSCL、van Albada のリミター、数値流速は SHUS) と左辺時間積分 (1 次精度 Euler 陽解法) を実装している。現時点では粘性項、陰解法による時間積分、境界条件は考慮していない。対象となるこれ
らの計算を行う際のループ構造として• ループ A：従来のループ• ループ B：局所性を意識した (空間スイープの 3 重ループの数をできるだけ減らした) ループを実装し、計算速度の違いを調べた。
ループ A は従来のプログラムに良く見られる構造で、圧縮性流体の離散方程式をプログラムとして実装する際に、対流項の計算に用いるセル面での物理量の外挿 (MUSCL+リミター)、セル面における対流項の数値流束の計
算、(セル面における粘性流束の計算)、更新ベクトル ∆Q の計算、時間積分 (左辺の計算) のように、それぞれの計算を分割して、それぞれに対して空間の多重ループで計算を実行する。そのために 1 ステップの計算を実行す
るのに、何度も空間スイープを行うことになる。ループ A を模式的に書くと以下のようになる。ここで、dir=1,3のループは 3 次元のインデックス方向 (i、j 、k 方向) のループである。

do dir=1,3
do k=1,kmax
do j=1,jmax
do i=1,imax
MUSCL による外挿
enddo
enddo
enddo

1

do k=1,kmax
do j=1,jmax
do i=1,imax
数値流束の計算
enddo
enddo
enddo
do k=1,kmax
do j=1,jmax
do i=1,imax
更新ベクトルの計算
enddo
enddo
enddo
enddo
do k=1,kmax
do j=1,jmax
do i=1,imax
時間積分
enddo
enddo
enddo
この様にループ A では 3(MUSCL、数値流束、∆Q) × 3 方向 (i,j,k 方向)+1(時間積分) の計 10 回の空間スイー
プを実行することになる。空間を何度もスイープすることはそれだけメモリアクセスが増加し、キャッシュを有効に活用することができなくなる。そのため、アルゴリズムの観点からメモリアクセスを減らすことを意図して、空間のスイープを極力減らし、データの再利用性を心掛けるループ B を考える。ループ B では空間のスイープは必
要最低限な 2 回 (右辺の計算と左辺の計算) とした。つまり、あるセル (i,j,k) に着目し、そのセルで必要な右辺の計算を全て行い、それが終わると次のセルに移動する。この様にして 1 つの空間スイープで右辺を全て計算する。
次に左辺に関して、2 つ目の空間スイープで計算を済ませることとする。ここで注意すべき点として、一般には数値流束の計算はセル面のループで回すが、これをセルのループで回すと何も考慮しないと 1 つの面での数値流束を 2 回計算することになる。これを避けるためにはフラグを設定して計算したかどうかを判別する必要があるが、ここでは構造格子である利点を活かして、個々のセルでは各方向でインデックスが増える方向のセル面での数値
流束の計算を実施することとする。そのためインデックスの始点側境界 (i = 1 or j = 1 or k = 1) での処理が必要となる。

do k=1,kmax
do j=1,jmax
do i=1,imax
do dir=1,3
MUSCL による外挿、数値流束の計算、更新ベクトルの計算
境界での処理 (MUSCL、数値流束、更新ベクトルの計算)
enddo

enddo
enddo
2

enddodo k=1,kmax
do j=1,jmax
do i=1,imax
時間積分
enddo

enddo
enddo
ループ A、B ともに最外ループである k のループを対象に OpenMP でスレッド並列化を行った。

数値実験

2.6.3

ループ A および B を実装したカーネルプログラムを幾つかの計算機上で実行し、それぞれの性能測定を実施した。計算対象は単純な立方体格子であり、格子ブロックサイズ (=ループ長) を変えて測定を行った。性能測定に用いた計算機環境を表 1 に示す。コンパイル時の最適化オプションは富士通コンパイラー (JSS)、インテルコンパ
イラー (PC-S)、GNU コンパイラー (PC-S, PC-N) でそれぞれ、-O5、-fast、-O3 を用いた。
表 1: 計測環境
CPU Clock
GFLOPS
[GHz]

Name

CPU

# of CoresJSS

SPARC64 VII

4

2.5

PC-S

Core i7-3960X
Sandy Bridge

6

3.3

Core i7-965
Nehalem

4

PC-N

2.6.3.1

3.2

Memory bandwidth[GB/s]

Compiler

40

40

Fujitsu

158.4

51.2 (DDR3-1600)
or

Intel
or

42.7 (DDR3-1333)

GNU

31.2 (DDR3-1333)

GNU

51.2

JSS での測定

JSS(富士通 FX1、CPU は SPARC64VII) 上でループ A とループ B の比較を行った。計算は 1 プロセス、4 ス
レッドである。図 1(a) にループ A、B それぞれの計算時間と L2 キャッシュのミス率の傾向を示す。図より、ループ B は狙い通り L2 キャッシュのミス率が半減していることがわかる。しかしながら計算速度としてはループ A の方がループ B よりも速い結果となった。この原因であるが、ループ B はキャッシュのミス率は改善されたが、ループの中身が大きくなった分、レジスター溢れや、パイプライン処理の最適化など、他の性能要因の影響によって性能が悪化した可能性がある。コンパイラーの最適化能力と関連するので、引き続き詳細な検討が必要である。
両方に共通する傾向として、経過時間に細かな振動が見られるが、これはスレッド数 4 の周期となっており、格子ブロックサイズがスレッド数で割りきれる場合が局所的に経過時間が短く、余りが 3 の場合に局所的に経過時間が長くなるためである。また、格子ブロックサイズが小さい場合はデータがキャッシュに収まるため、演算ネッ
クとなり格子ブロックサイズの増加とともに経過時間が増加している。一方、格子ブロックサイズが 60 を越える
辺りからデータがキャッシュから溢れるため、メモリバンド幅ネックとなり、格子ブロックサイズが増加しても経過時間は殆ど変化しなくなると考えられる。
図 1(b) に仮想的にメモりバンド幅を変化させた時の影響を示す。ここでは 1 つの CPU 内に 1 プロセス× 1 ス
レッド (1P/CPU) で計算を行った場合と、4 プロセス× 1 スレッド (4P/CPU) で計算を行った場合を比較することで仮想的にメモリバンド幅が変化した場合の計算性能の変化を調べた。詳細に関しては 2.6.A を参照のこと。
1P/CPU は CPU のメモリバンド幅をほぼ占有できるが、4P/CPU は 4 プロセスでメモリバンド幅を共有するた3

め、1P/CPU のケースに比べて 1/4 のメモリバンド幅とみなせる。図より、ループ A はメモリバンド幅が減少す
ると 10%程度性能が下がるが、ループ B は 2%程度しか下がらず、この範囲ではメモリバンド幅にあまり影響を受けないことがわかる。
4 Threads

4 Threads

0.4

0.4
B (Elaps)
B (L2 MISS)

A (1P/CPU)A (4P/CPU)

0.3

0.3

0.2

0.25

0.1

0.2
0

20

40

60

80
100
Block size

120

140

B (1P/CPU)
B (4P/CPU)

1.1
Elaps time/grid point [µ sec.]

0.35

L2 MISS [%]Elaps time/grid point [µ sec.]

A (Elaps)
A (L2 MISS)

1.2

1

0.9

0
160

0.8
0

20

(a) 経過時間と L2 ミス率

40

60

80
100
Block size

120

140

160

(b) メモリバンド幅の影響

図 1: JSS におけるループ性能

2.6.3.2

インテル系 CPU での測定

インテル系 CPU でも PC-S(Core i7-3960X) を中心にループ A および B の比較を行った。図 2 に 1 スレッドと6 スレッドの場合 (どちらも 1 プロセス実行) の測定結果を示す。横軸は格子ブロックサイズ (=ループ長)、縦軸は

1 格子点あたりの計算時間 (経過時間) である。ここで、図中の 1333 および 1600 はメモリクロックの値を示し、大きい方 (1600) がデータ転送能力が高いため、ループ A、B ともメモリクロックが高い方が性能が高いことがわかる。
ループ A は格子ブロックサイズが 23 および 78 の前後で不連続な特性、また 1 スレッドのケースで格子ブロック
サイズが 63 の時に局所的な性能悪化が見られる。キャッシュやメモリバンク競合などの原因が考えられるが詳細は不明である。一方ループ B は比較的素直な特性を示しており、一般的な傾向 (格子ブロックサイズが小さい範囲
では演算器ネックのため演算量の増加に伴って計算時間が増加し、格子ブロックサイズが大きくなりキャッシュが溢れる様になるとメモリネックになり計算時間がほぼ一定となる) が見られる。スレッド並列の場合は格子ブロッ
クサイズが小さい範囲ではスレッド並列のオーバーヘッドが顕著になり、結果的に計算時間が増加していると考えられる。スレッド並列の場合、プログラム中の各ループはスレッド数で分割されるため、ループ長がスレッド数で割った余りに応じて計算時間が変動している様子が観察できる。
ループ A とループ B との比較では、スレッド数の増加および格子ブロックサイズの増加など、メモリアクセスの負荷が大きくなると、ループ A とループ B で計算性能の逆転現象が見られ、ループ B がループ A に比べて 18%程
度良い性能を示している。この事は、それぞれのループでメモリ周波数の違いによる計算時間の差を見ても同様のことが言える。つまり、それぞれのループで 1333 と 1600 の違いを見ると、メモリ性能が低くなった場合に計算速度がどの程度悪化するかがわかる。ループ B はメモリ性能が悪化してもほとんど計算時間が悪化していないが、ループ A はメモリ性能の悪化に対して計算時間が 7%程度 (6 スレッドの場合) 増加している。この結果からもループ B はループ A に比べてメモリ性能にあまり依存しないと考えられる。

4

1 Thread

6 Threads

0.4

0.15
A (1333)
B (1333)
A (1600)
B (1600)

0.14

0.38

0.13
Elaps time/grid point [µ sec.]

Elaps time/grid point [µ sec.]

0.36

0.34

0.32

0.12

0.11

0.1

0.3
0.09
A (1333)
B (1333)
A (1600)
B (1600)

0.28

0.08

0.26

0.07
0

20

40

60

80
100
Block size

120

140

160

0

(a) 1 スレッド

20

40

60

80
100
Block size

120

140

160

(b) 6 スレッド

図 2: PC-S(Core i7-3960X) におけるループ性能

2.6.3.3

B/F による整理

理論メモリ性能 (Byte/s) と理論演算性能 (FLOPS) の比を B/F と呼ぶが、アプリケーションの特性を議論する際に重要な指標となる。一般に圧縮性流体解析プログラムは高い B/F が必要と言われている。1CPU で実行するプロセス数を変化させることで、1 プロセス当たりのメモリバンド幅を仮想的に変化させることを考えた。この手法を用いてそれぞれのループのメモリバンド幅が減少した際の性能特性を調査した。メモリバンド幅を仮想的に変化させる手法の詳細については 2.6.A を参照の事。なお、2.6.A の結果より、JSS および Core i7-965 は比較的
この手法の精度が良いと考えられる。
測定結果を図 3 に示す。この図で「3960X」、「965」は表 1 の PC-S (Core i7-3960X)、PC-N (Core i7-965) を示す。また、「Intel」、「GNU」はそれぞれインテルコンパイラー、GNU コンパイラーを示す。
格子ブロックサイズは 80 である。横軸は B/F であるが、ここでは理論性能の値を用いた。理論性能に対して実際に出る性能 (実行性能) は計算機システムによって異なるため、異る CPU の結果を比較する際は注意が必要である。
図 3(a) の縦軸は「性能」を示す。ここで「性能」は単位理論性能あたりの計算速度 (経過時間の逆数) とした。

JSS を始めとして全ての CPU でループ A の方が良い性能を示している。しかしながら、B/F が減少するとルー
プ A は急速に性能が悪化している。一方、ループ B は B/F の減少にともなう性能悪化はそれほど酷くないことがわかる。1 ケースだけではあるが、B/F が最低の時にループ B の方が速い結果が得られている。更に B/F が減
少した場合に 2 つのループの特性がどうなるかは現時点では不明ではあるが、低 B/F の領域ではループ B の方が良い性能を示す可能性がある。
図 3(b) の縦軸は「計算効率」を示す。ここで、「計算効率」は前述の「性能」を最大 B/F の時の「性能」で正規化した値である。つまりある CPU に対して B/F が最大の場合 (1CPU に対して 1 プロセスを実行し、メモリバ
ンド幅を占有した場合) の「性能」を 100 とした時の「性能」比である。この図からも、B/F が減少した時にループ A はループ B に比べて急激に性能が悪化していることがわかる。

5

1 Thread

1Thread, Block size=80

0.2

100

Performance (1./Elaps time/GFLOPS)

0.18

0.16

Performance / Performance@(Band_Width)max [%]A (3960X Intel)
B (3960X Intel)
A (3960X GNU)B (3960X GNU)
A (JSS)
B (JSS)A (965 GNU)B (965 GNU)

0.14

0.12

0.1

0.08

0.06

95

90

85

A (3960X Intel)
B (3960X Intel)
A (JSS)
B (JSS)A (965 GNU)B (965 GNU)

80

75
0

0.5

1

1.5

2

2.5
3
Byte/Flops

3.5

4

4.5

5

0

0.5

1

(a) 計算性能

1.5

2
2.5
Byte/Flops

3

3.5

4

(b) 計算効率

図 3: B/F の変化による計算性能の変化

2.6.4

まとめ

UPACS の主要部を切り出したカーネルプログラムを作成し、2 種類のループ構造に対して計算性能の比較を行った。従来のループ構造よりも局所性を意識し空間スイープを極力減らしたループは、狙い通りキャッシュミス
率を従来のループ構造に比べてほぼ半減させることができた。計算性能を支配する他の最適化要因が複雑に関係するため、新しいループ構造が常に良いという結果は得られなかったが、低メモリバンド幅のシステムでは有利になる可能性が示された。今回の測定では低 B/F 領域を十分に設定することができなかったため、更なる低 B/F領域での測定を実施する予定である。更には、粘性項、陰解法を含めた評価や、ループ構造だけではなく、キャッシュの有効利用など低 B/F を前提としたプログラミングモデルの検討を今後進めていく予定である。

2.6.A

STREAM と B/F の制御

メモり性能を測定するベンチマークテストである STREAM を用いて、今回性能測定を行った CPU のメモリ性能を測定した。STREAM では COPY、SCALE、ADD、TRIAD の性能を測定できるが、ここでは COPY と

TRIAD の性能をブロックサイズ N を変化させて測定した。ここで COPY は
do i=1,Nc(i) = a(i)enddoとなる。図 4 に測定結果を示す。
ブロックサイズが小さい場合はキャッシュを有効に活用することができ、一般的にメモリ性能が良いことがわかる。最大のブロックサイズ（4 × 107 ）での COPY 性能は Core i7-3960X が 25.3GB/s、Core i7-965 が 14.1GB/s、JSS が 9.35GB/s となった。ちなみに、この性能は OpenMP を用いて CPU 内の全コアを使ったスレッド並列での性能である。それぞれの理論メモリバンド幅は 51.2GB/s、31.2GB/s、40GB/s であるため、実行効率は 49.4%、
45.2%、23.4%となる。
それぞれの CPU でコア数分プロセス× 1 スレッド、1 プロセス× 1 スレッド、1 プロセス×コア数分スレッドの比較を行った。ちなみに 1 プロセス×コア数分スレッドはマルチコア CPU を利用する際の標準的な手法であ6

STREAM COPY

Performance [GB/s]

1000

100

25.3
14.1
9.35

10

1
10000

100000

1e+06

1e+07

1e+08

Block size
965 GNU (4P1T)
965 GNU (1P1T)
965 GNU (1P4T)
3960X GNU (6P1T)
3960X GNU (1P1T)
3960X GNU (1P6T)

3960X Intel (6P1T)
3960X Intel (1P1T)
3960X Intel (1P6T)
JSS (4P1T)
JSS (1P1T)
JSS (1P4T)

図 4: STREAM を用いたメモリ性能の測定結果
り、ハイブリッド並列の基本となる。ここで注目したいのは 1 プロセス× 1 スレッドと 1 プロセス×コア数分ス
レッドとの比較である。特に JSS においては、1 プロセス× 1 スレッド (8.22GB/s) と 1 プロセス× 4 スレッド

(9.35GB/s) の COPY 性能の差が小さい。これは 1 プロセス× 1 スレッドの場合は 1 スレッドが CPU のメモリバ
ンド幅をほぼ使い切ることができることを意味する。一方、4 プロセス× 1 スレッドはメモリバンド幅の観点から
は 1 プロセス× 1 スレッドの場合と比べて 4 倍のメモリアクセスが発生するため、相対的に 4 分の 1 のメモリバ
ンド幅と考えることができる。実際、4 プロセス× 1 スレッドでは 2.39GB/s となり、1 プロセス× 1 スレッドに比べて 1/3.44 倍である。この結果を踏まえて以下の様に考える。JSS の場合は、CPU あたり、4 コアを有し、1コアの演算性能は 10[GFLOPS]、CPU 全体でのメモリバンド幅は 40[GB/s] である。ここで 1CPU に 1 プロセス× 1 スレッドを実行すると、1 コアを使った演算であるため演算性能は 10[GFLOPS]、また CPU のメモリバンド
幅をほぼ占有できると考えると、メモリバンド幅は 40[GB/s] となるため、B/F は 40/10 = 4 と考えられる。次に1CPU に対して複数のプロセス (各プロセスは 1 スレッド) を実行する。各プロセスは 1 コアで実行されるので演算性能はプロセス数がコア数を越えない範囲では常に一定で、プロセス当たりは 10[GFLOPS] となる。一方でプロセス間でメモリバンド幅を共有することになるため、プロセス当たりのメモリバンド幅は大体プロセス数分の1 と考えられる。つまり、2 プロセスであれば 1/2、4 プロセスであれば 1/4 と考えられるので、B/F はそれぞれ
40/2/10 = 2、40/4/10 = 1 と考えられる。複数プロセスの実行によるオーバーヘッドの影響など、厳密にはこの通りにはならないが、この方法で B/F が変化した時の性能特性の傾向を見ることは可能と考える。
インテル系の CPU では、1 プロセス× 1 スレッドと 1 プロセス×コア数分スレッドとの性能差は、JSS に比べると大きく Core i7-3960X は 14.0GB/s 対 25.3GB/s、Core i7-965 は 11.1GB/s 対 14.1GB/s となり、特に Corei7-3960X は 1CPU に 1 プロセス× 1 スレッドの場合に CPU のメモリバンド幅を占有できるとは言えない。また、
コア数分プロセス× 1 スレッドと、1 プロセス× 1 スレッドの比は Core i7-3960X が 14.0GB/s 対 4.23GB/s で
1/3.31(6 コア)、Core i7-965 が 11.1GB/s 対 3.58GB/s で 1/3.10(4 コア) となり、Core i7-3960X は想定からの乖離が大きい。
以上の結果より、CPU 内のプロセス数を変化させて仮想的に B/F を変化させるという方法は、JSS および Corei7-965 に対しては定量的にもほぼ適用できると思われる。しかしながら、Core i7-3960X ではこの考え方は定量的には問題があるが、定性的な議論には利用できると思われる。

7

2.7 宇宙プラズマ５次元ブラソフコード Vlasov5 の測定評価
名古屋大学太陽地球環境研究所

2.7.1.

梅田 隆行

はじめに
希 薄 で無 衝 突 状 態 にある宇 宙 プラズマは、磁 気 流 体 力 学 、イオン運 動 論 、電 子 運 動 論 などの様 々な時 空 間 スケールで物 理 現 象 を記 述 できる。Vlasov コードは、宇 宙 プラズマの第 一 原 理
である Vlasov（無 衝 突 Boltzmann）方 程 式 と Maxwell 方 程 式 により、プラズマ中 の全 ての電 磁 ・
静 電 波 動 と荷 電 粒 子 の運 動 との相 互 作 用 を解 くシミュレーション手 法 である。Vlasov 方 程 式 は、
位 置 及 び速 度 の関 数 として表 される位 相 空 間 分 布 関 数 の 保 存 則 である。現 実 の世 界 では、位置 及 び速 度 は共 に 3 次 元 であるが、既 存 のコンピュータシステムにおいて 6 次 元 問 題 を扱 うのは困 難 であるため、Vlasov5 では実 空 間 （位 置 ）を 2 次 元 、速 度 空 間 を 3 次 元 とした 5 次 元 問 題 を扱 う。

2.7.2.

プログラム概 要
Vlasov コードは、Maxwell 方 程 式 による電 磁 場 の更 新 （field）と Vlasov 方 程 式 による分 布 関 数の更 新 から成 る。分 布 関 数 の更 新 は演 算 子 分 離 法 により Vlasov 方 程 式 を、実 空 間 （位 置 方 向 ）の 移 流 、 電 場 によ る 速 度 空 間 の 移 流 及 び 磁 場 によ る速 度 空 間 の 回 転 の ３つ の部 分 に 分 解 する。
Vlasov 方 程 式 は、演 算 子 分 離 法 により以 下 のように分 解 され、それぞれの式 が① 実 空 間 の移流 （position）、速 度 空 間 の②移 流 （velocity_e）及 び③回 転 （velocity_b）に対 応 する。

f s  f s
v   0tr
f s qs  f sE  0t ms v
f s qs   f s
(v  B )   0
t ms
v

(1)
(2)
(3)

式 (1)及 び(2)は線 形 移 流 方 程 式 であり、 演 算 子 “非 ”分 離 型 の保 存 型 解 法 を用 いる。また式(3)は回 転 流 方 程 式 であり、 back-substitution 法 と呼 ばれる演 算 子 分 離 型 の解 法 を用 いる。またこれらの方 程 式 を解 く上 で、物 理 量 の保 存 、 解 の無 振 動 性 、正 値 性 の保 証 が非 常 に重 要 であり、微 分 量 の近 似 には独 自 に開 発 した 5 次 精 度 保 存 型 無 振 動 スキームを用 いる。本 コードで採 用 している保 存 型 無 振 動 スキームでは、風 上 3 点 ・風 下 2 点 のデータが必 要 であり、
MPI_Sendrecv を用 いて 3 点 ののりしろデータを交 換 している。
電 磁 場 の各 成 分 （Ex,Ey,Ez,Bx,By,Bz）は Yee 格 子 と呼 ばれる Staggered 格 子 上 に定 義 され、
電 磁 場 の解 析 で広 く用 いられている FDTD（Finite Difference Time Domain）法 により、その時 間
発 展 を解 き進 める。本 コードでは陰 解 法 を採 用 し、逆 行 列 の計 算 には CG 法 を用 いている。並 列
計 算 時 においては、各 計 算 領 域 の境 界 値 （のりしろ）のデータの交 換 に MPI_Sendrecv を用 い、CG 法 での収 束 レベルの判 定 に MPI_Allrecude を用 いている。Maxwell 方 程 式 の計 算 負 荷 はVlasov 方 程 式 の計 算 負 荷 に対 して通 常 0.1%未 満 であるが、並 列 数 の増 加 により通 信 時 間 が増
加 した場 合 には、その負 荷 は無 視 できなくなる。

1

演 算 は、実 空 間 更 新 、速 度 空 間 更 新 、電 磁 場 更 新 の順 に行 い、速 度 空 間 更 新 は 半 時 間 ス
テップ（0.5Δt）で速 度 空 間 の移 流 、 単 時 間 ステップ（Δ t）で速 度 空 間 の回 転 を解 いた後 、 0 再
度 半 時 間 ステップ（0.5Δt）で速 度 空 間 の移 流 を解 く。

2.7.3.

測定環境
性 能 測 定 には、名 古 屋 大 学 の FX1、東 京 大 学 及 び九 州 大 学 の FX10、九 州 大 学 の CX400

及 び、理 化 学 研 究 所 の京 コンピュータを使 用 した。なお、本 測 定 は単 一 ノードで行 い、並 列 性 能の測 定 は行 わない。コンパイラオプションは以 下 のとおりである。ここで、-x250 はユーザ定 義 関 数のインライン化 用 のオプションである。-Ksimd=2 は SIMD 化 強 化 用 のオプションであるが、必 ずKvisimpact よりも後 ろにつける必 要 がある。また、-W0 以 下 は floor 関 数 強 化 用 の非 公 式 オプシ
ョンであるが、次 のコンパイラバージョンではオプションなしで関 数 の強 化 が行 われる予 定 である。
・FX1（富 士 通 コンパイラ）: -Kfast,impact,OMP –x250
・FX10/京 （富 士 通 コンパイラ）: -Kfast,visimpact,openmp, preex,simd=2 –x250-W0, -zmpa=Ailfunc-for-floor

・CX400（インテルコンパイラ）: -ip -ipo -O3 –xAVX -openmp
測 定 には３つのプロ グラムを使 用 した。 プログラム１はオリジナルのコードである。プログラム２は、プログラム１の２行 目 のループを２つに分 割 し（22 行 目 ）、ループ間 のデータの受 け渡 しに nvxp1*
nvyp1 の２次 元 作 業 配 列 を用 いている。プログラム３は、配 列 のアドレス計 算 をプログラム２において整 数 の max 関 数 を用 いて行 っていた個 所 （16-19 行 目 ）を、倍 精 度 実 数 の max 関 数 を用 いて計 算 したのちに整 数 に変 換 する（17‐21 行 目 ）コードである。

2.7.4.

測定結果
コアあたりの計 算 サイズを 40x20x30x30x30 に固 定 し、それぞれのシステムにおいて１コアを使用 した場 合 の計 測 結 果 を表 １－３に示 す。表 １－３はそれぞれプログラム１－３を用 いた計 測 結 果に対 応 している。FX1、京 及 び FX10 における実 行 性 能 はハードウェアカウンタにより計 測 されたものであり、CX400 の実 行 性 能 は FX1/京 /FX10 の計 測 データを基 に換 算 した値 である。
プログラム１では floor 関 数 と pic5 というユーザ定 義 関 数 の 2 つを呼 び出 しており、コンパイラによるループの最 適 化 が十 分 に行 われない。プログラム 2 は、ループ分 割 によって特 に負 荷 の高
いこれらの 2 つの関 数 を別 のループで呼 び出 すことにより、コンパイラによるループの最 適 化 を促進 するのが目 的 である。事 実 、FX1 や CX400 及 び、旧 Xeon プロセッサや Opteron プロセッサにおいては、実 効 効 率 が 1%以 上 向 上 した。しかしながら、京 と FX10 における実 効 効 率 の向 上 は約0.5%であった。対 してプログラム３では、max、min などの関 数 を用 いたアドレス計 算 を倍 精 度 で行うようプログラム 2 を変 更 したものである。型 変 換 の演 算 が増 えるために FX1 や CX400 ではプロ
グラム 1 に対 して性 能 が若 干 落 ちたものの、京 と FX10 においては実 効 効 率 が 3%以 上 向 上 した。
またプログラム 3 を用 いて、京 及 び FX10 におけるハイブリッド並 列 の有 効 性 を調 べた。京 においては計 算 サイズを 80x80x30x30x30 に、FX10 においては計 算 サイズを 160x80x30x30x30 に固定 し、1 ノードを使 用 してスレッド数 とプロセス数 の積 を一 定 に保 ったままスレッド数 を変 化 させた。
結 果 を表 ４，５に示 す。どちらのシステムにおいても、スレッド数 １のフラット MPI の場 合 と表 3 のシングルコアの場 合 とで、ほとんど経 過 時 間 が変 わらないところから、 Vlasov5 はメモリバンド幅 ネック
ではなく演 算 性 能 ネックのプログラムであり、そのスケーラビリティは非 常 に高 いことが分 かる。また、
2

スレッド数 が 2 または 4 の時 が最 速 であり、京 と FX10 においてはフラット MPI よりもハイブリッド並
列 が有 効 であると言 える。

2.7.5.

まとめプログラムを高 速 化 する上 で役 に立 つと思 われそうな点 を挙 げる 。
A. 組 み込 み関 数 やユーザ定 義 関 数 がループ内 に複 数 存 在 する場 合 は、ループを分 割 して ループ内 の関 数 演 算 を減 らす。
B. ループを分 割 した際 のループ間 のデータの受 け渡 しは、 最 内 側 ループの添 え 字 を含 む
2 次 元 以 下 の作 業 配 列 を用 いる。
C. 演 算 性 能 ネックのプログラムの場 合 、MPI プロセス並 列 とスレッド並 列 を組 み合 わせたハ
イブリッド並 列 がより有 効 な場 合 がある。
D. 整 数 関 数 を用 いた演 算 を実 数 演 算 に変 更 し、計 算 結 果 を整 数 に変 換 する。
E. FX1 におけるチューニングが京 ／ FX10 において効 果 があるとは限 らない。一 方 、京 とFX10 は非 常 に似 たシステムであり、どちらかでのチューニングは互 いに効 果 がある。
A 及 び B は、どの CPU においてもある程 度 効 果 のある手 法 である。一 方 C 及 び D は、京 や

FX10 においてのみ有 効 である可 能 性 が高 い。特 に D では型 変 換 の演 算 が増 えているにも関 わらず、経 過 時 間 が劇 的 に短 縮 された。

表１：プログラム１の単コア性能。
格子点数 40x20x30x30x30/core、時間ステップ 5 での結果。

システム

経過時間

実効性能

実効効率

FX1（名大）300.5sec

1.45GFlops

14.5%

FX10（東大）

262.7sec

1.93GFlops

13.1%

京（理研）

235.2sec

2.16GFlops

13.5%

CX400（九大）

103.6sec

4.59GFlops

21.2%

表２：プログラム２の単コア性能。
格子点数 40x20x30x30x30/core、時間ステップ 5 での結果。

システム

経過時間

実効性能

実効効率

FX1（名大）283.1sec

1.54GFlops

15.4%

FX10（東大）

254.9sec

1.99GFlops

13.5%

京（理研）

225.3sec

2.26GFlops

14.1%

CX400（九大）

99.5sec

4.78GFlops

22.1%

表３：プログラム３の単コア性能。
格子点数 40x20x30x30x30/core、時間ステップ 5 での結果。

3

システム

経過時間

実効性能

実効効率

FX1（名大）305.2sec

1.43GFlops

14.3%

FX10（東大）

205.4sec

2.47GFlops

16.7%

京（理研）

183.9sec

2.76GFlops

17.2%

CX400（九大）

105.0sec

4.53GFlops

21.0%

表４：京の 1 ノードにおける、ハイブリッド並列の有効性の検証。
プログラム３を使用した場合の、格子数 80x80x30x30x30、時間ステップ数 5 での結果。

スレッド数

1

2

4

8

プロセス数

8

4

2

1

経過時間

189.3 sec

187.9 sec

187.4 sec

188.9 sec

表５：FX10 の 1 ノードにおける、ハイブリッド並列の有効性の検証。
プログラム３を使用した場合の、格子数 160x80x30x30x30、時間ステップ数 5 での結果。

スレッド数

1

2

4

8

16

プロセス数

16

8

4

2

1

経過時間

205.8 sec

203.3 sec

203.3 sec

209.6 sec

211.9 sec

プログラム 1
1 do nn=2,nvzp12

uz1=vz(nn,ss);3

do mm=1,nvyp1

4

uy1=vy(mm,ss);5

do ll=2,nvxp1

6

ux1=vx(ll,ss);78vv = ux1*bbx+uy1*bby+uz1*bbz;

9sv = dsign(1.0d0,vv);10

mv = sv;

1112

mp0=mm-floor(vv);13

mp2=min(max(mp0+lv+lv,1),nvyp2);

14

mp1=min(max(mp0+lv,1),nvyp2);

15

mm1=min(max(mp0-lv,1),nvyp2);

16

mm2=min(max(mp0-lv-lv,1),nvyp2);

17
18

hp2=ff(ll,mp2,nn,ii,jj,ss);

19

hp1=ff(ll,mp1,nn,ii,jj,ss);20

hp0=ff(ll,mp0,nn,ii,jj,ss);4

29

hm1=ff(ll,mm1,nn,ii,jj,ss);30

hm2=ff(ll,mm2,nn,ii,jj,ss);

31
32
33

dfy1(ll,mm)=pic5(hp2,hp1,hp0,hm1,hm2,vv*sv)*sv;
end do34

end do35

do mm=2,nvyp1

36

ff(2:nvxp1,mm,nn,ii,jj,ss)=ff(2:nvxp1,mm,nn,ii,jj,ss) &

37
38

&

-(dfy1(2:nvxp1,mm)-dfy1(2:nvxp1,mm-1))

end do42 end doプログラム 2
1 do nn=2,nvzp12

uz1=vz(nn,ss);3

do mm=1,nvyp1

4

uy1=vy(mm,ss);5

do ll=2,nvxp1

6

ux1=vx(ll,ss);78vv = ux1*bbx+uy1*bby+uz1*bbz;

9sv = dsign(1.0d0,vv);10

mv = sv;

1112

ty_vv(ll,mm)=vv;

13

ty_sv(ll,mm)=sv;

1415mmp0(ll,mm)=mm-floor(vv);16

mmp2(ll,mm)=min(max(mmp0(ll,mm)+lv+lv,1),nvyp2);

17

mmp1(ll,mm)=min(max(mmp0(ll,mm)+lv,1),nvyp2);

18

mmm1(ll,mm)=min(max(mmp0(ll,mm)-lv,1),nvyp2);

19

mmm2(ll,mm)=min(max(mmp0(ll,mm)-lv-lv,1),nvyp2);

20

end do21

end do22

do mm=1,nvyp1

23

do ll=2,nvxp1

24

hp2=ff(ll,mmp2(ll,mm),nn,ii,jj,ss);25

hp1=ff(ll,mmp1(ll,mm),nn,ii,jj,ss);

26

hp0=ff(ll,mmp0(ll,mm),nn,ii,jj,ss);5

27

hm1=ff(ll,mmm1(ll,mm),nn,ii,jj,ss);28

hm2=ff(ll,mmm2(ll,mm),nn,ii,jj,ss);29
30

vv = ty_vv(ll,mm)

31

sv = ty_sv(ll,mm)

32
33
34

dfy1(ll,mm)=pic5(hp2,hp1,hp0,hm1,hm2,vv*sv)*sv;
end do35

end do36

do mm=2,nvyp1

37

ff(2:nvxp1,mm,nn,ii,jj,ss)=ff(2:nvxp1,mm,nn,ii,jj,ss) &

38
39

&

-(dfy1(2:nvxp1,mm)-dfy1(2:nvxp1,mm-1))

end do40 end doプログラム 3
1 wnvyp2=nvyp2
2 do nn=2,nvzp1
3

uz1=vz(nn,ss);4

do mm=1,nvyp1

5

uy1=vy(mm,ss);6

do ll=2,nvxp1

7

ux1=vx(ll,ss);89vv = ux1*bbx+uy1*bby+uz1*bbz;

10sv = dsign(1.0d0,vv);11

mv = sv;

12
13

ty_vv(ll,mm)=vv;

14

ty_sv(ll,mm)=sv;

15
16mmp0(ll,mm)=mm-floor(vv);17

wmmp0=mmp0(ll,mm)18

mmp2(ll,mm)=min(max(wmmp0+sv+sv,1.0d0),wnvyp2);

19

mmp1(ll,mm)=min(max(wmmp0+sv,1.0d0),wnvyp2);

20

mmm1(ll,mm)=min(max(wmmp0-sv,1.0d0),wnvyp2);

21

mmm2(ll,mm)=min(max(wmmp0-sv-sv,1.0d0),wnvyp2);

22
23

end doend do6

2425

do mm=1,nvyp1
do ll=2,nvxp1

26

hp2=ff(ll,mmp2(ll,mm),nn,ii,jj,ss);27

hp1=ff(ll,mmp1(ll,mm),nn,ii,jj,ss);

28

hp0=ff(ll,mmp0(ll,mm),nn,ii,jj,ss);29

hm1=ff(ll,mmm1(ll,mm),nn,ii,jj,ss);30

hm2=ff(ll,mmm2(ll,mm),nn,ii,jj,ss);

31
32

vv = ty_vv(ll,mm)

33

sv = ty_sv(ll,mm)

34
35
36

dfy1(ll,mm)=pic5(hp2,hp1,hp0,hm1,hm2,vv*sv)*sv;
end do37

end do38

do mm=2,nvyp1

39

ff(2:nvxp1,mm,nn,ii,jj,ss)=ff(2:nvxp1,mm,nn,ii,jj,ss) &

40
41

&

-(dfy1(2:nvxp1,mm)-dfy1(2:nvxp1,mm-1))

end do42 end do

7

測定結果と性能比較
 FX1、京、FX10での測定結果
Loop内訳の測定結果から、Velocityのチューニングが必要と判断しVelocityのチューニングを行った。
FX1の測定結果から、浮動小数点演算待ちが発生していたので、SMTを使用。4→8thで2倍近くスケールしており、SMTの効果が高い。

チューニングが必要

SMTを使用

スケーラビリティ良好

FX1
京
FX10
実行時間 スケール Thread 実行時間 スケール Thread 実行時間 スケール
934.93 1.00
1th 871.39
1.00
1th 941.91
1.00
404.94 2.31
8th 127.90
6.81 16th
64.91
14.51
212.13 4.41------------660.59 1.00
1th 690.55
1.00
1th 749.86
1.00
281.10 2.35
8th
92.11
7.50 16th
48.57
15.44
143.12 4.62------------274.34 1.00
1th 180.83
1.00
1th 192.04
1.00
123.84 2.22
8th
35.78
5.05 16th
16.33
11.76
68.98 3.98-------------

Thread
1th
4th
Loop
8th
1th
Loop内訳
4th(Velocity)
8th
1th
Loop内訳
4th(Position)
8th

FX10 (チューニング)
Thread 実行時間 スケール
1th
768.10
1.00
16th
53.95
14.24
------1th
588.19
1.00
16th
38.55
15.26
------1th
179.91
1.00
16th
15.39
11.69
-------

Copyright 2013 FUJITSU LIMITED

FX1比の京とFX10の性能
 FX1比 16thのスケーラビリティが良好で、性能比(FX1比)が6.24倍になっている。
 1th で浮動小数点演算待ちがあり、性能比(FX1比)が0.99倍である。
 チューニングした結果、FX1とのピーク性能比が、1ｔｈで1.2倍程度になり、FX1を上回った。
ThreadLoop
Loop内訳(Velocity)
Loop内訳(Position)

1th
4th
8th
1th
4th
8th
1th
4th
8th

FX1

Thread
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00

1th
8th
1th
8th
1th
8th

京

Thread
1.07
3.17
1.66
0.96
3.05
1.55
1.52
3.46
1.93

1th
16th
1th
16th
1th
16th

FX10
0.99
6.24
3.27
0.88
5.79
2.95
1.43
7.58
4.22

FX10 (チュー
ニング)
1th
1.22
7.51
16th
3.93
1th
1.12
7.29
16th
3.71
1th
1.52
8.05
16th
4.48

ThreadCopyright 2013 FUJITSU LIMITEDプロファイラ情報 プロファイラのコスト情報の抜粋○FX10 プロファイラデータ 抜粋 (1p16th Thread 0)_____________________________________________________________________________________________
Procedures profile
Cost%
Barrier%StartEnd------------------------------------------------------------6500
100.0000100.1538--------------------------------------------------------------2489
38.292330.1205434
777
1950
30.0000
30.1538259
771
1420
21.846230.211395
609
333
5.123100.0000---Thread0velocity.velocity_b._OMP_2_ ①
velocity.velocity_e._OMP_1_ ②
position.position_2d._OMP_2___f_flord_____________________________________________________________________________________________
Loops profile
Cost%
Barrier
%
Nest
Kind
Exec
Start
End
-------------------------------------------------------------------------------------6500
100.0000100.1538------------------------------------------------------------------------------------------965
14.846200.00006
DOOpenMP
314
387
617
9.492300.0000
6 DO
OpenMP
151
243
253
3.892300.0000
6 DO
OpenMP
630
650
249
3.830800.0000
6 DO
OpenMP
467
487
227
3.492300.0000
6 DO
OpenMP
508
528
221
3.400000.0000
6 DO
OpenMP
548
568
208
3.200000.0000
6 DO
OpenMP
670
690
188
2.892300.0000
6 DO
OpenMP
589
609
155
2.384600.0000
6 DO
OpenMP
277
284

Thread0velocity.velocity_e._OMP_1_ ②Loop21
position.position_2d._OMP_2_
velocity.velocity_b._OMP_2_ ①Loop15
velocity.velocity_b._OMP_2_ ①Loop11
velocity.velocity_b._OMP_2_ ①Loop12
velocity.velocity_b._OMP_2_ ①Loop13
velocity.velocity_b._OMP_2_ ①Loop16
velocity.velocity_b._OMP_2_ ①Loop14
velocity.velocity_e._OMP_1_ ②

Copyright 2013 FUJITSU LIMITED

PA情報(手続き単位・ループ単位)

velocity.velocity_b._OMP_2_ ①、
velocity.velocity_e._OMP_1_ ②共に「浮動小数点演算待ち」が多いため、命令スケジューリングのチューニングが必要⇒ループの最適化状況の確認

浮動小数点演算待ち

Copyright 2013 FUJITSU LIMITED

ループの最適化状況(SIMD,SWPL)
 各ループの最適化状況
 各ループのSIMDとSWPLの状況を以下にまとめた。
• 全てのループでSWPL化がされていない。
○チューニング対象区間の最適化状況

マスク付きSIMD(-Ksimd=2)

手続き名
line番号SIMD SWPL-----------------------------------------------------------------------------------velocity.velocity_b._OMP_2_ ①Loop11
467 - 487○
×(floor関数のcallあり)
velocity.velocity_b._OMP_2_ ①Loop12
508 - 528○
×(floor関数のcallあり)
velocity.velocity_b._OMP_2_ ①Loop13
548 - 568○
×(floor関数のcallあり)
velocity.velocity_b._OMP_2_ ①Loop14
589 - 609○
×(floor関数のcallあり)
velocity.velocity_b._OMP_2_ ①Loop15
630 - 650○
×(floor関数のcallあり)
velocity.velocity_b._OMP_2_ ①Loop16
670 - 690○
×(floor関数のcallあり)
velocity.velocity_e._OMP_1_ ②Loop21
314 - 387
×
×(if文あり)Copyright 2013 FUJITSU LIMITED

チューニング内容
 velocity_b ⇒ チューニング１
SWPL化を促進することにより、「浮動小数点演算待ち」を解消する。
以下の 2つのチューニングを行った。
 SWPLの阻害要因となっていた関数call(floor関数)のインライン展開(※)を行った。
（※） 現在、開発版コンパイラでのみで実装されている。(将来的に実装される予定)
 function pic5のインライン展開を行っているため、ループ内の命令数が多くSWPLできなかった。そのため、ループ内の命令数を減らす、ループ分割を行った。
チューニング方法は、添付資料の（チューニング１のオリジナルソース）と（チューニング１のチューニングソース）を参照して下さい。

 velocity_e ⇒ チューニング２
SWPL化を促進することにより、「浮動小数点演算待ち」を解消する。
以下のチューニングを行った。
 ループ内の命令数が多くSWPLできなかった。
そのため、ループ内の命令数を減らす、ループ分割を行った。
チューニング方法は、添付資料の（チューニング２のオリジナルソース）と（チューニング２のチューニングソース）を参照して下さい。
Copyright 2013 FUJITSU LIMITEDチューニング１、２
 チューニング１ (velocity.velocity_b._OMP_2_ ①)○チューニング対象区間の最適化状況
手続き名
line番号SIMD SWPL
チューニング後----------------------------------------------------------------------------------------------------velocity.velocity_b._OMP_2_ ①Loop11
467 - 487○
×(floor関数のcallあり) → SWPL ○velocity.velocity_b._OMP_2_ ①Loop12
508 - 528○
×(floor関数のcallあり) → SWPL ○velocity.velocity_b._OMP_2_ ①Loop13
548 - 568○
×(floor関数のcallあり) → SWPL ○velocity.velocity_b._OMP_2_ ①Loop14
589 - 609○
×(floor関数のcallあり) → SWPL ○velocity.velocity_b._OMP_2_ ①Loop15
630 - 650○
×(floor関数のcallあり) → SWPL ○velocity.velocity_b._OMP_2_ ①Loop16
670 - 690○
×(floor関数のcallあり) → SWPL ○マスク付きSIMD(-Ksimd=2)

 チューニング２ (velocity.velocity_e._OMP_1_ ②)
マスク付きSIMD(-Ksimd=2)○チューニング後の分割ループの最適化状況

手続き名
line番号SIMD SWPL
チューニング後----------------------------------------------------------------------------------------------------velocity.velocity_e._OMP_1_ ②Loop211○○
velocity.velocity_e._OMP_1_ ②Loop212○○
velocity.velocity_e._OMP_1_ ②Loop213
××

Copyright 2013 FUJITSU LIMITED

チューニング１の結果(velocity.velocity_b._OMP_2_ ①)
 チューニング１の結果
オリジナル

[秒]
6.0E+00

チューニング

5.0E+00

1.3倍程度の改善効果

4.0E+00
3.0E+00
2.0E+00
1.0E+00

浮動小数点演算待ち

0.0E+00
Loop11Loop12Loop13Loop14Loop15Loop16Loop11Loop12Loop13Loop14Loop15Loop16
P er f or m a nc e

Loop11
Loop12
Loop13
Loop14Loop15Loop16Loop11
Loop12
Loop13
Loop14Loop15Loop16

SIMD

実行時間
(sec)

改善効果

浮動小数
点演算
ピーク比

5.15
4.71
4.32
4.35
4.76
4.76
3.81
3.73
3.34
3.30
3.65
3.59

1.00
1.00
1.00
1.00
1.00
1.00
1 .3 5
1 .2 6
1 .2 91 .3 2
1 .3 0
1 .3 3

5.97%
6.52%
7.12%
7.34%
6.70%
6.71%
8.26%
8.44%
9.39%
9.90%
8.97%
9.12%

MFLOPS

955
1043
1139
1175
1073
1074
1322
1350
1502
1583
1435
1459

MIPS

SIMD命令
率
(/有効総
命令数)

浮動小数
点演算数

2225
2074
2307
2316
2079
2088
2484
2541
2780
2823
2622
2669

4.92E+09
4.91E+09
4.92E+09
5.12E+09
5.11E+09
5.12E+09
5.04E+09
5.04E+09
5.02E+09
5.22E+09
5.24E+09
5.24E+09

L1D ミス
dm率(/L1D ミス数)92.41%
99.26%
13.15%
12.86%
98.95%
71.25%
78.54%
99.23%
32.09%
27.95%
99.03%
76.22%

L1D ミスhwpf 率(/L1D ミ
ス数)
7.55%
0.70%
86.80%
87.09%
1.00%
28.72%
21.42%
0.75%
67.87%
72.01%
0.95%
23.74%

Loop11
Loop12
Loop13
Loop14Loop15Loop16Loop11
Loop12
Loop13
Loop14Loop15Loop1623.08%
27.08%
26.76%
28.11%
28.42%
28.29%
27.71%
27.67%
28.23%
30.14%
29.31%
29.28%SIMD命令 SIMD演算 SIMDロー SIMDスト
ア命令率
ド命令率
命令率
率
(/SIMD対 (/SIMD対 (/SIMD対 (/SIMD対
象ロード 象ストア命
象演算命
象命令
令数)
命令数)
令数)
数）
68.76%
78.78%
50.80%
42.62%
68.92%
79.05%
50.81%
42.62%
69.72%
78.80%
54.51%
42.62%
72.93%
82.33%
57.18%
44.26%
72.14%
82.60%
53.42%
44.26%
71.97%
82.31%
53.42%
44.26%
71.06%
85.26%
51.92%
21.23%
71.06%
85.26%
51.92%
21.23%
71.90%
85.21%
56.07%
21.23%
75.90%
89.20%
61.27%
23.03%
75.04%
89.24%
56.80%
23.03%
75.04%
89.24%
56.80%
23.03%

C a cheL1I ミス率(/有効総命令数)

Loop11
Loop12
Loop13
Loop14Loop15Loop16Loop11
Loop12
Loop13
Loop14Loop15Loop16

0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%

L1D ミス率(/ロード・
ストア数)
0.21%
0.19%
0.14%
0.14%
0.15%
0.16%
0.15%
0.30%
0.19%
0.18%
0.24%
0.15%

ロード・ス
トア数

L1D ミス
数

2.27E+09
2.26E+09
2.33E+09
2.37E+09
2.30E+09
2.30E+09
2.44E+09
2.45E+09
2.19E+09
2.20E+09
2.53E+09
2.53E+09

4.67E+06
4.21E+06
3.27E+06
3.26E+06
3.40E+06
3.69E+06
3.76E+06
7.29E+06
4.13E+06
4.03E+06
6.16E+06
3.75E+06

L1D ミス
swpf 率(/L1D ミ
ス数)
0.04%
0.04%
0.05%
0.05%
0.05%
0.03%
0.04%
0.02%
0.04%
0.04%
0.02%
0.03%

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

L2 ミス数

0.15%
0.01%
0.00%
0.00%
0.00%
0.00%
0.14%
0.01%
0.00%
0.00%
0.00%
0.00%

3.38E+06
2.42E+05
2.51E+04
2.38E+04
2.48E+04
4.07E+04
3.44E+06
1.76E+05
2.62E+04
2.03E+04
2.16E+04
3.18E+04

L2 ミス
L2 ミス pf
メモリス
dm 率
率
ループット
(/L2 ミス(/L2 ミス(GB/sec)数)
数)69.22%
30.78%
0.15
84.91%
15.09%
0.01
59.47%
40.53%
0.00
60.54%
39.46%
0.00
60.94%
39.06%
0.00
40.51%
59.49%
0.00
54.62%
45.38%
0.21
78.83%
21.17%
0.01
42.93%
57.07%
0.00
60.33%
39.67%
0.00
59.82%
40.18%
0.00
47.99%
52.01%
0.00

L2 スループット(GB/sec)
0.12
0.11
0.10
0.10
0.09
0.10
0.13
0.25
0.16
0.16
0.22
0.13

Copyright 2013 FUJITSU LIMITEDチューニング２の結果(velocity.velocity_e._OMP_1_ ②)
 チューニング２の結果[秒]
1.8E+01

オリジナル

チューニングLoop21の分割後の内訳

1.6E+01
1.4E+01
1.2E+01

1.3倍程度の改善効果

1.0E+01
8.0E+00
6.0E+00
4.0E+00
2.0E+00
0.0E+00-2.0E+00

Loop21

Loop21

Loop211

Loop212Loop213

Per for ma nce

S IMD

実行時間
改善効果
(sec)

Loop21
Loop21 tune
Loop211 tune
Loop212 tune
Loop213 tune
C a che

16.76
12.89
4.54
4.53
3.72

1.00
1 .3 0

浮動小数
点演算
ピーク比

MFLOPS

8.64%
15.40%
11.69%
23.43%
10.57%

1383
2464
1870
3749
1692

MIPS

2336
2766
3264
2734
2239

浮動小数
点演算数
2.32E+10
3.18E+10
8.49E+09
1.70E+10
6.29E+09

SIMD命令 SIMD演算 SIMDロー SIMDスト
SIMD命令率
命令率
ド命令率 ア命令率
率(/SIMD対 (/SIMD対 (/SIMD対 (/SIMD対
(/有効総
象命令
象演算命 象ロード 象ストア命
命令数)
数）
令数)
命令数)
令数)
Loop21
0.00%
0.00%
0.00%
0.00%
0.00%
Loop21 tun
37.25%
64.06%
74.26%
35.82%
20.00%
29.33%
91.20%
100.00%40.45%
100.00%Loop211 tu
72.16%
100.00%100.00%99.98%
100.00%Loop212 tu
0.00%
0.00%
0.00%
0.00%
0.00%
Loop213 tu

L1D ミス
L1D ミス L1D ミス L1D ミス
L2 ミス L2 ミス pf
L1I ミス率L2 ミス率メモリス L2 スルー率
ロード・ス L1D ミス
dm率
hwpf 率swpf 率dm 率
率(/有効総(/ロード・ L2 ミス数
ループット
プット
(/ロード・
トア数
数(/L1D ミ (/L1D ミ (/L1D ミ(/L2 ミス (/L2 ミス
命令数)
ストア数)
(GB/sec) (GB/sec)
ストア数)
ス数)
ス数)
ス数)
数)
数)
Loop210.00%
2.09% 4.39E+09 9.17E+07
13.49%
59.79%
26.73%
0.64% 2.82E+07
2.39%
97.61%
0.39
0.70
Loop21 tune
0.06%
2.24% 7.09E+09 1.59E+08
23.28%
76.55%
0.16%
0.44% 3.09E+07
1.92%
98.08%
0.55
1.58
0.02%
0.89% 1.73E+09 1.54E+07
19.59%
80.06%
0.35%
0.02% 3.75E+05
40.60%
59.40%
0.02
0.43
Loop211 tune
0.13%
2.19% 2.33E+09 5.09E+07
18.16%
81.64%
0.20%
0.27% 6.22E+06
2.21%
97.79%
0.32
1.44
Loop212 tune
Loop213 tune
0.01%
3.06% 2.99E+09 9.13E+07
26.28%
73.68%
0.04%
0.81% 2.42E+07
1.17%
98.83%
1.50
3.14
Copyright 2013 FUJITSU LIMITED

まとめ チューニング
 「浮動小数点演算待ち」が性能ネックになっていた。そのため、インライン展開とループ分割を行うことで、 SWPL化を促進した。
結果、velocity_bとvelocity_eで、1.3倍程度のチューニング効果を確認した。
 FX1にチューニング結果を反映した場合• マスク付きSIMDがないため、if文があるループは、SWPL化が出来ない。そのため、 「浮動小数点演算待ち」が解消できない。
• インライン展開した場合、倍精度浮動小数点レジスタ数がFX1(32)とFX10(256)の違いがある。そのため、FX1ではspill/fill(*)のオーバーヘッドが発生してチューニン
グ効果が出ないことが考えられる。
(*) レジスタの内容をキャッシュにストア(退避) して、再度必要となった時点でキャッシュからレジスタにロード（復元）する
spill/fill処理が必要となる。そのため、無駄なロード、ストアが必要となるので、性能が低下してしまう。

 FX10の性能
 FX1比• １コア性能比では、ピーク性能比1.47に対して、1.22であり若干届かない。
• 1チップ性能比では、ピーク性能比5.87に対して7.51であり、問題ない。

 スケーラビリティ(FX10)• 16スレッド並列時に14.51倍のスケーラビリティが出ていて、良好である。
Copyright 2013 FUJITSU LIMITED添付資料（チューニング１のオリジナルソース）
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491

4
4
5
5
5
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
5
5
5
4

p
p
p
p

do mm=2,nvyp1
uy1=vy(mm,ss);
do ll=2,nvxp1
ux1=vx(ll,ss);!ocl noswp

p
p

v
v

p
p
p

v
v
v

vv = ux1*bbx+uy1*bby+uz1*bbz;
sv = dsign(1.0d0,vv);
nv = sv;

p
p
p
p
p

v
v
v
v
v

np0=nn-floor(vv);
np2=min(max(np0+nv+nv,1),nvzp2);
np1=min(max(np0+nv ,1),nvzp2);
nm1=min(max(np0-nv ,1),nvzp2);
nm2=min(max(np0-nv-nv,1),nvzp2);

p
p
p
p
p

v
v
v
v
v

hp2=ff(ll,mm,np2,ii,jj,ss);
hp1=ff(ll,mm,np1,ii,jj,ss);
hp0=ff(ll,mm,np0,ii,jj,ss);
hm1=ff(ll,mm,nm1,ii,jj,ss);
hm2=ff(ll,mm,nm2,ii,jj,ss);

pi v
p
v
p 6v
p
p

do nn=1,nvzp1
uz1=vz(nn,ss);dfz1(nn)=pic5(hp2,hp1,hp0,hm1,hm2,vv*sv)*sv;
end doff(ll,mm,2:nvzp1,ii,jj,ss)=ff(ll,mm,2:nvzp1,ii,jj,ss) &&-(dfz1(2:nvzp1)-dfz1(1:nvz));end doend doCopyright 2013 FUJITSU LIMITED

添付資料（チューニング１のチューニングソース）
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571

6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
5
6
6
6
6
6
6
6
6
6
6
6
6
5
5
5
4

p
p

v
v

p
p
p

v
v
v

vv = ux1*bbx+uy1*bby+uz1*bbz;
sv = dsign(1.0d0,vv);
nv = sv;

p
pv
v

w_nvv(nn) = vv;
w_nsv(nn) = sv;

p
p
p
p
p

v
v
v
v
v

np0=nn-floor(vv);
np2=min(max(np0+nv+nv,1),nvzp2);
np1=min(max(np0+nv ,1),nvzp2);
nm1=min(max(np0-nv ,1),nvzp2);
nm2=min(max(np0-nv-nv,1),nvzp2);

p
p
p
p
p
p

v
v
v
v
v
v

p
p
p
p
p
p

v
v
v
v
v
v

p
p

v
v

pi v
p
v
p 6v
p
p

do nn=1,nvzp1
uz1=vz(nn,ss);

w_nhp2(nn)=ff(ll,mm,np2,ii,jj,ss);
w_nhp1(nn)=ff(ll,mm,np1,ii,jj,ss);
w_nhp0(nn)=ff(ll,mm,np0,ii,jj,ss);
w_nhm1(nn)=ff(ll,mm,nm1,ii,jj,ss);
w_nhm2(nn)=ff(ll,mm,nm2,ii,jj,ss);
end do!ocl loop_nofusion
do nn=1,nvzp1
hp0=w_nhp0(nn);
hp2=w_nhp2(nn);
hp1=w_nhp1(nn);hm1=w_nhm1(nn);hm2=w_nhm2(nn);ループ分割

vv = w_nvv(nn);sv = w_nsv(nn);dfz1(nn)=pic5(hp2,hp1,hp0,hm1,hm2,vv*sv)*sv;
end doff(ll,mm,2:nvzp1,ii,jj,ss)=ff(ll,mm,2:nvzp1,ii,jj,ss) &&-(dfz1(2:nvzp1)-dfz1(1:nvz));end doend doCopyright 2013 FUJITSU LIMITED添付資料（チューニング２のオリジナルソース）
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351

4
5
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6

p
do nn=1,nvzp2
p
do mm=1,nvyp2
p s
do ll=1,nvxp2
p v
hp0 = ff(ll,mm,nn,ii,jj,ss);p v
hhi =ffi(ll,mm,nn);
p
p
p
p
p

v
v
v
v
v

lp0=ll;lp2=max(min(lp0+lv+lv,nvxp2),1);
lp1=max(min(lp0+lv ,nvxp2),1);lm1=min(max(lp0-lv ,1),nvxp2);
lm2=min(max(lp0-lv-lv,1),nvxp2);

p
p
p
p

v
v
v
v

hp2=ff(lp2,mm,nn,ii,jj,ss);
hp1=ff(lp1,mm,nn,ii,jj,ss);
hm1=ff(lm1,mm,nn,ii,jj,ss);
hm2=ff(lm2,mm,nn,ii,jj,ss);

pi v

gfx=pic5(hp2,hp1,hp0,hm1,hm2,vvx*ssx)*ssx;

p
p
p
p
p

v
v
v
v
v

mp0=mm;
mp2=max(min(mp0+mv+mv,nvyp2),1);
mp1=max(min(mp0+mv ,nvyp2),1);
mm1=min(max(mp0-mv ,1),nvyp2);
mm2=min(max(mp0-mv-mv,1),nvyp2);

p
p
p
p

v
v
v
v

hp2=ff(ll,mp2,nn,ii,jj,ss);
hp1=ff(ll,mp1,nn,ii,jj,ss);
hm1=ff(ll,mm1,nn,ii,jj,ss);
hm2=ff(ll,mm2,nn,ii,jj,ss);

pi v

gfy=pic5(hp2,hp1,hp0,hm1,hm2,vvy*ssy)*ssy;

p
p
p
p
p

np0=nn;np2=max(min(np0+nv+nv,nvzp2),1);
np1=max(min(np0+nv ,nvzp2),1);
nm1=min(max(np0-nv ,1),nvzp2);
nm2=min(max(np0-nv-nv,1),nvzp2);

v
v
v
v
v

352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389

6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
5
4

p
p
p
p

v
v
v
v

hp2=ff(ll,mm,np2,ii,jj,ss);
hp1=ff(ll,mm,np1,ii,jj,ss);
hm1=ff(ll,mm,nm1,ii,jj,ss);
hm2=ff(ll,mm,nm2,ii,jj,ss);

pi v

gfz=pic5(hp2,hp1,hp0,hm1,hm2,vvz*ssz)*ssz;

p
p
p
p

v
v
v
v

gfxy = dabs(gfx*hhi*gfy)*0.5d0;gfyz = dabs(gfy*hhi*gfz)*0.5d0;gfzx = dabs(gfz*hhi*gfx)*0.5d0;gfxyz = dabs(gfx*hhi*gfy*hhi*gfz)*inv3;

p
p
p
p
p
p

v
v
v
v
v
v

l1 = ll+l0;
l2 = ll+lv;
m1 = mm+m0;
m2 = mm+mv;
n1 = nn+n0;
n2 = nn+nv;

p
p
p
p

v
v
v
v

dfx(l1,mm,nn) = dfx(l1,mm,nn) + gfx - (gfxy+gfzx-gfxyz)*ssx;
dfx(l1,m2,nn) = dfx(l1,m2,nn) +(gfxy-gfxyz)*ssx;
dfx(l1,mm,n2) = dfx(l1,mm,n2) +(gfzx-gfxyz)*ssx;
dfx(l1,m2,n2) = dfx(l1,m2,n2) + gfxyz*ssx;

p
p
p
p

m
m
m
m

dfy(ll,m1,nn) = dfy(ll,m1,nn) + gfy - (gfxy+gfyz-gfxyz)*ssy;
dfy(l2,m1,nn) = dfy(l2,m1,nn) +(gfxy-gfxyz)*ssy;
dfy(ll,m1,n2) = dfy(ll,m1,n2) +(gfyz-gfxyz)*ssy;
dfy(l2,m1,n2) = dfy(l2,m1,n2) + gfxyz*ssy;

p
p
p
p
p
p
p

m
m
m
m
v

dfz(ll,mm,n1) = dfz(ll,mm,n1) + gfz - (gfzx+gfyz-gfxyz)*ssz;
dfz(l2,mm,n1) = dfz(l2,mm,n1) +(gfzx-gfxyz)*ssz;
dfz(ll,m2,n1) = dfz(ll,m2,n1) +(gfyz-gfxyz)*ssz;
dfz(l2,m2,n1) = dfz(l2,m2,n1) + gfxyz*ssz;
end doend doend doCopyright 2013 FUJITSU LIMITED

添付資料（チューニング２のチューニングソース）
319
323
324
325
327
328
329
330
331
332
333
334
335
336
337
338
339
340
345
346
347
348
349
350
351
352
353
354
355
356
357
358
360
361
362
363
364
365
366
367
368
369
370

4
5
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
5
4
4
4
4
4
5
5
5
5
5
5
5
6
6
6
6
6
6
6
6
6
5
6
6
6

p
p
p
p
p
p
p
p
p

do nn=1,nvzp2
do mm=1,nvyp2v
do ll=1,nvxp2v
hp0 = ff(ll,mm,nn,ii,jj,ss);v
lp0=ll;v
lp2=max(min(lp0+lv+lv,nvxp2),1);v
lp1=max(min(lp0+lv ,nvxp2),1);v
lm1=min(max(lp0-lv ,1),nvxp2);v
lm2=min(max(lp0-lv-lv,1),nvxp2);

p
p
p
p

v
v
v
v

pi v
p v
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p

hp2=ff(lp2,mm,nn,ii,jj,ss);
hp1=ff(lp1,mm,nn,ii,jj,ss);
hm1=ff(lm1,mm,nn,ii,jj,ss);
hm2=ff(lm2,mm,nn,ii,jj,ss);

w_gfx(ll,mm)=pic5(hp2,hp1,hp0,hm1,hm2,vvx*ssx)*ssx;
end doend donp0=nn;np2=max(min(np0+nv+nv,nvzp2),1);
np1=max(min(np0+nv ,nvzp2),1);
nm1=min(max(np0-nv ,1),nvzp2);
nm2=min(max(np0-nv-nv,1),nvzp2);
do mm=1,nvyp2
mp0=mm;
mp2=max(min(mp0+mv+mv,nvyp2),1);
mp1=max(min(mp0+mv,nvyp2),1);
mm1=min(max(mp0-mv,1),nvyp2);
mm2=min(max(mp0-mv-mv,1),nvyp2);!ocl loop_nofusionv
do ll=1,nvxp2v
hp0 = ff(ll,mm,nn,ii,jj,ss);v
hp2=ff(ll,mp2,nn,ii,jj,ss);v
hp1=ff(ll,mp1,nn,ii,jj,ss);v
hm1=ff(ll,mm1,nn,ii,jj,ss);v
hm2=ff(ll,mm2,nn,ii,jj,ss);

pi v
p v

ループ分割

w_gfy(ll,mm)=pic5(hp2,hp1,hp0,hm1,hm2,vvy*ssy)*ssy;
end do!ocl loop_nofusion
p v
do ll=1,nvxp2
p v
hp0 = ff(ll,mm,nn,ii,jj,ss);

371
372
373
374
375
376
377
378
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
425

6
6
6
6
6
6
6
5
4
5
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
5
4

p
p
p
p

v
v
v
v

hp2=ff(ll,mm,np2,ii,jj,ss);
hp1=ff(ll,mm,np1,ii,jj,ss);
hm1=ff(ll,mm,nm1,ii,jj,ss);
hm2=ff(ll,mm,nm2,ii,jj,ss);

pi v
p v
p

w_gfz(ll,mm)=pic5(hp2,hp1,hp0,hm1,hm2,vvz*ssz)*ssz;
end doend do!ocl loop_nofusionp
do mm=1,nvyp2
p 2s
do ll=1,nvxp2
p 2v
hhi =ffi(ll,mm,nn);
p 2v
p 2v
p 2v

gfx=w_gfx(ll,mm)
gfy=w_gfy(ll,mm)
gfz=w_gfz(ll,mm)

p 2v
p 2v
p 2v
p 2v

gfxy = dabs(gfx*hhi*gfy)*0.5d0;gfyz = dabs(gfy*hhi*gfz)*0.5d0;gfzx = dabs(gfz*hhi*gfx)*0.5d0;gfxyz = dabs(gfx*hhi*gfy*hhi*gfz)*inv3;

p 2v
p 2v
p 2v
p 2v
p 2v
p 2v
p 2v
p 2v
p 2v
p 2v

l1 = ll+l0;
l2 = ll+lv;
m1 = mm+m0;
m2 = mm+mv;
n1 = nn+n0;
n2 = nn+nv;
dfx(l1,mm,nn) = dfx(l1,mm,nn) + gfx - (gfxy+gfzx-gfxyz)*ssx;
dfx(l1,m2,nn) = dfx(l1,m2,nn) +(gfxy-gfxyz)*ssx;
dfx(l1,mm,n2) = dfx(l1,mm,n2) +(gfzx-gfxyz)*ssx;
dfx(l1,m2,n2) = dfx(l1,m2,n2) + gfxyz*ssx;

p 2m
p 2m
p 2m
p 2m

dfy(ll,m1,nn) = dfy(ll,m1,nn) + gfy - (gfxy+gfyz-gfxyz)*ssy;
dfy(l2,m1,nn) = dfy(l2,m1,nn) +(gfxy-gfxyz)*ssy;
dfy(ll,m1,n2) = dfy(ll,m1,n2) +(gfyz-gfxyz)*ssy;
dfy(l2,m1,n2) = dfy(l2,m1,n2) + gfxyz*ssy;

p 2m
p 2m
p 2m
p 2m
p 2v
p
p

dfz(ll,mm,n1) = dfz(ll,mm,n1) + gfz - (gfzx+gfyz-gfxyz)*ssz;
dfz(l2,mm,n1) = dfz(l2,mm,n1) +(gfzx-gfxyz)*ssz;
dfz(ll,m2,n1) = dfz(ll,m2,n1) +(gfyz-gfxyz)*ssz;
dfz(l2,m2,n1) = dfz(l2,m2,n1) + gfxyz*ssz;
end doend doend doCopyright 2013 FUJITSU LIMITED測定結果と性能比較
 FX10での測定結果
 チューニングの結果、評価区間(Loop)の実行時間が271.14秒 から 225.18秒 へ約20％の向上しました。
 スケーラビリティーも16スレッドで14倍以上出ていて良好である。
FX10
オリジナルソース

Loop
Loop内訳（Velocity）
Loop内訳（Position）

FX10
チューニングソース

Thread

実行時間
(秒)

スケール

Thread

実行時間
(秒)

スケール

1th

3889.41

1.00

1th3256.10

1.00

16th

271.14

14.34

16th

225.18２０％
14.46 向上1th

2960.60

1.00

1th

2390.64

1.00

16th

195.45

15.14

16th

154.9415.43

1th928.801.00

1th865.46

1.00

16th

75.69

12.27

16th

70.24

12.32
Copyright 2013 FUJITSU LIMITED

プロファイラ情報 プロファイラのコスト情報の抜粋
FX10 プロファイラデータ 抜粋 (1p16th Thread 0)_____________________________________________________________________________________________

Procedures profile
Cost% Operation (S) Barrier% StartEnd----------------------------------------------------------------14487655 100.0000
144845.8906 1541201 10.6380------------------------------------------------------------------6210912 42.8704
62095.9766 466938 7.5180
546
1021
4223273 29.1508
42223.7930 227818 5.3943
263
1021
3847651 26.5581
38468.3672 838344 21.7885
90
593
38872 0.2683
388.6378
7450 19.1655
311
331

Application
velocity.velocity_b._OMP_2_
velocity.velocity_e._OMP_1_
position.position_2d._OMP_2_
init_harris.init_dist._OMP_3_

velocityとpositionでほぼ、１００％のコスト

velocityとpositionが上位のコストを占めている_____________________________________________________________________________________________
Loops profile
Cost% Operation (S) Barrier% NestKind
Exec Start
End----------------------------------------------------------------------------------29890 100.0000
298.8414
23 0.0769---------------------------------------------------------------------------------------2881
9.638728.8043
0 0.0000
6DOOpenMP
143
235
2340
7.828723.3954
0 0.0000
6DOOpenMP
343
357
1940
6.490519.3962
0 0.0000
6DOOpenMP
451
485
953
3.18849.52810 0.0000
6DOOpenMP
579
607
933
3.12149.32820 0.0000
6DOOpenMP
777
805
923
3.08809.22820 0.0000
6DOOpenMP
435
443
915
3.06129.14820 0.0000
6DOOpenMP
899
927
899
3.00778.98820 0.0000
6DOOpenMP
711
742
897
3.00108.96820 0.0000
6DOOpenMP
398
406
887
2.96758.86830 0.0000
6DOOpenMP
838
866

Thread0

position.position_2d._OMP_2_
velocity.velocity_e._OMP_1_
velocity.velocity_e._OMP_1_
velocity.velocity_b._OMP_2_
velocity.velocity_b._OMP_2_
velocity.velocity_e._OMP_1_
velocity.velocity_b._OMP_2_
velocity.velocity_b._OMP_2_
velocity.velocity_e._OMP_1_
velocity.velocity_b._OMP_2_

Copyright 2013 FUJITSU LIMITEDチューニング内容（チューニング１）
 velocity_e ⇒ チューニング１
 該当ループは、-Ksimd=2 でSIMD化を行っているため、IF構文内の命令を冗長実行しています。
ffi配列への代入を(テンポラリの)変数を使い、配列代入を2回から1回にしました。
このチューニングにより「ストア待ちのコストが削減されました。
275
276
277
278
279
280
281
282
283
284

6
7
7
7
7
7
7
6
5
4

p
p
p
p
p
p
p
p
p
p

4v
4v
4v
4v
4v
4v
4v
4v

do ll=1,nvxp2
if(ff(ll,mm,nn,ii,jj,ss)<1.0d-150) thenff(ll,mm,nn,ii,jj,ss)=0.0d0;
ffi(ll,mm,nn)=0.0d0;
else
ffi(ll,mm,nn)=1.0d0/ff(ll,mm,nn,ii,jj,ss);
end ifend doオリジナル
end doend do

280
281
282
283
284
285
286
287
288
289
290

6
7
7
7
7
7
7
6
6
5
4

p
p
p
p
p
p
p
p
p
p
p

4v
4v
4v
4v
4v
4v
4v
4v
4v

do ll=1,nvxp2
if(ff(ll,mm,nn,ii,jj,ss)<1.0d-150) thenff(ll,mm,nn,ii,jj,ss)=0.0d0;
wk1=0.0d0;
else
wk1=1.0d0/ff(ll,mm,nn,ii,jj,ss);
end ifffi(ll,mm,nn)=wk1
チューニングend doend doend doCopyright 2013 FUJITSU LIMITED

チューニング１（PA情報）
 チューニングの結果（オリジナルとの比較）
実行時間が約２．６倍向上

ストア待ちのコストがほぼゼロ

オリジナル
チューニング

実行時間 (sec)浮動小数点演算
ピーク比

8.15
3.16

6.10%
16.81%MFLOPS
901
2486
Copyright 2013 FUJITSU LIMITEDチューニング内容（チューニング２） velocity_e ⇒ チューニング２
 整数演算が多く、命令スケジューリングが効率的に行われていなかった。
整数演算を削減のため、整数演算を倍精度浮動小数点演算へ変更しました。
16
:
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326

integer(kind=4) :: lp2, lp1, lp0, lm1, lm2
5
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
5

p
p
p
p
p
p
p

v
v
v
v
v
v

p
p
p
p
p

v
v
v
v
v

pi v
p v
p

do mm=1,nvyp2
do ll=1,nvxp2
lp0=ll;lp2=min(max(lp0+lv+lv,1),nvxp2);
lp1=min(max(lp0+lv ,1),nvxp2);
lm1=min(max(lp0-lv ,1),nvxp2);
lm2=min(max(lp0-lv-lv,1),nvxp2);

オリジナル

258
real(kind=8) :: wlp0, wlp2, wlp1, wlm1, wlm2, wnvxp2:
317 5 pdo mm=1,nvyp2318 6 p v
do ll=1,nvxp2
319 6 p v
wlp0=ll;
320 6 p v
wnvxp2=nvxp2
321 6 p v
wlp2=min(max(wlp0+ssx+ssx,1.0),wnvxp2);
hp2=ff(lp2,mm,nn,ii,jj,ss);
322 6 p v
wlp1=min(max(wlp0+ssx,1.0),wnvxp2);
hp1=ff(lp1,mm,nn,ii,jj,ss);
323 6 p v
wlm1=min(max(wlp0-ssx,1.0),wnvxp2);
hp0=ff(lp0,mm,nn,ii,jj,ss);
324 6 p v
wlm2=min(max(wlp0-ssx-ssx,1.0),wnvxp2);
hm1=ff(lm1,mm,nn,ii,jj,ss);
325 6 p v
lp2=wlp2
hm2=ff(lm2,mm,nn,ii,jj,ss);
326 6 p v
lp1=wlp1
327 6 p v
lm1=wlp1
t_gfx(ll,mm)=pic5(hp2,hp1,hp0,hm1,hm2,vvx*ssx)*ssx;
328 6 p v
lm2=wlm2
end do329 6
end do330 6 p v
hp2=ff(lp2,mm,nn,ii,jj,ss);
331 6 p v
hp1=ff(lp1,mm,nn,ii,jj,ss);332 6 p v
hp0=ff(lp0,mm,nn,ii,jj,ss);
333 6 p v
hm1=ff(lm1,mm,nn,ii,jj,ss);334 6 p v
hm2=ff(lm2,mm,nn,ii,jj,ss);
335 6
336 6 pi v
t_gfx(ll,mm)=pic5(hp2,hp1,hp0,hm1,hm2,vvx*ssx)*ssx;
337 6 p v
end do338 5 pend doチューニング

Copyright 2013 FUJITSU LIMITED

チューニング２（PA情報）
 チューニングの結果（オリジナルとの比較）
演算コストが改善
実行時間が約21%向上

velocity_e オリジナル
velocity_e チューニング(real*8)

実行時間 (sec)浮動小数点演算ピーク比

MFLOPS

浮動小数点演算命令数

その他 命令数

78.60
65.20

14.30%
17.52%

2114
2590

8.18E+10
8.36E+10

7.45E+10
3.67E+10

浮動小数点演算命令数が増加

整数演算命令数が増加（その他命令数に計上される）
Copyright 2013 FUJITSU LIMITEDチューニング内容（チューニング３） velocity_b ⇒ チューニング３
 チューニング２と同様の整数演算を倍精度浮動小数点演算へ変更のチューニングを行いました。
⇒ チューニング方法はチューニング２を参照。

 キャッシュ効率の向上のため、以下のチューニングを行いました。（上記チューニング
に追加）• ループ分割(fission) ⇒チューニング方法は添付資料を参照• 配列次元の入れ替え(subscript) ⇒チューニング方法は以下参照
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446

integer(kind=4) :: ltmp(nvxp2,5)#define llp2(l) ltmp(l,1)#define llp1(l) ltmp(l,2) オリジナル#define llp0(l) ltmp(l,3)#define llm1(l) ltmp(l,4)#define llm2(l) ltmp(l,5)
integer(kind=4) :: mtmp(nvxp2,nvyp2,5)#define mmp2(l,m) mtmp(l,m,1)#define mmp1(l,m) mtmp(l,m,2)#define mmp0(l,m) mtmp(l,m,3)#define mmm1(l,m) mtmp(l,m,4)#define mmm2(l,m) mtmp(l,m,5)integer(kind=4) :: ntmp(nvxp2,nvzp2,5)#define nnp2(l,n) ntmp(l,n,1)#define nnp1(l,n) ntmp(l,n,2)#define nnp0(l,n) ntmp(l,n,3)#define nnm1(l,n) ntmp(l,n,4)#define nnm2(l,n) ntmp(l,n,5)

557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574

integer(kind=4) :: ltmp(5,nvxp2,nvyp1)#define llp2(l,m) ltmp(1,l,m)#define llp1(l,m) ltmp(2,l,m)#define llp0(l,m) ltmp(3,l,m) チューニング
#define llm1(l,m) ltmp(4,l,m) 配列次元の入れ替え#define llm2(l,m) ltmp(5,l,m)
integer(kind=4) :: mtmp(5,nvxp2,nvyp2)#define mmp2(l,m) mtmp(1,l,m)#define mmp1(l,m) mtmp(2,l,m)#define mmp0(l,m) mtmp(3,l,m)#define mmm1(l,m) mtmp(4,l,m)#define mmm2(l,m) mtmp(5,l,m)
integer(kind=4) :: ntmp(5,nvxp2,nvzp2)#define nnp2(l,n) ntmp(1,l,n)#define nnp1(l,n) ntmp(2,l,n)#define nnp0(l,n) ntmp(3,l,n)#define nnm1(l,n) ntmp(4,l,n)#define nnm2(l,n) ntmp(5,l,n)Copyright 2013 FUJITSU LIMITED

チューニング３（PA情報）
 チューニングの結果（オリジナルとの比較）
演算コストが改善
実行時間が約16%向上
実行時間が約33%向上

velocity_b オリジナル
velocity_b チューニング(real*8)
velocity_b チューニング(real*8+fission+subscript)

実行時間 (sec)浮動小数点演算ピーク比111.23
95.70
83.89

8.97%
12.04%
13.70%MFLOPS
1326
1780
2026
Copyright 2013 FUJITSU LIMITEDチューニング内容（チューニング４）
 position ⇒ チューニング４
 命令スケジューリングの向上のため、以下のチューニングを行いました。
• ループアンスイッチング ⇒チューニング方法は添付資料を参照• ループストライピング ⇒チューニング方法は以下参照
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
:

1
2
2
3
4
4
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5

p
p
p
p
p
p
p

do ss=1,ns
do nn=1,nvzp2!$OMP DOdo jj=nysm1,nye
do ii=nxsm1,nxe

119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
:

オリジナル

do mm=1,nvyp2
vvy = vy(mm,ss)*2.0d0;
ssy = dsign(1.0d0,vvy);
jv = ssy;
j0 = floor(vvy);

p
p
p
p
p

jp0 = jj -j0;
jp2 = jp0 +jv+jv;
jp1 = jp0 +jv ;jm1 = jp0 -jv ;jm2 = jp0 -jv-jv;

p
p
p
p
p

jp01= jp0 -1;
jp21= jp01+jv+jv;
jp11= jp01+jv;
jm11= jp01-jv;
jm21= jp01-jv-jv;

1
2
2
3
4
4
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5

最適化（チューニング）の説明は添付資料を参照!OCL NOSWP!OCL STRIPING(2)do ss=1,ns
ループストライピング
do nn=1,nvzp2!$OMP DOdo jj=nysm1,nye
do ii=nxsm1,nxe

チューニング

p
p
p
p
p
p
p

do mm=1,nvyp2
vvy = vy(mm,ss)*2.0d0;
ssy = dsign(1.0d0,vvy);
jv = ssy;
j0 = floor(vvy);

p
p
p
p
p

jp0 = jj -j0 ;jp2 = jp0 +jv+jv;
jp1 = jp0 +jv ;jm1 = jp0 -jv ;jm2 = jp0 -jv-jv;

p
p
p
p
p

jp01= jp0 -1;
jp21= jp01+jv+jv;
jp11= jp01+jv ;jm11= jp01-jv ;jm21= jp01-jv-jv;
Copyright 2013 FUJITSU LIMITED

チューニング４（PA情報）
 チューニングの結果（オリジナルとの比較）
演算コストが改善
実行時間が約5%向上

position オリジナル
position チューニング

実行時間 (sec)浮動小数点演算
ピーク比

66.67
64.00

18.70%
19.41%MFLOPS
2764
2869

Copyright 2013 FUJITSU LIMITED添付資料（チューニング３のオリジナルソース）
573
574
575
576
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605

5 p
5 p
6
p
v
6
p
v
6
p
v
6
p
v
6
p
v
6
6
p
v
6
p
v
6
6
p
v
6
p
v
6
p
v
6
p
v
6
p
v
6
p
v
6
p
v
6
p
v
6
p
v
6
p
v
6
p
v
6
p
v
6
6
p
v
6
p
v
6
6
pi v
6
p
v
5
p 8v
5
5
p

do mm=2,nvyp1
uy1=vy(mm,ss);
do ll=1,nvxp1
ux1=vx(ll,ss);
vv = ux1*bbx+uy1*bby+uz1*bbz;
sv = dsign(1.0d0,vv);
lv = sv;

オリジナル

tx_vv(ll) = vv
tx_sv(ll) = sv
llp0(ll)=ll-floor(vv);
llp2(ll)=min(max(llp0(ll)+lv+lv,1),nvxp2);
llp1(ll)=min(max(llp0(ll)+lv,1),nvxp2);
llm1(ll)=min(max(llp0(ll)-lv,1),nvxp2);
llm2(ll)=min(max(llp0(ll)-lv-lv,1),nvxp2);
end dodo ll=1,nvxp1
hp2=ff(llp2(ll),mm,nn,ii,jj,ss);
hp1=ff(llp1(ll),mm,nn,ii,jj,ss);
hp0=ff(llp0(ll),mm,nn,ii,jj,ss);
hm1=ff(llm1(ll),mm,nn,ii,jj,ss);
hm2=ff(llm2(ll),mm,nn,ii,jj,ss);
vv = tx_vv(ll)sv = tx_sv(ll)dfx1(ll)=pic5(hp2,hp1,hp0,hm1,hm2,vv*sv)*sv;
end doff(2:nvxp1,mm,nn,ii,jj,ss)=ff(2:nvxp1,mm,nn,ii,jj,ss) &&-(dfx1(2:nvxp1)-dfx1(1:nvx));
end doCopyright 2013 FUJITSU LIMITED

添付資料（チューニング３のチューニングソース）
750 5
751 5
752 6
753 6
755 6
756 6
757 6
760 6
761 6
763 6
764 6
765 6
766 6
767 6
768 6
769 6
770 6
771 6
772 6
773 6
774 6
775 6
776 6
777 5
778 4

p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p
p

v
v
v
v
v
v
v
v
v
v
v
v
v
v
v
v
v
v
v
v

do mm=2,nvyp1
uy1=vy(mm,ss);
do ll=1,nvxp1
ux1=vx(ll,ss);
vv = ux1*bbx+uy1*bby+uz1*bbz;
sv = dsign(1.0d0,vv);
lv = sv;
チューニング
tx_vv(ll,mm) = vv
tx_sv(ll,mm) = sv
ループ分割
wnvxp2=nvxp2
llp0(ll,mm)=ll-floor(vv);
wllp0=llp0(ll,mm)
wllp2=min(max(wllp0+sv+sv,1.0),wnvxp2);
wllp1=min(max(wllp0+sv,1.0),wnvxp2);
wllm1=min(max(wllp0-sv,1.0),wnvxp2);
wllm2=min(max(wllp0-sv-sv,1.0),wnvxp2);
llp0(ll,mm)=wllp0
llp2(ll,mm)=wllp2
llp1(ll,mm)=wllp1
llm1(ll,mm)=wllm1
llm2(ll,mm)=wllm2
end doend do

779 5
780 6
781 6
782 6
783 6
784 6
785 6
786 6
787 6
788 6
789 6
790 6
791 6
792 5
793 5
794 5

p
p
p
p
p
p
p

v
v
v
v
v
v

p
p

v
v

pi v
p
v
p 8v
p

do mm=2,nvyp1
do ll=1,nvxp1
hp2=ff(llp2(ll,mm),mm,nn,ii,jj,ss);
hp1=ff(llp1(ll,mm),mm,nn,ii,jj,ss);
hp0=ff(llp0(ll,mm),mm,nn,ii,jj,ss);
hm1=ff(llm1(ll,mm),mm,nn,ii,jj,ss);
hm2=ff(llm2(ll,mm),mm,nn,ii,jj,ss);
vv = tx_vv(ll,mm)
sv = tx_sv(ll,mm)
dfx1(ll)=pic5(hp2,hp1,hp0,hm1,hm2,vv*sv)*sv;
end doff(2:nvxp1,mm,nn,ii,jj,ss)=ff(2:nvxp1,mm,nn,ii,jj,ss) &&-(dfx1(2:nvxp1)-dfx1(1:nvx));
end doCopyright 2013 FUJITSU LIMITED添付資料（チューニング４のオリジナルソース）
143 6 p v
144 6 p v
145 6 p v
146 6 p v
147 6 p v
148 6
149 6 p v
150 6 p v
151 6 p v
152 6 p v
153 6 p v:
222 7 p v
223 7 p v
224 7 p v
225 7 p v
226 7 p v
227 7 p v
228 7 p v
229 7 p v
230 7 p v
231 7 p v
233 6 p v
234 6 p v
235 6 p v

do ll=1,nvxp2
vvx = vx(ll,ss)*2.0d0;
ssx = dsign(1.0d0,vvx);
iv = ssx;
i0 = floor(vvx);
ip0 = ii -i0;
ip2 = ip0 +iv+iv;
ip1 = ip0 +iv;
im1 = ip0 -iv;
im2 = ip0 -iv-iv;

オリジナル

if(ssy>0) then
gfx=gfx00;
else
gfx=gfx01;
end ifif(ssx>0) thengfy=gfy00;
else
gfy=gfy10;
end ifdfx(ll,mm,ii,jj) = gfx - gfxy00 + gfxy01;
dfy(ll,mm,ii,jj) = gfy - gfxy00 + gfxy10;
end doCopyright 2013 FUJITSU LIMITED

添付資料（チューニング４のチューニングソース）
145 6 p147 7 p v
148 7 p v
149 7 p v
150 7 p v
151 7 p v
152 7
153 7 p v
154 7 p v
155 7 p v
156 7 p v
157 7 p v:
174 7 pi v:
234 7 p v
236 6 p238 7 p v
239 7 p v
240 7 p v
241 7 p v
242 7 p v
243 7

if(ssy>0) thendo ll=1,nvxp2
vvx = vx(ll,ss)*2.0d0;
ssx = dsign(1.0d0,vvx);
iv = ssx;
i0 = floor(vvx);
ip0 = ii -i0;
ip2 = ip0 +iv+iv;
ip1 = ip0 +iv;
im1 = ip0 -iv;
im2 = ip0 -iv-iv;

チューニング
ループアンスイッチング

gfx=pic5(hp2,hp1,hp0,hm1,hm2,vvx*ssx)*ssx;
end doelse
do ll=1,nvxp2
vvx = vx(ll,ss)*2.0d0;
ssx = dsign(1.0d0,vvx);
iv = ssx;
i0 = floor(vvx);

244 7 p v
245 7 p v
246 7 p v
247 7 p v
248 7 p v:
305 7 pi v:
317 8 p v
318 8 p v
319 8 p v
320 8 p v
321 8 p v
323 7 p v
324 7 p v
325 7 p v
326 6
327 6 pip0 = ii -i0;
ip2 = ip0 +iv+iv;
ip1 = ip0 +iv;
im1 = ip0 -iv;
im2 = ip0 -iv-iv;
gfx=pic5(hp2,hp1,hp0,hm1,hm2,vvx*ssx)*ssx;
if(ssx>0) thengfy=gfy00;
else
gfy=gfy10;
end ifdfx(ll,mm,ii,jj) = gfx - gfxy00 + gfxy01;
dfy(ll,mm,ii,jj) = gfy - gfxy00 + gfxy10;
end doend ifCopyright 2013 FUJITSU LIMITED添付資料（ループアンスイッチングとループストライピングの説明） ループアンスイッチングについて（使用手引書より抜粋）
 ループアンスイッチングとは、ループ内に不変な条件で分岐するIF構文が存在する場合に、そのIF構文をループの外に出し、IF構文の条件が成立した場
合のループと成立しない場合のループを作成する最適化です。
ループ内にあるIF構文がループの外に追い出されることで、命令スケジューリ
ングなどの最適化が促進されます。

 ループストライピングについて（使用手引書より抜粋）
 ループストライピングとは、ループ内の実行文を一定数（この数をストライプ長と言います）だけ展開する最適化です。
ループストライピングは、ループ内の文が多重に展開されるので、ループアン
ローリング同様、オブジェクトモジュールの大きさが増加します。また、多くの翻訳時間を必要とする場合があります。
実行性能に関しても、使用するレジスタが増加するため実行性能が低下する場合があるので注意が必要です。

Copyright 2013 FUJITSU LIMITED &$#%

0')



136 ""! ,éê"@¦Zç Ùç º¤ç -(/+ç ăăìö÷Āù ķ ăďĔČċç ăćĎĒĊċĎìöĔčćđċĄĎç ÷čĔċĆìĀēđĔąēĔđćç ùĎēćđĄąēċďĎ Ķ ¡ ıěŃĖęy - ° ) ŕűŵźſŕŶŽŚŨŠŋŌŉĶ ¦ Ü  ĚŪŻŖŌŐŠıÜ  ħŅĬ  t Ò Ó X Ã n ŚŨŠŋŌŉıěńėĦĶŪŻŖŌŐŠıķĖŷŊŨŔŊōŽŗ Ù ıĶŕűŵźſŕŶŽŚŨŠŋŌŉŇĵ* ĤÜ ŜŵſŢŽőŇ¼ ĜĖæ U µ Ä ª x Ň ĜĬ= Â w Æ ® ĴŕűŵźſŕŶŽŇB  ĨĖīĶjŇ ĩUŇ v Ķ įĵ³ ĜİĜńėçç ăăìö÷Āù ķ   ĶÓ ±  źŬŹĶ @ Ã n ĵÔ ĨĬŕűŵźſŕŶŽŚŨŠŋŌŉĲĨİÜ  ĨİğŃĖ ĲĨİĖL U « ıěń» «  Ň Ņń»  ĶŕűŵźſŕŶŽŇF È ĲĨİĜńė ĞĸR ©
r 9 ŀ¶ r 9 ĶÀ / ıěń» p ķ» «  ıË Ħń È ıěŃĖīĶųŏŢŘŲĶÃ e Ň¼ ĝŇ Ķ įĲĨİĜńė» p ŕűŵźſŕŶŽıķĖ»  Ķ ĵ? 3 ĩńÊ »  ŀ» G m ĲĜĮĬ» 
Ĳ, ĸŅń® ´ ġ: M ĨÍ Ï ħŅİ¼ ģ W Ň¬ E ĵ' Ń\ ĝS À ġěńėĦĶŁĝĴ  t Ò Ó X
Ã n Ň¼ ĝ ĵĖY Ęķc ĨĜŕűŵźſŕŶŽŚŨŠŋŌŉŇÜ  ĨİĢĬėk 7 + ıķīĶU µ ĵį
Ĝİ7 + ĩńėçç
0 ƂĖÃ n F È ƈ» «  Ň Ņń»  Ĳ»  ç 37254  ç   t Ò Ó X ŕűŵźſŕŶŽŚŨŠŋŌŉıķt Ò Ķ: M ŇÄ ª q > ġ: M ĩń

ı½  ĩń úĄĉđĄĎĉć  ġ¸ ģ ĜłŅńė  ŇF È ĲĨĬ8 ) ĖÄ ª ĶM  Ň ĩůŸœŽĴĳĶşſśġĴģĖ
ĽĬĖ= Ú ĶÊ »  Ķ: M Ň į įÄ ª q > Ķ: M ı' \ ĜĖ­   Ňa ) U ĶĲŅĬÄ ªq > ı X ĩńķ ( µ ıěńėīĦı ăăìö÷Āù ıķĖ§ Ý ĵ1 A ĨĬq > ı' Ń\ ĝ öĔčćđ Ň^  ĨĬėĦĶ[  ıķ  Ķ? 3 Ň ¥  ı½  ĨĖ1  Ķ¢ ! : M ķ ¥  ĶÍ Ï Ň' Ń\ĝ

ı½  ĩńėçç ăăìö÷Āù ıķÄ ª q > ĵ§ Ý Ň4  ĵ  ĨĬŮŐřŹĲĨİ' Ń\ ĝėĦĶ[  ıķÄ ª ĵ ĩńŤſš`  Ä ª ä 5 Ň M ĵ Ĥń  V ıěŃĖıä 5   ġ½  ıĢĖŤſšÝ   ĶB ¿ ġ| Ìı  ħŅİĜń āďĈĔ ţŝŠżſŐĲĶ U ġ¸ ĜėĽĬĖƄØ õýç úýýþ ı ª

ġt X ħŅİğŃĖīĶi ; ŹſŪŇ ýĐćĎûþ ¨ ı  ĩńĵŁŃĖŤſš   ĿD f ĵ½  ġ

 l ńėĩĴņĭĖťŊũŸŝš  ĶŚŨŠŋŌŉĲĨİ  ĶÅ Ä : h  ģ X ĩńġ l ńėƄØ ŹſŪĶi  ŹſŪĵ Āùûõ  ª ġ ĞŅĸĖīĶÖ  ķ þċĐćčċĎć   ĲĴŃĖæ Ñ " ġÁ Î ĽŅńėçç ŪŻőŷŲķ¨ Ý ß ĵ× ³ ħŅĬÄ ª q >ı6  J t X d £ J Ňà _ " ĨİĜńėP Į

İĖä 5   ıķ¾ Ð  ġ  ĩńė ·  Ĵá 2 ²   ĶŕűŵźſŕŶŽıķ2  ĶůŉŚŽç

φs

Fluid

1
0.5
0

Solid


Cauchy-Green
ç
0 ƃĖöĔčćđ  ıĶ1  : M Ķ' \ Ĝççd £ J ŇÄ ª ĩń  ġŭŝŠŗůŝŠıěŃĖīĶ  ķ& Q Ä ª ĲĴŃĖ< ` Ķ¾ Ð  ġ  ĩńėĦĶ< ` Ķ¾ Ð  ġ  U µ ĶU µ *  ŇÞ C ĩńÀ / ıěńėīĦıĖăăìö÷Āù ıķĖÐ H
Ķá 2 ²   ĲĨİ' Ń\ ĝŇŀľĖ  2 ²   ĲĨİ' Ń\ ĝıĖůŉŚŽd £ J Ķ& Q Äª Ň. Õ ĨĬėĦŅĵŁŃĖg Ý ŗŞŝŪ Ķ ª ĵF ĩńÐ  Ķ|  Ň ĥńç ŪŻőŷŲĶ  " ĵķ Āþøöÿö Ň  ĩńö Ň  ĩńĵŁŃĖ  "  s ĶĵX  ĨİĜńėç

 " Ň0 ĮİĜńėĀþøöÿ

ĵŁŃU µ ĺĶN â ķĻļ  ıěŃĖÐ    ĺĶŎſŦſūŝšĿz ĳĴĜėç

     
ç U µ  A ĵķĖ " @  ¦ Z Ķ ÿùôôĖÄ ª  @¦xtĶ

ŒŽŧŵſśŇ ĜĬėçç  ª g Ý Ķ āďĐñ ķF  ã ĖýčĆđďĕĆç đĄēć ã ĶŞŽŚŹ¥ ĖT  ŞŽŚŹĶÄ ª ĖT  ŞŽŚŹĶ
 _   ıěńėĦĶĝĭĖF  ã ġ Ä ª g Ý ĶƆ Ň$ ľİĜńėF  ã ĶÄ ª ĵķ Ăöüý Ň ĜİğŃĖ Ç  ª U µ Ķƅ   ĶU µ ŇK  ĨİĜńėīĶĬľĖŤſš#  ı ñòíñèĶB
U µ ŇB  ĨİĜńėĽĬĖăăìö÷Āù ķá H ĵæ Ĝ  U µ Ň] ĮİğŃĖĂćĄČç ĀąĄčć ıĶ îïëïóó ŤſšĶ A ıĿ ñðíïèĶB

U µ ŇB  ĨİĜńėŪŻŨňŊŷĶÆ ® ķ

É b Ň%  ĶĦĲėçç Ťſš#  ıĶU µ ķƄØ ŹſŪĶi ; ŹſŪĵ ýĐćĎûþ ĵŁń  " ŇÔ  ĨİğŃĖŰŹŜŒ
ŉÄ ª x t ĵF T ĨİĜńėi ĿU µ Ķıńi ; ŹſŪĶÛ ħķ< ` ĶÄ ª  A Ġł~ A ĨİĜńė
ĽĬĖŭŝŠŗůŝŠ  ıĶ Āùûõ "  ġá H ĵæ ģĖĽĬŻſšžŊŽŦŷŽŗĿ ģĖæ ĜBUµŇ ĨİĜńėçç ĽĬĖá 2 ² U   Ã n ı¸ ģ ĜłŅİĜńůŉŚŽd £ J ĶÃ  ĲĨİ ĜłŅń Āýÿ  ĵįĜİĖŜŵſŢŽő O ĶU µ  A Ň¼ ĮĬė  2 ²  Ň^  ĩń Ķ ăăìö÷Āù ıķĖ2  ĶůŉŚŽd £ J Ň} ľńĶĵ ûĔčēċąďčďđç ĀýÿƀƇ¹ ƁŇ  ĨİĜĬėûĔčēċąďčďđç Āýÿ ķ×  Ňå Ĺå ĹĵŉŐřŗĩńt Ò ĲĴŃĖųŴŸ ĶşſśŇÓ ±  ĵŉŐřŗĨĴĜėīĦıĖôďčďđ { Ķ s×  Ň V ĨĖīĶ×  ŇÓ ±  ĵŉŐřŗĩńu ĵŜŵſŢŽőŇ¼ ĮĬėīĶ¯ o ĖÑ I *  ġÁ łŅĖjĴŜŵſŢŽőd  ıěńĦĲġ ĪĬėç #$ç ăăìö÷Āù ķŒŽŧŵſśĶu ĵ< ` ĶŤſšıt X ħŅń øþô * ĤĵÅ Ä ħŅĬc ĨĜ  tÒ Ó X ŕűŵźſŕŶŽŚŨŠŋŌŉıěŃĖĽĬĖŰŹŜŒŉÄ ª x t ĲĶ U ĿŁĜėƄØ ŹſŪıt
X ħŅĬ ª Ö Ķ Āùûõ "  Ňæ ģĩńıá H ĵæ ĜB

U µ ŇK  ĩġıĢńė 

ステンシル計算型アプリ(ZZ-EFSI)の性能
野田 茂穂（理研）、杉山 和靖 (東大・工, 理研）
文部科学省「次世代計算科学研究開発プログラム」
PCクラスタでの性能計測に関しては理化学研究所情報基盤センターのRICCを使用した．
京での計算に関しては京速コンピュータ京の試験利用での結果である．

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

研究の目的と方策• ZZ-EFSI とは，Zouki Zenshin-Eulerian FluidStructure Interactionの略．
• 複雑な境界形状/多数の分散体を持つ流体構造連成問
題が対象• 生体内の連続体レベルの力学解析に適した数値計算• 通常の解析で使われるgivenの式をチューニングするのではなく、新たに、実装すべき式を定め、アルゴ
リズムを設計。
- 「京」で動かす実アプリのスキームを１から作る- チューニングはその後で手法の開発が目的．
• 演算性能を向上しよりよい成果を得る。

・ Ii, Sugiyama et al. (2012)
J. Biomech. Sci. Eng.
(accepted).
All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

生体：機械部品とは異なり，設計図が存在しない
医療画像 (CT/MRI)

Voxel data (VOF; Volume Of Fluid)→ 多媒質幾何・材質
方法論の確率(有限差分・固定格子)
Euler法に基づくシミュレーション
・voxelデータとの高い親和性
・既存の流体解析手法にならう
All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

Euler型連成法

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

Lagrange~ vs. Euler~
Lagrange~(´óôìîjQĄ®¶)Euler~(Âó8HèêïjQĄ®¶)ô-$õĻ

φs

Fluid

Fluid

1
0.5
0

Solid

Solid

ÛÛ8

?½4ħĕďī

c.f. ôVOF~8ôATô®¶õĻ´ôJ¡ôA,

LCauchy-GreenATĖıĒĮ

・ Sugiyama, Ii et al. (2011) J. Comput . Phys., 230, 596.
・ Ii, Sugiyama et al. (2011) Int. J. Numer. Meth. Fluids, 65, 150.

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

コードの特徴 (Euler法)
;òĮĳġôĐĖıďĮ­do k=1,nk← Ďćċĭĕċ!((OpenMP)
do j=1,nj
do i=1,ni← SIMD/Pipelineqnew(i ,j ,k )=&+ q(i ,j ,k-1)*c00m&+ q(i ,j-1,k )*c0m0&+ q(i-1,j ,k )*cm00&+ q(i ,j ,k )*c000&+ q(i+1,j ,k )*cp00&+ q(i ,j+1,k )*c0p0&+ q(i ,j ,k+1)*c00p
enddo
enddo
enddo

)GĲvº)GôAg(¹Pĸ9)ĸOZ>ĸYĹĹĹ)
Ą8H«&uFïÈf,:òĐįĕĘ"!(â.

:òMPIÎ<!(â.

ÜÜĊĩĕďīôq*%ôqāÝôp½,aðYâ¥ßÝôTofuôvºðYâ¥ß
All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

可能な限り「京」の性能を活用したい
http://jp.fujitsu.com/solutions/hpc/brochures1Âó1 (1Ð1016 )7ôØ 8Ð104 (ÔÕÒÓ) × 8 (ÑÕÖÓ) × 8 ()× 2Ð109 (Hz)ĲMPIĲĜćġĬćıĲSIMD

ĲOpenMP(or ¤+")ĲB/FÛ6¿õCßøñ¥ßâĸ
M!õ¾åêßĹ¸ĵěĳĘÂôZ>ôþāðāĶ
ěĳĘ{ô¿Ą:óèêß

Euler~âq*2VôCßĄ¾åêß

Ê9 YEâ¬tJ³
ïÞìîý9)PoissonQĄ¬ãêäòß
ĵÆ¬~óèêßĶ

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~ñàßàæðáĻÛÅ¬~ vs. Æ¬~ÅÆ0óõĸ·§"Ą}üăö¥ßĹèáèĸĐĖıďĮ­ï§"Ĺ¬â3séĂúï2VĹ do loop=1,loopmax

­«w
ózÃ

do j=1,nj
do i=1,niqnew(i ,j )=& + qnew(i ,j-1)*e0m& + qnew(i-1,j )*em0& + qnew(i+1,j )*ep0& + qnew(i ,j+1)*e0p& +d(i ,j )*f00
enddo
enddo
enddo

ħĨĭĆċđĐ
¸

2V­òè
do j=1,nj
do i=1,niqnew(i ,j )=& + q(i ,j-1)*c0m& + q(i-1,j )*cm0& + q(i ,j )*c00& + q(i+1,j )*cp0& + q(i ,j+1)*c0p& + d(i ,j )
enddo
enddo

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~計算アルゴリズムの見直し• 擬似圧縮性法 (Artificial Compressibility Method; ACM)
- 本当は非圧縮性(Mach数が零の極限)の条件を満たしたいが，微圧縮性流体と見立てて，低Mach数の流れを想定して，圧力発展式を陽的に解く．
- Ohwada & Asinari (2010) J. Comput. Phys. 229• 対処すべき点- ACMでは，質量保存が破綻するのでは？
- 低Mach数の流れが，非圧縮性流れに近いのは当然では？
• やったこと- アルゴリズムの開発- 誤差の最小化- 数値安定性の確保

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~­]ÍĸÈf,1. VOF, LCGATĖıĒĮôni

2. ¹PĢċėĮôlÂĺ yPEuler~Â: =róyPWM!
ÛÛÛÛ(ďĩĳġóËbéĂêüÛÛÛÛÌõ yPWENO~)
Ag: 11
Ĳ¹PĢċėĮ v, 3[!
Ĳ9) p
Ĳ8ÛφĲLCGATĖıĒĮB, 6[!
Çc¨¸: 13Ag

3. 9)@!ô­

Ĳ Agķδpķ
Ĳ¨NôuFg1ļ3
node

node

4. ¹PĢċėĮôz

5. Agôni. 1÷ĹD<¸: 67 (Present ACM)
All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

開発言語とライブラリ
開発言語とライブラリ• FORTRAN, C++• VSphere (ミドルウェア．領域分割の並列計算コードを作る)• MPI (送受信用のバッファ．パック通信)• RICCではFlatMPI• 京ではハイブリッド並列 (OpenMP/自動並列)

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~ĔĩĚĮôneo-HookeF

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~ò\ôY£ (.ěĳĘĸ8 cores)ĔĩĚĮôneo-HookeFěĳĘSêā512x128x128uF
lÂ/total

FLOPS/peakħĨĭĐĮĳġĕė/peak

SIMD

71.7%

50.8%

25.7%

96.8%

Oldroyd rate Ìô
10.4%
ĖıĒĮ

23.7%

34.2%

89.0%

X)ĖıĒĮô­
4.8%


29.7%

66.1%

85.5%

X)ĖıĒĮô 2.4%
f

22.2%

58.7%

88.2%

JÌ
(30\)

ëòûóĸģĆĒıjQô}¬óĪčĝ~Ĺ
→ ª}B/FâÏßĹPïĞĳċY£|õ¥äî10%ª}B/Fßĺ
0.6

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

並列性能 @「京」 ※ (実効性能と並列台数．weak scaling)1ěĳĘ (8 čĆ)ĺ 46.4%
2ěĳĘ (16 čĆ)ĺ 45.1%
12,288ěĳĘ (98,304 čĆ)ĺ 43.2%
ĐĉĬĳxôĐĖıďĮ­ðèîĸÏßI*Y£ & T_RY×Y£óíßîõĸhôďĐĖĦóÿĂmHògïÞĂ

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~Y£âîßĂõĺ

ièßj~²
ĲEuler;qÄM!~Ĳ+ĜĬħĳēĄ`íe9

Y~

ķ
¼ô¥ç
Ĳ»)Gõ00&â.ĹčĳĘý.Ĺ ðôY¥ßĹ
ĲFortranĄĹp½,ôhâkáìêĹ#üõZ>ýCáìêĹ
Ĳ1áĀčĳĘĄoåĂ â©gĹċİĐĔĈĕċĹġİğąćĬô|µĹĲďĩĳġòËbôêüWENO~ĄìîßêĹ
ĲĖıĒĮ[!ĹgâCßĹĊĩĕďīô%Yâ(ð¥ßĹķĔīĳęıČ
ĲĤęīĆĮĴÉK (2007) ÜĔīĳęıČ^~ÁÝĄ1¢Ĺ
http://accc.riken.jp/assets/files/scalar/scalar_cover_contents_2007-05-28.pdf

Ĳ°üĸáíĸ¯§À±Ĺ
All Rights Reserved, Copyright © ISLiM, RIKEN 2011~ħĨĭčĞĳ→ģćıēô d (Ag{ôni)z'FortranôĎĠĮĳĔı
subroutine tadv2(qnew,q)...
do k=-2,nk+3
do j=-2,nj+3
do i=-2,ni+3
qnew(i,j,k) = q(i,j,k)
enddo
enddo
enddo

totalôlÂôïĸ
5%PĄ/üĂ

zU
ģćıēô

d ĵin C)

work_tmp = q;
q = qnew;qnew = work_tmp;øùlÂâááĀòß

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~ô!( (LCGĖıĒĮ)zU
z'

do k;do j;do i(xx成分) = (対流項x)

do k;do j;do i(xx成分) = (対流項x) +(対流項y) &enddo;enddo;enddo
do k;do j;do i(xx成分) = (xx成分) + (対流項y)+ (対流項z) + (Oldroyd rate項)

enddo;enddo;enddo
do k;do j;do i(xx成分) = (xx成分) + (対流項z)(yy成分) = (対流項x) +(対流項y) &+ (対流項z) + (Oldroyd rate項)(zz成分) = (対流項x) +(対流項y) &enddo;enddo;enddo(同様に，yy, zz, xy, xz, yz成分も)+ (対流項z) + (Oldroyd rate項)
enddo;enddo;enddo

do k;do j;
do i(xx成分) = (xx成分)+ (Oldroyd rate項)

do k;do j;do i(xy成分) = (対流項x) +(対流項y) &(yy成分) = (yy成分)+ (Oldroyd rate項)+ (対流項z) + (Oldroyd rate項)
enddo;enddo;enddo(zz成分) = (zz成分)+ (Oldroyd rate項)

do k;do j;do i(xz成分) = (対流項x) +(対流項y) &enddo;
do i(xy成分) = (xy成分)+ (Oldroyd rate項)+ (対流項z) + (Oldroyd rate項)

enddo
do i
(xz成分) = (xz成分)+ (Oldroyd rate項)

内部演算が多く、レジスターの枯渇発生。

enddo;enddo;enddo

do k;do j;do i(yz成分) = (対流項x) +(対流項y) &

enddo
do i
(yz成分) = (yz成分)+ (Oldroyd rate項)

従って、演算を分けた方が早くなるケース+ (対流項z) + (Oldroyd rate項)

enddo
enddo;enddo

enddo;enddo;enddo

I**34.6%

I**46.0%
All Rights Reserved, Copyright © ISLiM, RIKEN 2011~ô¦4 (¹Pôz)z'

I**4.2%

Ġİĕċ!(ĸno-xfill

do k; do j;do iun(i,j,k)=un(i,j,k)+(dp(i,j,k)-dp(i+1,j,k))*dtdxinv

enddo; enddo; enddo
do k; do j;do ivn(i,j,k)=vn(i,j,k)+(dp(i,j,k)-dp(i,j+1,k))*dtdyinv

enddo; enddo; enddo
do k; do j;do iwn(i,j,k)=wn(i,j,k)+(dp(i,j,k)-dp(i,j,k+1))*dtdzinv

enddo; enddo; enddo

zU

I**6.5%Ġİĕċ!(ĸno-xfill

do k; do j;do iun(i,j,k)=un(i,j,k)+(dp(i,j,k)-dp(i+1,j ,k ))*dtdxinv
vn(i,j,k)=vn(i,j,k)+(dp(i,j,k)-dp(i ,j+1,k ))*dtdyinv
wn(i,j,k)=wn(i,j,k)+(dp(i,j,k)-dp(i ,j ,k+1))*dtdzinv
enddo; enddo; enddoĎćċĭĕċ(1)!(

node1: 1, 2,...16
node2: 17,18,...32...
node8: 121,122,...128

node1: 1, 9,..., 121
node2: 2,10,..., 122...
node8: 8,16,..., 128ĠİĕċÛÛĎćċĭĕċ
Ú
xfillĮĳġôpB
Ġİĕċ!(○

6.5% 6.9%
6.0% 7.6%
All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

アプリケーション全体性能(512x128x128)
8
46
range

-0&1
[GFlop/s]

 %[GB/s]

-0
+

"2(6
[/]

-0&1
[GFlop/s]

 %[GB/s]

-0
+

7.333

59.60739.73146.568%55.996

7.834

5.321

48.963%


 
8ĐįĕĘ

1ĐįĕĘ

1

"2(6
[/]

,
#'.






1.71E+11

1.39E+09

5.43E+08

5.53E+09

1.93E+11(12.0%)(84.3%)(0.7%)(0.3%)(2.7%)(95.0%)

2.63E+10

1.72E+11

2.40E+09

3.38E+08

8.85E+09

1.93E+11(12.6%)(81.9%)(1.1%)(0.2%)(4.2%)(95.0%)

L1$3
dm

h9pf

L2$
'

swpf

利用期間5-1でステージングを使用，コンパイラは 1.2.0-04 を使用，
コンパイルオプションは以下を指定しています。
o 1スレッド並列実行-Kfast,ocl,ilfunc,preex,array_private,auto,simd=2,optmsg=2 -Qt -Qm -V

L2$3dm

o 8スレッド並列実行

pf

8ĐįĕĘ

2.28E+09

11.3%

76.1%

12.6%

8.90E+08

2.4%

97.6%

1ĐįĕĘ

2.33E+09

16.9%

64.1%

19.0%

9.12E+08

1.2%

98.8%

 


7.636

SIMD!

$

2.45E+10

L1$
'


')

-Kvisimpact,ocl,ilfunc,preex,array_private,auto,openmp,simd=2,optmsg=2 -Qt -Qm

スレッド毎のロード・インバランスOK'!&$#,1-/  +0-.

! +0-.
(*










,")&%3846.-3846',%"$



2745
2745
/1

+0-.
2745 =5<>
7249368;:)

%'#!"%'#!"


0

D<CE
>9;@:=?BA0

%'#!"%'#!"%'#!"%'#!"%'#!"%'#!",")&%#*,%

,")&%#'(+All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

1. "weno5" 対流項

性能測定（512*128*128）! "

2. "oldroyd" Oldroyd rate項のテンソル積
3. "stress" 応力テンソルの算出
4. "div_str" 応力テンソルの発散! "

*%'(/402('$)(*$/402

 .301

 .301




.301
 +-.301
 +-





 .301

@8?A
 :57<69;>=,



,&)%#$

&)%#$

!



&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

!

$'+")*(0513 &)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

%&$"#%&$"#%&$"#'(&$''-2.0 ,1./ /412
,1./ )+/412
,.









 
D9@E
;68=7:<?>-

>6=?
 
835:479<;*






D9@E ABC:<?>-&(%#$&(%#$
&(%#$&(%#$&(%#$&(%#$&(%#$&(%#$

%&$"#%&$"#%&$"#%&$"#%&$"#

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

1. "weno5" 対流項

性能数値（512*128*128）

2. "oldroyd" Oldroyd rate項のテンソル積
3. "stress" 応力テンソルの算出
4. "div_str" 応力テンソルの発散
Ù5ÙI§lÂĲY£
8
46

1 75*8 %[GB/s]"2(6 -0&1[/][GFlop/s]

 %[GB/s]"2(6 -0&1-0[/][GFlop/s]
+

gĵ|Ķ

46
-0

+
')

range

7.336

59.58820.927 46.553%

55.8657.852

2.696 49.077%

7.615

weno5

5.365

74.07516.144 57.871%

45.681

8.772

1.667 54.824%

8.514

oldroyd

0.823

30.69321.760 23.979%

5.970

3.901

3.907 24.380%

7.254

div_str0.188

14.30545.066 11.176%

0.902

2.979

10.160 18.622%

4.801

stress

0.393

14.58042.124 11.390%

1.468

4.084

12.953 25.523%

3.731

8
range
1
75*8
8
weno5
1
75*8

ÙĊĩĕďīĥĐZ>
46
range
weno5
oldroyd
div_strstress

' 





'

L1$
'

8
1
8
1

L1$3
h9pf

swpf

L2$
'

2.28E+09

11.3%

76.1%

12.6%

8.92E+08

2.4%

97.6%

2.33E+09

16.8%

64.1%

19.0%

9.12E+08

1.2%

98.8%

1.17E+09

3.8%

96.2%

0.0%

5.17E+08

0.4%

99.6%

1.20E+09

14.5%

72.7%

12.8%

4.77E+08

0.5%

99.5%

8

6.68E+08

22.6%

45.7%

31.7%

1.08E+08

0.4%

99.6%

1

6.72E+08

22.8%

45.5%

31.7%

1.50E+08

0.4%

99.6%

8

1.09E+08

20.9%

79.1%

0.0%

5.02E+07

2.3%

97.7%

1

1.07E+08

13.8%

86.2%

0.0%

5.57E+07

0.5%

99.5%

8

1.63E+08

13.1%

53.5%

33.4%

9.65E+07

0.3%

99.7%

1

1.81E+08

21.4%

48.4%

30.2%

1.16E+08

0.2%

99.8%

dm

pf

8
oldroyd
1
75*8
8
div_str
1
75*8
8
stress1
75*8

1. "weno5" 対流項
ピーク比57.87%，SIMD化率92.72%，FP演算命令率90.69%と理想的な性能



5.43E+08

5.54E+09(12.0%)(84.3%)(0.7%)(0.3%)(2.7%)(95.0%)

2.63E+10

1.72E+11

2.40E+09

3.38E+08

8.82E+09

1.93E+11

L2$には載ってるけれどもL1$に載っていないということ
ブロック化によるL1$へのオンキャッシュ化 or L1$のスラッシング回避が必要
また，L1Iミス率が0.24%と比較的高い
命令フェッチ待ちが発生しているのはこれが原因の可能性ありループ分割の検討が必要(12.5%)(81.9%)(1.1%)(0.2%)(4.2%)(95.0%)

1.55E+11

5.65E+04

4.03E+08

2.90E+09

1.67E+11(7.4%)(90.7%)(0.0%)(0.2%)(1.7%)(97.3%)

1.43E+10

1.57E+11

1.17E+09

2.12E+08

6.18E+09

1.67E+11(8.0%)(87.7%)(0.7%)(0.1%)(3.5%)(97.3%)

6.75E+09

1.07E+10

8.80E+08

4.68E+07

1.23E+09

1.71E+10(34.5%)(54.5%)(4.5%)(0.2%)(6.3%)(87.3%)

6.82E+09

9.67E+09

8.56E+08

3.98E+07

1.34E+09

1.71E+10(36.4%)(51.6%)(4.6%)(0.2%)(7.2%)(87.3%)

1.31E+09

9.28E+08

2.99E+03

1.71E+07

2.17E+08

2.05E+09(53.0%)(37.5%)(0.0%)(0.7%)(8.8%)(82.7%)

1.31E+09

9.28E+08

5.06E+02

1.69E+07

2.18E+08

2.05E+09(53.0%)(37.5%)(0.0%)(0.7%)(8.8%)(82.7%)

1.57E+09

2.30E+09

4.43E+08

2.36E+07

5.59E+08

3.52E+09(32.1%)(47.0%)(9.0%)(0.5%)(11.4%)(71.8%)

1.57E+09

2.30E+09

3.01E+08

1.63E+07

4.10E+08

3.52E+09(34.2%)(50.0%)(6.5%)(0.4%)(8.9%)(71.8%)



Inoue@Fujitsu

ループ融合によるデータ参照の局所化が可能か検討が必要
4. "div_str" 応力テンソルの発散
メモリスループットが45.07GB/sと実効性能に近い
ループ融合によるデータ参照の局所化が可能か検討が必要
All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

1. "weno5" 対流項

性能測定（128*128*128）

2. "oldroyd" Oldroyd rate項のテンソル積
3. "stress" 応力テンソルの算出
4. "div_str" 応力テンソルの発散!

*%'(/402

1.93E+11

1.26E+10

メモリスループットが42.12GB/sと実効性能に近い

L2スループット(L1$ L2$)が103.96GB/sと実効性能に近い

SIMD!

$

1.39E+09



3. "stress" 応力テンソルの算出

2. "oldroyd" Oldroyd rate項のテンソル積! "



1.71E+11

L2$3

dm

,
#'.

2.45E+10'&#(')#.3/1

 -2/0.301-2/0 *,
.301
+-








?7>@
946;58:=<+

.301


,

&)%#$

&)%#$

!

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

%($"#%($"#!

$'+")*(0513  /412

%($"#%($"#%($"#%($"#%($"#%($"#

%&$"#%&$"#%&$"#'(&$''-2.0 

/412 ,.

,1./
,1./ )+









D9@E;68=7:<?>-


>6=?

835:479<;*






D9@E ABC:<?>-&(%#$&(%#$
&(%#$&(%#$&(%#$&(%#$&(%#$&(%#$

%&$"#%&$"#%&$"#%&$"#%&$"#

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

1. "weno5" 対流項

性能数値（128*128*128）

2. "oldroyd" Oldroyd rate項のテンソル積
3. "stress" 応力テンソルの算出
4. "div_str" 応力テンソルの発散
Ù5ÙI§lÂĲY£
8
46

1 75*8 %[GB/s]"2(6 -0&1[/][GFlop/s]

 %[GB/s]"2(6 -0&1-0[/][GFlop/s]
+

gĵ|Ķ

46
-0

+
')

range

8.362

52.35818.504 40.904%

63.5736.914

2.060 43.212%

7.603

weno5

5.985

66.49114.106 51.946%

50.0698.017

1.258 50.104%

8.366

oldroyd

1.121

22.563

15.542 17.627%

8.587

2.715

1.843 16.971%

7.659

div_str

0.196

13.70445.136 10.706%

0.879

3.062

9.751 19.136%

4.475

stress0.404

14.40842.911 11.256%

1.506

4.028

11.248 25.177%

3.733

8
range
1
75*8
8
weno5
1
75*8

ÙĊĩĕďīĥĐZ>
46
range
weno5
oldroyd
div_strstress

' 




L1$3

L2$3


'

L1$
'

dm

h9pf

swpf

L2$
'

8

1.92E+09

20.4%

66.4%

13.3%

8.82E+08

5.1%

94.9%

1

2.03E+09

25.2%

54.0%

20.9%

7.40E+08

4.0%

96.0%

8

9.24E+08

3.9%

96.1%

0.0%

4.93E+08

1.0%

99.0%

1

1.03E+09

15.7%

68.2%

16.1%

3.69E+08

1.1%

98.9%

8

5.75E+08

47.0%

21.9%

31.1%

1.03E+08

1.7%

98.3%

1

5.82E+08

46.8%

22.1%

31.1%

9.06E+07

1.3%

98.7%

8

8.15E+07

19.5%

80.5%

0.0%

5.25E+07

1.0%

99.0%

1

7.76E+07

15.4%

84.6%

0.0%

5.05E+07

0.7%

99.3%

8

1.71E+08

23.5%

43.2%

33.3%

1.01E+08

0.8%

99.2%

1

1.70E+08

23.4%

43.4%

33.2%

9.80E+07

0.6%

99.4%

dm

pf

8
oldroyd
1
75*8
8
div_str
1
75*8
8
stress
1
75*8

,
#'.




SIMD!

$

2.54E+10

1.74E+11

1.56E+09

8.42E+08

7.23E+09(12.2%)(83.2%)(0.7%)(0.4%)(3.5%)(91.4%)

2.73E+10

1.74E+11

2.60E+09

5.76E+08

1.01E+10

1.91E+11

1.91E+11(12.7%)(81.1%)(1.2%)(0.3%)(4.7%)(91.4%)

1.29E+10

1.57E+11

7.30E+04

5.71E+08

3.64E+09

1.65E+11(7.4%)(90.2%)(0.0%)(0.3%)(2.1%)(94.4%)

1.46E+10

1.59E+11

1.17E+09

3.22E+08

6.38E+09

1.65E+11(8.1%)(87.6%)(0.6%)(0.2%)(3.5%)(94.4%)

7.11E+09

1.08E+10

1.00E+09

7.05E+07

1.55E+09

1.69E+10(34.6%)(52.6%)(4.9%)(0.3%)(7.5%)(82.3%)

7.22E+09

9.80E+09

1.01E+09

6.40E+07

1.69E+09

1.69E+10(36.5%)(49.5%)(5.1%)(0.3%)(8.5%)(82.3%)

1.35E+09

9.44E+08

7.21E+03

3.12E+07

3.07E+08

2.02E+09(51.3%)(35.9%)(0.0%)(1.2%)(11.7%)(77.0%)

1.34E+09

9.43E+08

9.98E+02

3.09E+07

3.11E+08

2.02E+09(51.1%)(35.9%)(0.0%)(1.2%)(11.8%)(77.0%)

1.62E+09

2.34E+09

4.73E+08

2.89E+07

6.13E+08

3.56E+09(32.0%)(46.0%)(9.3%)(0.6%)(12.1%)(70.2%)

1.62E+09

2.33E+09

3.38E+08

2.17E+07

4.72E+08

3.56E+09(33.9%)(48.7%)(7.1%)(0.5%)(9.9%)(70.2%)All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

1. "weno5" 対流項

性能測定（64*64*64）! "

2. "oldroyd" Oldroyd rate項のテンソル積
3. "stress" 応力テンソルの算出
4. "div_str" 応力テンソルの発散!

*%'(/402'&#(')#/613

.301 .512



.512

*,


.301
+-



4-10+






.301



B:AC

<79>8;=@?+,




&)%#$

&)%#$

!

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$


%($"#%($"#!

$'+")*(0513 

%($"#%($"#%($"#%($"#%($"#%($"#

%&$"#%&$"#%&$"#'(&$''-2.0  ,1./ /412
/412
,.

,1./
)+






 >6=?
835:479<;*



D9@E
;68=7:<?>-
D9@E ABC:<?>-&(%#$&(%#$


&(%#$&(%#$&(%#$&(%#$&(%#$&(%#$

%&$"#%&$"#%&$"#%&$"#%&$"#

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

1. "weno5" 対流項

性能数値（64*64*64）

2. "oldroyd" Oldroyd rate項のテンソル積
3. "stress" 応力テンソルの算出
4. "div_str" 応力テンソルの発散
Ù5ÙI§lÂĲY£
8
46

"2(6 -0&1[/][GFlop/s]1 75*8 %[GB/s]"2(6 -0&1-0[/][GFlop/s]
+


 %
[GB/s]

gĵ|Ķ

46
-0

+
')

range

9.779

44.88316.155 35.065%

73.9085.965

1.909 37.283%

7.558

weno5

6.795

58.66012.482 45.828%

55.6667.227

1.226 45.170%

8.192

oldroyd

1.490

17.012

11.437 13.290%

12.3601.890

1.363 11.811%

8.295

div_str0.217

12.40943.1769.695%

0.887

3.041

10.690 19.008%

4.078

stress0.480

12.70340.5859.924%

1.525

4.167

12.713 26.046%

3.176

8
range
1
75*8
8
weno5
1
75*8

ÙĊĩĕďīĥĐZ>
46
range
weno5
oldroyd
div_strstress

' 




L1$3


'

L1$
'

dm

h9pf

8

2.07E+09

27.9%

1

2.01E+09

31.9%

8

9.73E+08

6.9%

1

9.33E+08

16.6%

8

6.24E+08

1

6.47E+088

7.69E+07

1
8
1

L2$3

swpf

L2$
'

60.1%

11.9%

9.01E+08

8.5%

91.5%

49.4%

18.8%

8.00E+08

7.2%

92.8%

93.1%

0.0%

4.97E+08

2.8%

97.2%

71.1%

12.4%

3.98E+08

2.4%

97.6%

63.8%

10.1%

26.1%

9.89E+07

7.6%

92.4%

63.6%

8.9%

27.5%

9.76E+07

7.0%

93.0%

11.8%

88.2%

0.0%

5.53E+07

2.9%

97.1%

7.15E+07

5.2%

94.8%

0.0%

5.54E+07

2.5%

97.5%

1.74E+08

24.1%

41.5%

34.4%

1.09E+08

2.7%

97.3%

1.51E+08

15.9%

43.8%

40.3%

1.08E+08

2.1%

97.9%

dm

pf

8
oldroyd
1
75*8
8
div_str
1
75*8
8
stress
1
75*8

,
#'.




SIMD!

$

2.68E+10

1.77E+11

1.79E+09

1.22E+09

9.45E+09(12.4%)(81.9%)(0.8%)(0.6%)(4.4%)(87.0%)

2.87E+10

1.77E+11

2.88E+09

8.59E+08

1.15E+10

1.88E+11

1.88E+11(13.0%)(80.2%)(1.3%)(0.4%)(5.2%)(87.0%)

1.32E+10

1.60E+11

1.83E+05

7.78E+08

4.66E+09

1.62E+11(7.4%)(89.6%)(0.0%)(0.4%)(2.6%)(90.8%)

1.49E+10

1.61E+11

1.17E+09

4.55E+08

6.51E+09

1.62E+11(8.1%)(87.5%)(0.6%)(0.2%)(3.5%)(90.8%)

7.60E+09

1.10E+10

1.15E+09

1.02E+08

1.94E+09

1.67E+10(34.9%)(50.5%)(5.3%)(0.5%)(8.9%)(76.5%)

7.75E+09

9.98E+09

1.18E+09

9.39E+07

2.09E+09

1.67E+10(36.7%)(47.3%)(5.6%)(0.4%)(9.9%)(76.5%)

1.40E+09

9.65E+08

4.53E+04

5.06E+07

4.20E+08

1.99E+09(49.4%)(34.0%)(0.0%)(1.8%)(14.8%)(70.3%)

1.39E+09

9.63E+08

5.76E+03

4.88E+07

4.25E+08

1.99E+09(49.1%)(34.1%)(0.0%)(1.7%)(15.0%)(70.3%)

1.75E+09

2.45E+09

5.30E+08

3.86E+07

7.11E+08

3.73E+09(31.9%)(44.8%)(9.7%)(0.7%)(13.0%)(68.1%)

1.74E+09

2.45E+09

4.18E+08

3.10E+07

5.87E+08

3.73E+09(33.3%)(46.8%)(8.0%)(0.6%)(11.2%)(68.1%)All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

付録

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

weno（512*128*128 vs 128*128*128 vs 64*64*64)! "! "

*%'(/402

 .301

*%'(/402.301



.301
+-

.301
 +-



.301 .301





,&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

,&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

サイズ毎の比較（比率）! "

*%'(/402

70

.301

52.5


.301
+-


35




.301

17.5




,

0
64*64*64
&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

128*128*128

512*128*128"整数ﾛｰﾄﾞ"整数ﾛｰﾄﾞストア待ち

I/Oアクセス待ち"整数ﾛｰﾄﾞ"浮動小数点ﾛｰﾄﾞ

整数演算待ち浮動小数点演算待ち

分岐命令待ちﾒﾓﾘｱｸｾｽ待ち"
命令フェッチ待ち

ﾒﾓﾘｱｸｾｽ待ち"バリア同期待ちuOPコミット

その他の待ちｷｬｯｼｭｱｸｾｽ待ち"
1命令コミットｷｬｯｼｭｱｸｾｽ待ち""整数レジスタ"浮動小数点レジスタ"2/3命令コミット

4命令コミット

書き込み制約"書き込み制約"(その他)"All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

oldroyd（512*128*128 vs 128*128*128 vs 64*64*64)! "

('$)(*$/402!



'&#(')#.3/1

 -2/0 .301

-2/0 *,
.301
 +-





@8?A
 :57<69;>=,

?7>@
946;58:=<+




&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

&)%#$

%($"#%($"#%($"#%($"#%($"#%($"#%($"#%($"#

サイズ毎の比較（比率）!

'&#(')#/613

50



37.5

 .512
.512

*,

25


4-10+

12.5



B:AC
<79>8;=@?+0

%($"#%($"#%($"#%($"#%($"#%($"#%($"#%($"#-12.5
64*64*64

128*128*128

512*128*128"整数ﾛｰﾄﾞ"整数ﾛｰﾄﾞストア待ち

I/Oアクセス待ち"整数ﾛｰﾄﾞ"浮動小数点ﾛｰﾄﾞ

整数演算待ち浮動小数点演算待ち

分岐命令待ちﾒﾓﾘｱｸｾｽ待ち"
命令フェッチ待ち

ﾒﾓﾘｱｸｾｽ待ち"バリア同期待ちuOPコミット

その他の待ちｷｬｯｼｭｱｸｾｽ待ち"
1命令コミットｷｬｯｼｭｱｸｾｽ待ち""整数レジスタ"浮動小数点レジスタ"2/3命令コミット

4命令コミット

書き込み制約"書き込み制約"(その他)"All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

div-str（512*128*128 vs 128*128*128 vs 64*64*64)!

!

$'+")*(0513 $'+")*(0513  /412
/412 ,.

 /412/412
,.












 
D9@E
;68=7:<?>-






D9@E;68=7:<?>-
D9@E ABC:<?>-&(%#$&(%#$
&(%#$&(%#$&(%#$&(%#$&(%#$&(%#$
D9@E ABC:<?>-&(%#$&(%#$&(%#$&(%#$&(%#$&(%#$&(%#$&(%#$

サイズ毎の比較（比率）!

60$'+")*(0513 45 /412
/412
,.

30

15

D9@E
;68=7:<?>-

0


D9@E
 ABC:<?>-&(%#$&(%#$&(%#$&(%#$&(%#$&(%#$&(%#$-15
64*64*64

&(%#$

128*128*128

512*128*128"整数ﾛｰﾄﾞ"整数ﾛｰﾄﾞストア待ち

I/Oアクセス待ち"整数ﾛｰﾄﾞ"浮動小数点ﾛｰﾄﾞ

整数演算待ち浮動小数点演算待ち

分岐命令待ちﾒﾓﾘｱｸｾｽ待ち"
命令フェッチ待ち

ﾒﾓﾘｱｸｾｽ待ち"バリア同期待ちuOPコミット

その他の待ちｷｬｯｼｭｱｸｾｽ待ち"
1命令コミットｷｬｯｼｭｱｸｾｽ待ち""整数レジスタ"浮動小数点レジスタ"2/3命令コミット

4命令コミット

書き込み制約"書き込み制約"(その他)"All Rights Reserved, Copyright © ISLiM, RIKEN 2011~stress（512*128*128 vs 128*128*128 vs 64*64*64)!

!

'(&$''-2.0 '(&$''-2.0 

 ,1./

,1./
,1./ )+,1./
)+








>6=?

835:479<;* >6=?
835:479<;*












%&$"#%&$"#%&$"#%&$"#%&$"#%&$"#%&$"#%&$"#

%&$"#%&$"#%&$"#%&$"#%&$"#%&$"#%&$"#%&$"#

サイズ毎の比較（比率）!

80'(&$''-2.0  ,1./

60,1./
)+



40
 >6=?
835:479<;*

20


%&$"#%&$"#%&$"#%&$"#%&$"#%&$"#%&$"#%&$"#

064*64*64

128*128*128

512*128*128"整数ﾛｰﾄﾞ"整数ﾛｰﾄﾞストア待ち

I/Oアクセス待ち"整数ﾛｰﾄﾞ"浮動小数点ﾛｰﾄﾞ

整数演算待ち浮動小数点演算待ち

分岐命令待ちﾒﾓﾘｱｸｾｽ待ち"
命令フェッチ待ち

ﾒﾓﾘｱｸｾｽ待ち"バリア同期待ちuOPコミット

その他の待ちｷｬｯｼｭｱｸｾｽ待ち"
1命令コミットｷｬｯｼｭｱｸｾｽ待ち""整数レジスタ"浮動小数点レジスタ"2/3命令コミット

4命令コミット

書き込み制約"書き込み制約"(その他)"All Rights Reserved, Copyright © ISLiM, RIKEN 2011~¸­¯ÙÁ¬É¬À³Ú¹»ÁÏY]Í×¿·«³Õ»¾3`WGf;

pWG8 «ËÖ
ZZ-EFSIÍ×¿±ÕÛSOR
3`Ü#Ý

H

2012-u11B1=
($iE. [ãáqXCnuâàËØº®³Â
au



Copyright 2012 FUJITSU LIMITEDSOR4DIVFc

pWGf;¥§/V• ZZ-EFSI!Ì«½Ù.ªÍ×¿±ÕÛSORd^• »ÂÕ­Ã«³¼»• oª±ÕÛIÜ8Ý¨ »ÂÕ­Ã«³¼»gN ²ÒÀ¹ÓDªU• JacobiKJh£'<i,Í×¿±ÕÛSORoTÍ×¿±ÕÛSORop3(:,:,:)op4(:,:,:)op1(:,:,:)op2(:,:,:)op(:,:,:)

's 3H
1

½Û»·ÛÃlpWGf;¥§/V

i,Í×¿±ÕÛSORoTÍ×¿±ÕÛSOR

Jacobi !!"  !#%)  !%$  !!"&$   !!"&$#" !
 !#"   !#"(& )& *& !& !#"# "$ ! & !#"(# (# (# !"%$ "" (#    (#    (#   #" &  
!   *& ! )& !  (& !  (& !  )& !   *& !#"!& !  """"! !  !  !# "$    !!"  !#%)  !%$  !!"&$   !!"&$#" !
 !#"# # #    !#"(& )& *& !& !#"# "$ ! ! ! !   !#"(# (# (# !"%$ "" #    #     &" #   #"    
!    *& !  )& !  (& !  (& !  )& !   *& !#"!& !   """"! !   !   !# "$    !!"  !#%)  !%$  !!"&$   !!"&$#" !
 !#"   !#"(& )& *& !& !#"$ ! !' & !"%$ ""      #" &  
!   *& !  )& !  (& !  (& !  )& !   *& !#"!& !  """"! !'  !  !$   2

Í¹Ù3`J! SORÞDIVª16node(2x2x4)Ç­ÊÖÀÃO&3`!  FX10 'b?rªO&(time·ÍÙÃreal)
FX10


Thread

'b?r
Ü\Ý

»µÛ×

Thread

'b?r
Ü\Ý

»µÛ×

1

64.80

1.00

1

34.74

1.00

8

26.91

2.41

16

12.64

2.75

!  FX10 'b?rª(«ËÖ¨TIME)
FX10


ThreadSolver Main
Ü\Ý

»µÛ×

ThreadSolver Main
Ü\Ý

»µÛ×

1

21.24

1.00

1

24.14

1.00

8

3.98

5.34

16

2.96

8.16

3

Copyright 2012 FUJITSU LIMITEDSOR4(color1-1) PA4#()
! ß×ÛËPA4#

Performance

SIMD

(sec)

sor41 T0
sor42 T0
sor43 T0
sor44 T0
sor45 T0
sor46 T0
sor47 T0
sor48 T0
Cache

sor41 T0
sor42 T0
sor43 T0
sor44 T0
sor45 T0
sor46 T0
sor47 T0
sor48 T0

0.25
0.24
0.24
0.24
0.24
0.24
0.24
0.24


MFLOPS



5.30%
5.52%
5.50%
5.51%
5.52%
5.57%
5.54%
5.52%

848
883
880
882
883
891
887
883

MIPS




769
802
800
803
802
809
806
802

2.12E+08
2.12E+08
2.12E+08
2.12E+08
2.12E+08
2.12E+08
2.12E+08
2.12E+08

L1I 
(/
 )L1D 
(/ )


L1D

0.05%
0.05%
0.05%
0.05%
0.05%
0.05%
0.05%
0.05%

8.52%
8.50%
8.51%
8.50%
8.46%
8.46%
8.46%
8.46%

1.06E+08
1.06E+08
1.06E+08
1.06E+08
1.07E+08
1.06E+08
1.06E+08
1.07E+08

9.05E+06
9.05E+06
9.06E+06
9.05E+06
9.01E+06
9.01E+06
9.01E+06
9.01E+06

SIMD(/
 )SIMD(/SIMD SIMD SIMD  SIMD
(/SIMD  (/SIMD   (/SIMD 
 )
 )
 )

30.97%
30.91%
30.92%
30.87%
30.94%
30.95%
30.92%
30.91%

33.25%
33.25%
33.25%
33.25%
33.28%
33.28%
33.25%
33.25%

81.48%
81.48%
81.48%
81.46%
81.50%
81.50%
81.48%
81.48%

L1D dm(/L1D  )L1D 
hwpf 
(/L1D  )L1D 
swpf 
(/L1D  )L2 (/
 )20.22%
20.20%
20.20%
20.16%
20.01%
20.11%
19.97%
20.12%

79.78%
79.80%
79.80%
79.84%
79.99%
79.88%
80.02%
79.88%

0.00%
0.00%
0.00%
0.01%
0.00%
0.00%
0.00%
0.01%

8.42%
8.41%
8.38%
8.40%
8.34%
8.24%
8.28%
8.35%

0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%

L2

0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%



ÐÑÖÛ»×ÛËÀÂÆÀ³¨R 3`ª¨ |vÎ»:ªN¦¿ÓÛÅÙ´ªb2c¨xyu¿ÓÛÅÙ´ªb }wz{

L2 
dm 
(/L2  )

L2 
pf 
(/L2  ) (GB/sec) (8th)(GB/sec)

L2  
(GB/sec)

14.16%
13.06%
13.00%
13.47%
13.06%
12.70%
12.88%
13.08%

85.84%
86.94%
87.00%
86.53%
86.94%
87.30%
87.12%
86.92%

5.71
5.72
5.70
5.71
5.69
5.63
5.65
5.69

45.71
45.79
45.62
45.68
45.52
45.04
45.24
45.50

4.63
4.82
4.81
4.82
4.79
4.84
4.82
4.80

8.95E+06
8.95E+06
8.92E+06
8.94E+06
8.89E+06
8.78E+06
8.82E+06
8.89E+06

4

Copyright 2012 FUJITSU LIMITEDSOR4DIVPA4#()
! SOR¿ÓÛÅÙ´TSORÞDIVPA4#

Performance

SIMD

(sec)

sor4div1 T0
sor4div2 T0
sor4div3 T0
sor4div4 T0
sor4div5 T0
sor4div6 T0
sor4div7 T0
sor4div8 T0

0.14
0.12
0.13
0.12
0.13
0.12
0.13
0.12


MFLOPS



MIPS




8.86%
10.13%
9.62%
10.21%
9.66%
10.12%
9.93%
10.12%

2142
2439
2326
2471
2335
2447
2400
2447

1.99E+08
1.99E+08
1.99E+08
1.99E+08
1.99E+08
1.99E+08
1.99E+08
1.99E+08

1417
1620
1539
1633
1545
1619
1589
1619

SIMD(/
 )SIMD(/SIMD SIMD SIMD  SIMD
(/SIMD  (/SIMD   (/SIMD 
 )
 )
 )

19.86%
19.94%
19.86%
19.83%
19.86%
19.86%
19.87%
19.86%

33.34%
33.34%
33.34%
33.31%
33.37%
33.34%
33.34%
33.34%

99.91%
99.91%
99.91%
99.91%
99.91%
99.91%
99.91%
99.91%

L1D dm(/L1D  )L1D 
hwpf 
(/L1D  )L1D 
swpf 
(/L1D  )L2 (/
 )16.21%
2.79%
2.35%
2.55%
2.60%
2.72%
2.60%
2.40%

83.78%
97.20%
97.65%
97.44%
97.40%
97.27%
97.39%
97.60%

0.01%
0.01%
0.01%
0.01%
0.01%
0.01%
0.01%
0.01%

3.55%
3.58%
3.57%
3.59%
3.55%
3.55%
3.58%
3.55%

0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%

0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%

ÐÑÖÛ»×ÛËÀÂÆÀ³¨Cache

sor4div1 T0
sor4div2 T0
sor4div3 T0
sor4div4 T0
sor4div5 T0
sor4div6 T0
sor4div7 T0
sor4div8 T0

L1I 
(/
 )L1D 
(/ )


L1D

0.02%
0.02%
0.02%
0.02%
0.02%
0.02%
0.02%
0.02%

4.90%
4.24%
4.22%
4.23%
4.23%
4.23%
4.23%
4.22%

1.21E+08
1.21E+08
1.21E+08
1.21E+08
1.21E+08
1.21E+08
1.21E+08
1.21E+08

5.96E+06
5.15E+06
5.12E+06
5.13E+06
5.13E+06
5.14E+06
5.14E+06
5.13E+06



5

L2



4.31E+06
4.34E+06
4.33E+06
4.35E+06
4.31E+06
4.31E+06
4.34E+06
4.31E+06

L2 dm (/L2  )

L2 
pf 
(/L2  ) (GB/sec)

L2  
(GB/sec)

1.27%
1.36%
1.13%
1.19%
1.13%
1.48%
1.23%
1.35%

98.73%
98.64%
98.87%
98.81%
98.87%
98.52%
98.77%
98.65%

5.12
5.48
5.17
5.46
5.19
5.38
5.33
5.43

5.43
5.37
5.07
5.40
5.11
5.36
5.25
5.34

Copyright 2012 FUJITSU LIMITED »µºÓÛÖÙ´k()! ÐÑÖ»×ÛËÀÂÆÀ³×ÛËªSWPL »µºÓÛÖÙ´kªb
L*:QP^09 ªbÜSORÞDIVÝ
! 7&°Ë¹ÔÙ! °ÖºÄ×
-Kfast,parallel,ocl,ilfunc,preex,array_private,openmp,simd=2! SWPLk-Kfast,parallel,ocl,ilfunc,preex,array_private,openmp,simd=2,noalias=s-Knoalias=sue>(V5/@¥§6_)·ÙÈ­Õ) Ì­Ù¾%: Ì­Ù¾%:¤¾Û¶ÀÂ%:uuu
ut"ªS£ Amªbª7Z¡~| »µºÓÛÖÙ´kªb L*:QP^0N+ ÐÑÖ»×ÛËÀÂÆÀ³¨¢ ÐÑÖ3`1j3` %©¦
Performanceorg T0noalias T0

SIMD


(sec)


 MFLOPS


MIPS




0.14140.1406

8.79%
8.84%

2125
1821

1.99E+08
1.99E+08

1406
1414

SIMD(/
)SIMD(/SIMD SIMD
(/SIMD  )SIMD 
(/SIMD   )SIMD
(/SIMD  )19.86%
23.30%

33.34%
33.34%

99.91%
99.83%

0.00%
0.00%

0.00%
0.00%

L1D 
dm
(/L1D  )L1D 
hwpf 
(/L1D  )L1D 
swpf 
(/L1D  )16.21%
15.74%

83.78%
84.26%

0.01%
0.01%

Cache
L1I 
(/ )org T0noalias T0

L1D 
(/
 )

0.02%
0.03%




4.90% 1.21E+08
4.94% 1.20E+08

L1D



5.96E+06
5.92E+06

L2 (/
 )

L2



3.55% 4.31E+06
3.61% 4.33E+06

L2 
dm 
(/L2  )

L2 
pf 
(/L2  ) (GB/sec)

L2  
(GB/sec)

1.27%
1.46%

98.73%
98.54%

5.12
5.14

5.43
5.39

6

Copyright 2012 FUJITSU LIMITEDSOR4DIVPA4#(FX10)
! ß×ÛËSORÞDIV(¿ÓÛÅÙ´T)PA4#

Performance

SIMD

(sec)

sor4div1 T0
sor4div2 T0
sor4div3 T0
sor4div4 T0
sor4div5 T0
sor4div6 T0
sor4div7 T0
sor4div8 T0
Cache

sor4div1 T0
sor4div2 T0
sor4div3 T0
sor4div4 T0
sor4div5 T0
sor4div6 T0
sor4div7 T0
sor4div8 T0

0.09
0.08
0.07
0.08
0.08
0.07
0.07
0.07


MFLOPS



7.52%
8.96%
9.00%
8.92%
8.94%
9.05%
9.04%
9.00%

1112
1324
1330
1319
1321
1339
1336
1330

MIPS




1690
2005
2010
2002
2002
2034
2023
2006

9.92E+07
9.94E+07
9.97E+07
9.92E+07
9.94E+07
9.94E+07
9.94E+07
9.97E+07

L1I 
(/
 )L1D 
(/ )


L1D

0.03%
0.03%
0.03%
0.03%
0.03%
0.03%
0.03%
0.03%

4.91%
4.25%
4.22%
4.23%
4.23%
4.24%
4.23%
4.21%

6.09E+07
6.06E+07
6.10E+07
6.08E+07
6.09E+07
6.09E+07
6.08E+07
6.10E+07

2.99E+06
2.58E+06
2.57E+06
2.57E+06
2.57E+06
2.58E+06
2.57E+06
2.57E+06

SIMD(/
 )SIMD(/SIMD SIMD SIMD  SIMD
(/SIMD  (/SIMD   (/SIMD 
 )
 )
 )

19.76%
19.82%
19.87%
19.77%
19.81%
19.75%
19.82%
19.90%

33.29%
33.34%
33.34%
33.29%
33.34%
33.34%
33.34%
33.40%

99.91%
99.91%
99.91%
99.91%
99.91%
99.91%
99.91%
99.91%

L1D dm(/L1D  )L1D 
hwpf 
(/L1D  )L1D 
swpf 
(/L1D  )L2 (/
 )16.46%
3.17%
2.74%
2.96%
3.02%
3.16%
2.98%
2.86%

83.53%
96.82%
97.25%
97.03%
96.96%
96.82%
97.01%
97.12%

0.01%
0.02%
0.02%
0.02%
0.02%
0.02%
0.02%
0.02%

3.63%
3.70%
3.67%
3.72%
3.62%
3.60%
3.67%
3.58%

7

0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%

L2

0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%
0.00%



2.21E+06
2.25E+06
2.24E+06
2.26E+06
2.20E+06
2.19E+06
2.23E+06
2.19E+06

ÐÑÖÛ»×ÛËÀÂÆÀ³¨L2 dm (/L2  )

L2 
pf 
(/L2  ) (GB/sec)

L2  
(GB/sec)

2.57%
2.85%
2.33%
2.20%
2.49%
2.16%
2.42%
2.26%

97.43%
97.15%
97.67%
97.80%
97.51%
97.84%
97.58%
97.74%

4.52
4.61
4.60
4.62
4.54
4.50
4.62
4.52

4.29
4.39
4.40
4.38
4.38
4.44
4.43
4.39

Copyright 2012 FUJITSU LIMITEDMf;
!<%
FX1

1CPU
1CPU
32GB
16GB
SPARC64™VIISPARC64™VIIIfx
2.5GHz2.0GHz4core
8core
L1*# 
L1*# 
64KB 1
32KB 1
L1"  L1" ->
64KB 1
32KB 1
L2 
L2 
6MB &=
6MB &=
1 /:10GFLOPS
16GFLOPS
1/:
40GFLOPS128GFLOPS
1"/:
40GFLOPS128GFLOPS
1/:
13.7GB/s
46.2GB/s
1"/:
13.7GB/s
46.2GB/s

CPU0
->
(7
)30
core0

"

CPU

$9.
48/:
(5;/:)
 ",'/:

*:STREAM benchmark(6+?FX1

FX10
1CPU
32GB
SPARC64™ IXfx
1.848GHz
16coreL1*# 
32KB 1
L1" 32KB 1
L2 
12MB &=14.78GFLOPS
236.54GFLOPS
236.54GFLOPS
64.0GB/s
64.0GB/s

Triad/:$9.48/:" /:2)

 2$9.
48/:
" /:2 "" /:21 /:1/:
1"/:
1/:
1"/:

FX1
-


1.00
1.00
1.00
1.00
1.00
9

FX10
0.92
1.85
1.85
1.39
1.39
Copyright 2012 FUJITSU LIMITED&)+-/'  !ö "$÷£2Q°·põ ä¦õ É¶õõ ĔĔúċČĊĒ ŏ ĔĢĦĞĝõ ĔęġĤĜĝġúċĝěĜõ ČġĥęġĤĝĥĪõ ĊĢėĦĤęĘõ ĒğĥģĖĤĢĦġĘ Ŏ¨ ´ ŉıśĬį   ¤ ?
 Â : ŮƄƉƎƑŮƊƐŲžŸťŦŢŎ° · ç « İƀƏůŦŪŸŉç « ĽŝŃô T a   b Ø ï   ŮƄƉƎƑŮƊƐŲžŸťŦŢŉıŜĭļŎƀƏůŦŪŸŉŏĬƋŤžŭŤŧƐŰ& ä ŉŎŮƄƉƎƑŮƊƐŲžŸ
ťŦŢş

ō; ĺç « ŴƉƑźƐūşË ĲĬô l Æ Ò º  ş¥ ĲŃN Ð  Ó ¿ ŌŮƄƉƎƑŮƊƐş

S ¢ ľĬłŎ} 0 l ş² ŀş­  Ŏ ŇōÄ ĲňĲŜĭõ

õ  " ō%  ŃÇ © ōV ŀŜ ª ŊľňĬ " ş' śç ĸ' ë ŀŜz  Ĭæ ş ņŃ¹ +  ª ŊĲņŃÇ ©  L Ŏâ  ōųƆƑůş ĴŜ ª ķË ŞŝňĲŜĭÜ _ Ĭ ŒŎųƆƑůŎY ŌĲ ª ŊľňĬì  Ø ï  ōřśÇ © Ŏŕş  ŀŜ ª  ķç « ĽŝŃĭļŎq  ŏĬô T a   bØ ï   Ŋ> ŐŝňĵśĬ È ¬ ōŏ ċČĊĒöċĝěĜõ ČġĥęġĤĝĥĪõ ĊĢėĦĤęĘõ ĒğĥģĖĤĢĦġĘ÷ ª Ŋľň¯ ŚŝňĲŜĭċČĊĒ  ª ŏĬ L â ĶŚØ ï  ş " ŎÇ © â ōì  ĽŁĬłŎ  ŉ« ¤ ŀŜ ŧŻƍũōřśÇ © ş  ĽŁŜŗŎŉıŜĭċČĊĒ  ª Ŏ½ a Ř0 ¡ ş ĻŜ ĽŚōŏ ċČĊĒ  ª
DEVELOPMENT OF HIFU SIMULATOR FOR LARGE-SCALE COMPUTING A Ŏç « ōŏĬØ ï  ķ " şŋŎřĳō u ŀŜĶş½ T ō¯Ŝj Î ķıśĬy ľĲŮƄƉƎƑ

63ŮƊƐŲžŸťŦŢşç « ľňĸŃĭ H < ŉŏłŎl Æ ōŇĲňH < ŀŜĭõ (.%,*õ ĔĔúċČĊĒ ŉŏØ ï  ķ " ş u ŀŜà µ ş# ¢ ľĬĽŚōì  Ø ï  ōřśc ĸ× ļĽŝŜa & ] Ŏ| è K 2 şŮƄƉƎƑŮƊƐŀŜĭ ō ª â  ŉŎ¢ Ô ş| è « [ ¬ ōŮƄƉƎƑŮƊƐ
ŀŜķĬØ ï  ŏ " ş u ŀŜŃŖĬ ª â  = Ù ŉ× ļņňĲŜ¢ Ô ŗ9 śr ĳj Î ķıŜĭĴŐĬñ â şV Ô ŊľŃŮƄƉƎƑŮƊƐŎI : Ĭñ Ê ó ōřś8 W ľŃØ ï  ķ  ­ ¬ ŊľŃì   L Ŏp ō ¬ Ōì   ş ŜI : ķıśĬ­ ¬ Ç ©  L Ŏ ^ ŌÀ Ã ōt  ş7 œŀķıśĬļŝŚş

 ŀŜōŏÇ © â Ü  ŎZ p ¬ ð F ńĺŉŌĹĬ` ¼ B Ōð F şÒ º V Ô Ŋ

Figure 20. Voxel model of human skull and the array transducer bounded by the numerical domain. The colored contour of the cross section represents the distribution of thevolume fraction of bone. The numerical domain is 120×160×120 mm and is resolved by
ŀŜj Î
ķıŜĭõ
DEVELOPMENT
OF HIFU SIMULATOR FOR LARGE-SCALE COMPUTING
65
600×800×600 grid points with grid spacing of 0.2 mm.

õõFigure 21. Focusing ultrasound propagation through the human skull using an array transducer without
control.
Distribution offrom
the instantaneous
Figure 23. Schematic diagram of the data flows to the HIFU simulator: volumefocus
data
constructed
CT pressure and maximum pressure is visualized with theskull bone: (a) Instantaneous pressure; and (b) Maximum pressure ( pmax = 2.50 MPa).

C ƔĬċČĊĒ ŮƄƉƎƑŮƊƐ k C õdata of a living human body and the volume data of the signed distance function (SDF) representing anõobject defined by CAD are employed for an HIFU simulation.
Copyright ! 2010 John Wiley & Sons, Ltd.

Int. J. Numer. Meth. Fluids 2011; 65:43–66
DOI: 10.1002/fldõ m Å  ĮŎ n şŮƄƉƎƑŮƊƐV Ô ŊŀŜŃŖĬÒ º V Ô ŎƇŷƍd  ŘÇ ©  Ä Řd  Ŋfocal point
placementat the target even when the ultrasoundpropagatedthrough
an inhomogeneous ŉŏĬÿĈćđ ŉ9ĲņŃşŋŎřĳōŮƄƉƎƑŮƊƐō9śÚ ŠŉËĹĶķ@ò ŉıŜĭĔĔúċČĊĒ
medium.
As a realistic application, transcranial HIFU therapy for a brain tumor was modeled well by the
HIFU simulator, where inhomogeneity caused not only displacement of the focal point but also
diffusion of the focusing ultrasound. Even in such cases, phase control based on pre-computation
was highly effective for solving both problems.

When considering pressure waves with viscous attenuation, the momentum equation is
described as
"
#
$%
!
1
!u i
!p
!m
#m ekk $ij +2%m eij − ekk $ij ,
(2)
+
=−
3
!t
!xi !x j

f ĽŝŃ 

3 ª §  şƂŪűƍ¸ è ōã Ä ľŃƂŪűƍ  Ƈŷƍş ¥ ŀŜŉļŎ@ ò ş

where eij = 1/2(!u i /!x j +!u j /!xi ) is the deformation tensor, and #m and %m are the bulk and shearÑ  ľňĲŜĭÒ
ŉthe¥ ŀŜƂŪűƍŏ
ýĠĠisŎh¿sinceŌshearş¸ èōD viscosity,
respectively.ºHere,constitutive equation
for 
fluid
used,
modulusof ō ¥ ŀŜj Î ķı
tissueexceptºforÐbone
is negligibly
than bulk modulus. Althoughbone should be treated asĲĬ0 ¡ řĹÁ  ķ
śĬłŎ
 ŏî
^ ōNsmallerĸĹŌŜĭłŎŃŖĬċĎć
; ĺōŴƉƑźƐūşË
elastic body, bone is modeled as a multicomponent mixture to take into account not shear elasticity
f ŚŝŜ
ōŀŜj
Î ķıŜĭõ
butheterogeneities
of bones
following Aubry et al. [7], in fact CT images can give the internal
structure of bones. They show that the simulated wave fronts passing through such modeled bonesõ Ø ï  «  Ì Ä ŊľňŢƎŤE ŎŸƋƐŰŷƉƑŭƑş ¥ ľňĵśĬ Ň ŇŎŸƋƐŰŷƉƑŭ
of a skull are very close to the corresponding experimental wave fronts propagation through theskull.
The®constitutive
equationfor fluid
can be acceptablefor
discussing
focusing
ultrasoundƑŎşá ' ō*g ŀŜōřśĬØï  ŎŎ Ä theŘNĸĽş*g ŉĸŜÌ Ä şV Ô Ŋľň
through bone. Modeling of bone as anisotropic elastic material will be studied in future to achieve
ĲŜĭõ
more
accurate HIFU simulation.
The
to material compressibility
is higher
thandueŀŜG
to the convectiontermsõ  nonlinear
ŏÍ weffectŎodue& ĶŚŌśĬM
O Ö  Ŏï
 Ŏ
uthat
ōV
± b ş¸è ġ  Ĭ| è  ½ aof continuity and momentum equation depending on the amplitude and nonlinearity coefficient.
Ŏ} ê
\&
ōřņňí
v 2intoľĬĊĈđĈ
nonlinearō Ŀň|«[
şÒº ŀŜĭ
( 2 ŏÒ º ð F şż
Tait’sequation
is employed
to takeaccount theeffectèdue
to theequationof stateof the medium,ƑŹ4  ŉð F & - ľĬżƑŹ" ŏƍƑƀ&- ŀŜŽŤſƌŵŹ ( şs ¥ ľňĲŜĭłŎ ( 2 ō#$
p + A1k 1/&k
ŏ ĐĎċĉďĉ ş ¥ ľňĵśĬð
ŶƑſƍ o ŌŋŎç!k =F
!k0& - Ŏã ( ƆƇƌ» £ Ĭ! % . * g ĬÝ (3)p0 + A1k«   ş0 ¡ 2 ľňĲŜĭƀƏūƋƅ  ŏ ĊĢģĥĖġąü ŉ o ĽŝňĵśĬĐĎċĉďĉ Ŏ* g ōé ŞŜ

2 /& − p and & = (B/A) +1. Here, B/A is the nonlinearity coefficientwhere A1k = !k0 csk0
0
k
k
k
pŏ
ćøøş
¥ ľňĲŜĭƁŵŸŰƃŵŸâ
& ŏtheĊĢģĖĥģĖġąü
ŉŬƑŷţƐūĽŝňĲŜĭõ
[13,
14].
The density
and sonic speed of medium from
Tait’s equation
are used to obtain thedensity and sonic speed of mixture.

õ G ± b ŊľňĬÖ å  P b Ŋß 1 å  P b ş¥ ĲŜĭƒ  Õ x 6  Ɠõ G ± b ş¸ è Ɩ ½ a

2.2.
matchedboundaries
 iPerfectly\ & ŉí
v 2layers
ľĬ|forènonreflectingz;ŏ ½ a Ŏ i \ & ş¥ ĲŜĭõA
Öperfectlyå  Pmatchedb Ɨõ layer (PML) [15] is employed to eliminate the reflection of ultrasound at theboundary of a numerical domain. In the region of PML, Equation (1) is split for each component
with a damping term by decomposing the pressure as p = px + p y + pz :1 ⎛ ∂ px
⎞ ∂u$
+ σ x px ⎟ + # = 0,
2 ⎜
!u
⎝ ∂t
⎠1 ∂x ! px
ρ m csm+'x px +
= 0,
2
!
c
!t
!x
m⎞ sm∂v
1 ⎛ ∂ py$
+ σ y py ⎟1+ # !=p0,
2 ⎜⎝ ∂t⎠ ∂y y +' y p y + !v = 0,
ρ m csm(4)2!m csm!t!y
1 ⎛ ∂ pz∂w⎞$
+ σ z pz ⎟1+ # !=p0z
2 ⎜
!w
⎝
⎠
ρ
c
∂t
∂z
p
+'
= 0.
m sm
z z +
õ
2
!m csm
!t õ
!z

ßthe
1 sameå way,Pb
IntheƗõdamping term is introduced to the momentum equation without decompositionof the velocity according to PML [15],
#
$
"
#
$%
!p
!
1
!u i
!m
#m ekk $ij +2%m eij − ekk $ij ,(5)++'i u i = −3!t!xi !x jõõInt. J. Numer. Meth. Fluids 2011; 65:43–66
DOI: 10.1002/fld

Copyright ! 2010 John Wiley & Sons, Ltd.

  õ l Æ  R ōŏĬ£ 2 Q ° · p Ŏ ďČćć ĵřő Ċēý ş¥ ĲŃĭõ  õĮŎƀƏūƋƅŎS Ë | è ŏ þüüûýüþă ³ ŉıśĬļŝŎĲĹŇĶŎŴƉƑźƐūş{ ŀýĂăûĄĂÿý ³ Û ô Þ 2 ŀŜōřśĬōo / ľŃĭļŝŏĬƀƏūƋƅŎŴƉƑźƐūōřśĬŨƈŵŮƉƄŰŎ Ř º å Ŏ,  şË ĲĬłŎÁ  Ĭ º | è ō5 ŖŜ$ £ | è Ŏ- : ķM ĲĬėĖğĕĥùõ ėĖğĕħùõ ėĖğĕĨùõ ėĖğĕĦ Ŏô Þ 2 şS ¢ ľŃĭÓ ¿ ŏ  Õ x  đĒčĉýā Ŋ đĒčĉĂ ş6  Ŏĭõ õ Ċēý ŉ) ¥ ŉĸŜU J Ý ƀƏžšŤƋş ķÏ Ú ŔŝŜĽŝŜķ& ĶśĬ

ķ& ĶņŃĭõō ĐĎĆďćĂĀīĚĩ ŉŎl Æ ş ľŃĭ¾ ƕ Ŏl Æ ;ŊľňĬ 1 X w   º e Ņķ,  ĽŝĬl Æ ķ;  ŀŜķ~ e

ZZ-HIFU評価報告
野田

茂穂、沖田

浩平、青山

幸也

11/10/2011 @ SS研マルチコアクラスタ性能WG

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

アプリケーション紹介

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

number, we can assume adiabatic change of the medium and neglect the advection term during
ultrasound propagation. The mass conservation equation for the mixture then becomes
1 ! p !u j
= 0,
+
2 !t
!mDEVELOPMENT
csm!x
OF jHIFU SIMULATOR FOR LARGE-SCALE COMPUTING(1)65

高密度焦点式超音波法ソルバ
sound in mixture, csm , arewhere the mixture density, !m , and the adiabatic speed of !
! defined in
DEVELOPMENT OF HIFU SIMULATOR FOR LARGE-SCALE COMPUTING

63

2
2 =
terms of the volume fraction of the medium, f k , as !m = k f k !k and 1/!m csm
k f k /!k csk
under the assumption of a constant volume fraction. The sound source, f p A cos("t), is added to• 超音波を集束させ，焦点で加熱によって腫瘍を焼灼すthe right-handof UltrasoundEquation(1) to represent the ultrasound generated by the transducers.
る治療法（HighIntensityside
Focused: HIFU）- 超音波が体内を伝播する過程や，温度分布および治When considering pressure waves with viscous attenuation, the momentum equation is
療部位の時間発展をシミュレーション
describedas- 医療画像から作成されたボクセル人体モデルを利用
"
#
$%
!
1
!u i
!p
- 治療機器による焦点制御が困難な体深部の腫瘍治療!m#m ekk $ij +2%m eij − ekk $ij ,(2)+=−におけるシミュレーションによる焦点制御支援
3!t!xi !x j- 各個人の体型に対応したシミュレーションによる術

Figure 20. Voxel model of human skull and the array transducer bounded by the numerical domain. The colored contour of the cross section represents the distribution of thevolume fraction of bone. The numerical domain is 120×160×120 mm and is resolved by
600×800×600 grid points with grid spacing of 0.2 mm.

前の治療計画の検討
whereeij = 1/2(!u i /!x j +!u j /!xi ) is the deformation tensor, and #m and %m are the bulk and shear
viscosity,
respectively. Here, the constitutive equation for fluid is used, since
shear modulus of
63
る安全性の検討
tissueexceptforboneisnegligibly
smallerthanbulk
modulus.
Althoughbone
shouldbe treated as• 多成分からなる媒質中の音波の伝播に対する基礎式を
elastic body, bone is modeledFigure
as a23.
multicomponent
mixtureinto
account
notelasticity
Schematic diagram of thedata flowsto
to takethe HIFU
simulator:
volumedatashearconstructedfrom CT
空間n次，時間2次精度の有限差分法によって離散化
of a living human body and the volume data of the signed distance function (SDF) representing an
し，FDTD法に準じて時間発展を行う．領域分割とルー
but heterogeneities of bones data
following
Aubry
et
al.
[7],
in
fact
CT
imagescangivetheinternal
object defined by CAD are employed for an HIFU simulation.
プ分割によるハイブリッド並列化によって大規模並列
structure of bones. They show that the simulated wave fronts passing through such modeled bones
計算が可能となっている．
focalcorresponding
point placement at theexperimental
target even when theultrasoundpropagatedthrough an throughinhomogeneousof a skull are very close to the
wave
frontspropagationthe• Fortran90, C++medium.
skull.
The
constitutive equation
for
fluid
can
be
acceptablefor
discussing
thefocusing
ultrasound• MPI,
OpenMP,SPHEREAs a realistic application, transcranial HIFU therapy for a brain tumor was modeled well by thethrough bone. Modeling of boneanisotropic
elastic material
willstudied ofin thefutureto achieve
HIFU assimulator,
where inhomogeneity
caused not
onlybedisplacement
focal point
but also
diffusion of the focusing ultrasound. Even in such cases, phase control based on pre-computation
more accurate HIFU simulation.
was highly effective for solving both problems.
The nonlinear effect due to material compressibility is higher than that due to the convection terms
All Rights Reserved,
Copyright© ISLiM, RIKEN 2011~ coefficient.
of continuity and momentum equation depending on theamplitude
andnonlinearity
ACKNOWLEDGEMENTS
Figure 20. Voxel model of human skull and the array transducer bounded by the numerTait’s equation is employed to
take
into
nonlineareffectdue
domain.
The accountcolored contour ofthe
the crossrepresents theof the to the equation of statePart ofical
this
study
by thesection‘Researchanddistribution
Developmentof the Next-Generation Integrated
volumefractionofwasbone. supported
The numerical domain
is 120×160×120mm
andis resolved by
600×800×600
grid points
spacing ofof
0.2Education,mm.
Living Matter Simulation’projectof with
the grid
Ministry
Culture, Sports, Science and Technology.
of the medium,The calculations were performed using the RIKEN Integrated Cluster of Clusters (RICC).
#$
p + A1k 1/&k
REFERENCES!k = !k0
(3)
p0 +
A1k
1. Duck FA, Baker AC, Starritt
HC. Ultrasoundin Medicine. Medical Science Series. Institute of Physics Publishing:- 治療機器の設計および認可に向けた臨床試験におけ

DEVELOPMENT OF HIFU SIMULATOR FOR LARGE-SCALE COMPUTING

Figure 21. Focusing ultrasound propagation through the human skull using an array transducer without
focus control. Distribution of the instantaneous pressure and maximum pressure is visualized with theskull bone: (a) Instantaneous pressure; and (b) Maximum pressure ( pmax = 2.50 MPa).
Copyright ! 2010 John Wiley & Sons, Ltd.

Int. J. Numer. Meth. Fluids 2011; 65:43–66
DOI: 10.1002/fld

Bristol and Philadelphia, 1998.

2 /& − p 2. and
Kennedy JE,=
ter(B/A)
Haar GR, Cranston
D. High intensity focused ultrasound: surgery of the future? The British
where A1k = !k0 csk0
0 Journal &ofk Radiology
k +1. Here, B/A is the nonlinearity coefficientk2003; 76:590–599.
3. Umemura
Kawabata
K, Sasaki fromK. In vivothe
acceleration
tissue areheatingusedby microbubble
agent. IEEE
[13, 14]. The density and sonic
speedS, of
mediumTait’sof ultrasonicequationto obtain
theTransactions on Ultrasonics, Ferroelectrics, and Frequency Control 2005; 52:1690–1698.
基礎式と計算手法
density and sonic speed of mixture.
4. Coussios CC, Roy RA. Applications of acoustic and cavitation to noninvasive therapy and drug delivery. Annual

Review of Fluid Mechanics 2008; 40:395–420.
5. Fink M. Time reversal of ultrasonic fields. Part I: Basic principles. IEEE Transactions on Ultrasonics,
Ferroelectrics, and Frequency Control 1992; 39(5):555–566.
• 式１、式２をFDTDにて計算
6. Fink M, Montaldo G, Tanter M. Time-reversal acoustics in biomedical engineering. Annual Review of Biomedical
Engineering 2003; 5:456–497.
• 時間積分は2次精度の陽解法ですが、拡散項がある場合は1次精度の陽解法
7. Aubry J-F, Tanter M, Pernot M, Tomas J-L, Fink M. Experimental demonstration of noninvasive transskull
adaptive focusing based on prior computed tomography scans. Journal of the Acoustical Society of America• 空間は６次精度中心差分
1993; 113(1):84–93.
8. Sun J, Hynynen K. Focusing of therapeutic ultrasoundskull: a numerical study. Journal of thex throughy a humanz
Acoustical Society of America 1998; 104(3):1705–1715.
式１：質量保存式（PML:Perfectly
matchedlayer）
9. Curra
FP, Mourad
PD, Khokhlova VA, Cleveland RO, Crum LA. Numerical simulations of heating patterns
and tissue temperaturex response due to high-intensity focused ultrasound. IEEE Transactions on Ultrasonics,
Figure21.
Focusing
ultrasoundpropagation Control
thehuman47(4):1077–1089.
skull using an array transducer without
Ferroelectrics, and Frequency
2000;
x throughx pressure
focus control.
of the instantaneousand maximum pressure is visualized with the
2 Distributionx (a)10. HariharanP,
Myers
MR, Banerjee
RK.
HIFU procedures
moderate= 2.50MPa). intensities-effect of large blood vessels.
skull
bone:
Instantaneouspressure;
and(b)Maximumpressure ( pmaxat
m smin Medicinex andx Biology 2007; 52:3493–3513.
2
Physics
Copyright
!
2010
John
Wiley
&
Sons,
Ltd.
Int.
J.
Numer.
Meth.
Fluids2011; 65:43–66
m sm

2.2. Perfectly matched layers for nonreflecting boundaries

A perfectly matched layer (PML) [15] is employed to eliminate the reflection of ultrasound at theboundary of a numerical domain. In the region of PML, Equation (1) is split for each component
with a damping term by decomposing the pressure as p = p + p + p :
#
$
1
!p
!u
1! ⎛c ∂ p !t +'⎞ p∂u + !x = 0,
+σ p ⎟ +
= 0,
⎜
⎠ ∂x$
ρ c ⎝ ∂t#! py
1!v
Copyright ! 2010 John Wiley
Int. J. Numer. Meth. Fluids 2011; 65:43–66
(4)
+
= 0,
y Ltd.
⎞ &y pSons,
1! ⎛c2∂ py !t +'∂v
DOI: 10.1002/fld
!y
+
σ
p
+
=
0,
m
sm
2 ⎜
⎝ ∂t# y y ⎟⎠ ∂y$ρ m csm
! pz
!w
1
+'
= 0.
1 ⎛ 2∂ pz
z p∂w
z +
⎞
!2m ⎜csm +!t
σ z pz ⎟ +
= 0!z
⎠ ∂z
ρ m csm ⎝ ∂t
In the same way, the damping term is introduced to the momentum equation without decompositionof the velocity according to PML [15],式２：運動量保存式
#
$
"
#
$%
!p
!
1
!u i
!m
#m ekk $ij +2%m eij − ekk $ij ,(5)++'i u i = −3!t!xi !x j
DOI: 10.1002/fld

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

Copyright ! 2010 John Wiley & Sons, Ltd.

Int. J. Numer. Meth. Fluids 2011; 65:43–66
DOI: 10.1002/fld

性能測定

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

プロファイル取得方法• コンパイルFXFFLAGS= -Cfpp -Kfast,OMP -Am -X9 -Ktl_trt
fx : $(FILE)$(FC) $(FXFFLAGS) $(NSTEPMAX) $(DSIZE) $(SPLIT) $(CALOPT) $(FILE)• 計測実行方法- 通常
fpcoll -Ihwm -Hevent=Statistics ./a.out- PA tool# performance measurement Vol1
fpcoll -tcsv -o output_prof_1.csv -i3600000 Ulocal_event="cycle_counts,op_stv_wait,op_stv_wait_nc_pend,op_stv_wait_sxmiss_ex,branch_instructions,op_stv_wait_ex,op_stv_wait_sxmiss,instruction_counts",section=range ./a.out# performance measurement Vol2
fpcoll -tcsv -o output_prof_2.csv -i3600000 Ulocal_event="eu_comp_wait,cse_window_empty,load_store_instructions,branch_comp_wait,fl_comp_wait,cse_window_e
mpty_sp_full,trap_DMMU_miss,cycle_counts",section=range ./a.out# performance measurement Vol3
fpcoll -tcsv -o output_prof_3.csv -i3600000 -Ulocal_event="cycle_counts,inh_cmit_gpr_2write,
0endop,floating_instructions,impdep2_instructions,3endop,2endop,1endop",section=range ./a.out# performance measurement Vol4
fpcoll -tcsv -o output_prof_4.csv -i3600000 Ulocal_event="cycle_counts,prefetch_instructions,sx_miss_count_pf,sx_miss_count_dm,op_r_iu_req_mi_go,instruction_flo
w_counts,dvp_count_pf,dvp_count_dm",section=range ./a.out

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

BeforeAfter--------------------------------------------------------------------------------------------Fujitsu Performance Profiler Version 3.0
Measured time
: Thu Sep 15 11:58:44 2011
CPU frequency: Process0 2520 (MHz)Type of program: Thread (OpenMP)
Average at sampling interval : 10.0 (ms)Measured range: All ranges--------------------------------------------------------------------------------------------_____________________________________________________________________________________________
Time statistics--------------------------------------------------------------------------------------------Fujitsu Performance Profiler Version 3.0
Measured time
: Thu Sep 15 12:01:26 2011
CPU frequency: Process0 2520 (MHz)Type of program: Thread (OpenMP)
Average at sampling interval : 10.0 (ms)Measured range: All ranges--------------------------------------------------------------------------------------------_____________________________________________________________________________________________
Time statistics

Elapsed(s)User(s)System(s) Barrier(s)-----------------------------------------------------------200.1027
676.9999
0.01200.0100 Application-----------------------------------------------------------200.1027
676.9999
0.01200.0100 Process0

Elapsed(s)User(s)System(s) Barrier(s)-----------------------------------------------------------167.8631
551.9431
0.01110.0000 Application-----------------------------------------------------------167.8631
551.9432
0.01110.0000 Process0

Elapsed(s)User(s)System(s) Barrier(s)-----------------------------------------------------------200.1027
676.9999
0.01200.0100 Process0-----------------------------------------------------------200.1027
171.5852
0.00210.0000 Thread0
199.9842
168.8950
0.00310.0000 Thread1
199.9827
168.7949
0.00320.0100 Thread3
199.9841
167.7248
0.00360.0000 Thread2_____________________________________________________________________________________________
Procedures profile

Elapsed(s)User(s)System(s) Barrier(s)-----------------------------------------------------------167.8631
551.9432
0.01110.0000 Process0-----------------------------------------------------------167.8631
139.6659
0.00200.0000 Thread0167.6828
138.1258
0.00300.0000 Thread2
167.6810
137.1857
0.00330.0000 Thread3
167.6829
136.9657
0.00280.0000 Thread1_____________________________________________________________________________________________
Procedures profile*************************************************************************************
Application - procedures**************************************************************************************************************************************************************************
Application - procedures*************************************************************************************

Cost%
Barrier% StartEnd---------------------------------------------------------------------67694 100.0000
1 0.0015--- Application---------------------------------------------------------------------12509 18.4787
0 0.0000 1377 1849 hifu3d.hifu3d_cal_viscous_
8501 12.5580
0 0.0000 2920 3020 hifu3d.hifu3d_cal_t_
7108 10.5002
0 0.0000 2057 2157 hifu3d.hifu3d_cal_v_
6933 10.2417
0 0.0000 2263 2363 hifu3d.hifu3d_cal_w_
6674 9.8591
0 0.0000 1158 1265 hifu3d.hifu3d_update_mixture_properties_
4915 7.2606
0 0.0000 1856 1956 hifu3d.hifu3d_cal_u_4709 6.9563
0 0.0000 2766 2913 hifu3d.hifu3d_cal_grad_t_3624 5.3535
0 0.0000 2476 2547 hifu3d.hifu3d_cal_p_
3466 5.1201
0 0.0000--- jwe_gpwd
2838 4.1924
0 0.0000 3158 3244 hifu3d.hifu3d_cal_grad_phi_

Cost%
Barrier% StartEnd---------------------------------------------------------------------55192 100.0000
0 0.0000--- Application---------------------------------------------------------------------12233 22.1644
0 0.0000 1407 1927 hifu3d.hifu3d_cal_viscous_
6776 12.2771
0 0.0000 1183 1295 hifu3d.hifu3d_update_mixture_properties_
4661 8.4451
0 0.0000 2866 3013 hifu3d.hifu3d_cal_grad_t_3994 7.2366
0 0.0000 2356 2463 hifu3d.hifu3d_cal_w_
3879 7.0282
0 0.0000 1934 2041 hifu3d.hifu3d_cal_u_3844 6.9648
0 0.0000 2143 2250 hifu3d.hifu3d_cal_v_
3638 6.5915
0 0.0000 2576 2647 hifu3d.hifu3d_cal_p_3604 6.5299
0 0.0000 3020 3166 hifu3d.hifu3d_cal_t_3428 6.2110
0 0.0000--- jwe_gpwd
2851 5.1656
0 0.0000 3304 3390 hifu3d.hifu3d_cal_grad_phi_

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

Before

After

13000

9750

6500

3250

0
l_v
ca

s

ou

isc

l_t

ca

_v

ca

l_w

ca

ert

rop

xtu

mi

_
ate

p
re_

ies al_u
c

_t
rad

l_g

ca

l_p

ca

jwe

hi
_p
rad

d
pw

_g

g
al_

c

d
up

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

チューニング内容• ループ分割によるキャッシュミスの低減：
cal_v, cal_w• 演算量の削減：cal_u,cal_v,cal_w

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

チューニング効果• オリジナル版とチューニング版を8スレッド並列で実- 従ってチューニング版を8スレッドで実行したの行したところ、チューニング版があまり速くないと同様の速度- 並列に実行して効果があるチューニングとほとん- また、チューニング版はループを４分割し、作業

ど変らないか、却って遅くなるチューニングがあ配列を導入しており、これがオリジナル版と比較る。

してオーバーヘッドになる場合は、並列に実行す
ると却って遅くなる• オリジナル版とチューニング版で、速度が変らない
か却って遅くなる理由は、• 並列性能（８スレッド）- オリジナル版では、ループ内で配列を多く使用し- オリジナル：5.3倍ているのでキャッシュミスが発生- チューニング：4.9倍- チューニング版では、ループを4つに分割し、1つのループで使用する配列の数を減らしてキャッシ
ュミスを減少- 一方、オリジナル版を8スレッドで並列に実行すると、キャッシュの大きさが8倍になるため、(本プログラムの場合)、何も修正しなくてもキャッシュミスが減少

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~ 
#9D@A9D@A  2KLB7G@:H58=< 2KLBEFI58=< 2!"9D@A13
133 2  2'(58=< 2.+*.+*!&!!&!%&!

%&!

$&!

$&!

#&!

#&!

!&!

!&!

&!

&!

%& %& $& $& #& #& !& !& & 
#9D@AJ;<>04
/()9D@A9D@A

 
2 2
<A5
KLB7G@:H58=<2
2
KLBEFI58=< 2J;<>04!"9D@A13
C6@?
133 22KLB7G@:H58=<
 22'(58=<KLBEFI58=<2
2

 J;<>04
/()9D@A 2
<A5 2

J;<>04C6@? 2 KLB7G@:H58=< 2 KLBEFI58=< 2&)-,*+..)-,*+..)-,*+..)-,*+..

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

1*,:(,-,*,:(,,
AWTJLXX#,

A6qnAWTJLXX#,AWTJLXX#,# 

#DPRL- #DPRL. #DPRL/ #DPRL0

>-vl

>-vl
&PSXYWZJYPTS'>-vl
&QK+XY'

>.vl

>.vl
&PSXYWZJYPTS'>.vl
&QK+XY'-*53:(,.

1*25:(,5-*/..%

0*--1%-*.0:(,5,*.43%,*450%-*53:(,.

-*53:(,.

-*53:(,.

lrda   =+@dgml      
a
a
a
a
a
a

>-$)>.$"
wx|l}
l}upr
upr&<7+X'&<7+X'-*41:(,,-*5/:(,,?;>@AC?=AC

D>7vl

D>7vl&PSXYWZJYPTS'

D>7vl&QK+XY'

4*/.:(,.

.*-5:(,/.*-.:(,/,*,,,%,*,,,%<WHUO#&XLJ'
"h{t   
atepo
Z@Aivpraa AWTJLXX#,-*./:),-

"h{t
 #&%'AWTJLXX#,

1*35:(,,/*33:(,,   
a
a

,*,2%

lrda

,*,,:(,,-*/,:(,-

0 ivpr- ivpr asfypjzdgmla
-*5-%
,*,,%
swx|dgmla.*5/%.*3,:(,-.*05:(,,

3*-/:(,- 

1*4-:),-

0*54:(,,

   =+@dgml      
a
a
a
a
a
a

2*13%

.+/ ivpr&`b'`bba a=+@dgmla-/*3,%-*.2%/*15:(,,

tepo
Z@Aivpra ~kln_!c
Z@Aivpralrda
,*.5%.*1.%/2*-,%

~kln  `bb
- ivpr _!c ~kln_
a

!c

-*0,:(,,-*05:(,-

3*55:(,,,*,,:(,,

~kln  `bb
- ivpr _!c ~kln_a~kln_!c!ctepoasfypjzdgmlaswx|dgmla
,*3-%
3*10%
0*,1%




-*4.%

.+/ ivpr&`b 0 ivpr
'-*1,:(,-.*11:(,-.+/ ivpr&`b 0 ivpr
'

,*,,%

3*15%

-.*5/%

-*53:(,.

-,,*,,%

"&XLJ'
A6#96D6#&-.'AWTJLXX#,

A6#96D6#&/0'.*1:(,.

J^JQLGJTZSYX TUGXY[G\HPY
0*52:(---*-2:(--J^JQLGJTZSYXPSOGJRPYGNUWG.\WPYLTUGXY[G\HPYGS TUGXY[G\HPYGX IWHSJOGPSXYWZ TUGXY[G\HPYGL TUGXY[G\HPYGX PSXYWZJYPTSGJJXLG\PSKT\G QTHKGXYTWLGPS IWHSJOGJTRUJXLG\PSKT\G YWHUG9??EGLZGJTRUG\HPY
MQGJTRUG\HPY
J^JQLGJTZSYXJGULSK]RPXXGL]
JYPTSX
]
]RPXX
TZSYX
LRUY^
XYWZJYPTSX
G\HPY
LRUY^GXUGMZQQ
RPXX.*,:(,. .*,-:(-,
0*53:(--AWTJLXX#,,*,,:(,,,LSKTU/*,5:(,4-*.0:(-,

MQTHYPSNGPSXYW PRUKLU.GPSXYZJYPTSXWZJYPTSX/*/4:(--

5*-.:(-,/*2.:(-,/*/,:(-,-*05:(-,

0*/,:(--/LSKTU.LSKTU-LSKTU.*,-:(-,/*35:(-,/*31:(-,-*42:(--J^JQLGJTZSYX.*.,:(-,-*/4:(---*02:(,5-*4,:(--

5*1-:(,5.*-.:(,/

0*51:(--UWLMLYJOGPSXY X]GRPXXGJTZS X]GRPXXGJTZS TUGWGPZGWLVGR PSXYWZJYPTSGMQK[UGJTZSYGKK[UGJTZSYGUM
WZJYPTSX
YGUM
YGKR
PGNT
T\GJTZSYX
R

0*52:(--

0*-.:(-,-*..:(,5-*0-:(,3

1*25:(,50*/5:(--

5*3-:(,45*03:(,2CA6B820F===M] <WHUO#&XLJ'
"h{t   
aalrda

AWTJLXX#,# -*1:(,. -*01:(,,/*,3:),.

5*0/:),-

"h{t
 #&%'   
aa

AWTJLXX#,# 

,*,2%

.*22%

lrda

   =+@dgml      
a
a
a
a
a
a

,*,,:(,,

0*5,:(,,-*,.:(,--*13:(,,

0*05:(,,/*22:),-

   =+@dgml      
a
a
a
a
a
a

-*3/%

,*,,%

4*55%

-4*31%

.*43%

4*./%

,*23%

tepo
Z@Aivpra/*-/:),-.*.2:(,,

tepo
Z@Aivpra,*13%

~kln  `bb
- ivpr _!c ~kln_
a

!c

4*41:),-

1*1,:(,,.*45:(,,,*,,:(,,

~kln  `bb
- ivpr _!c ~kln_
a

!c

0*-1%

-*2.%

-,*,5%

1*/-%.+/ ivpr&`b 0 ivpr'

2*/5:(,,-*./:(,-.+/ ivpr&`b 0 ivpr
'

,*,,%

--*3-%..*15%



1*01:(,-

-,,*,,%-*,:(,.

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~

1*,:(,-,*,:(,,
AWTJLXX#,

A6qnAWTJLXX#,AWTJLXX#,##DPRL- #DPRL. #DPRL/ #DPRL0

>-vl

>-vl
&PSXYWZJYPTS'>-vl
&QK+XY'

>.vl

>.vl
&PSXYWZJYPTS'>.vl
&QK+XY'-*21:(,.

1*,.:(,5-*/45%

0*4,-%-*-0:(,5,*/-2%-*,5-%-*21:(,.

-*21:(,.

-*21:(,.

lrda   =+@dgml      
a
a
a
a
a
a



>-$)>.$"
wx|l}
l}upr
upr&<7+X'&<7+X'-*51:(,,?;>@AC?=AC

D>7vl

D>7vl&PSXYWZJYPTS'

D>7vl&QK+XY'.*-/:(,,

5*//:(,.

.*.,:(,/.*/2:(,/,*,,,%,*,,,%`bb
a

~kln  
ivpr _!c ~kln_!c.+/ ivpr&`b 0
'

ivpr



-*,4:(,-.*/3:(,--*21:(,.

.+/ ivpr&`b 0
'

ivpr



-0*/5%-,,*,,%.+/ ivpr&`b 0
'

ivpr



0*02:(,,-*-.:(,-

0*//:(,-.+/ ivpr&`b 0
'

ivpr



-,*.5%.1*5,%-,,*,,%<WHUO#&XLJ'
"h{tAWTJLXX#,

5*40:),.

"h{t
 #&%'AWTJLXX#,AWTJLXX#,

A6#96D6#&/0'
AWTJLXX#,CA6B820F===M]
"h{t



"h{t
 #&%'AWTJLXX#,#

/*./:(,,/*3-:(,,   
a
a

lrda

,*,2%

A6#96D6#&-.'AWTJLXX#,#   
a
a



-*52%

J^JQLGJTZSYX TUGXY[G\HPY.*.1%,*,,:(,,-*.-:(,-.*.1:(,--*24:(,,

2*/1:(,-

1*2-:),-

   =+@dgml      
a
a
a
a
a
a

,*,,%

3*/2%

-/*22%-*,.%/4*1/%

,*/0%

tepo
Z@Aivpra

0*40:(,,-*2/:(,,

tepo
Z@Aivpr
a

.*50%

,*55%

3*24:),-

`bb
a

,*03%

5*31:(,,

1*5/:(,,,*,,:(,,

~kln  
ivpr _!c ~kln_

!c

1*5.%

/*2,%

,*,,%

2*1/%

TUGXY[G\HPYGS TUGXY[G\HPYGX IWHSJOGPSXYWZ TUGXY[G\HPYGL TUGXY[G\HPYGX PSXYWZJYPTSGJJXLG\PSKT\G QTHKGXYTWLGPS IWHSJOGJTRUJXLG\PSKT\G YWHUG9??EGLZGJTRUG\HPY
MQGJTRUG\HPY
J^JQLGJTZSYXJGULSK]RPXXGL]
JYPTSX
]
]RPXX
TZSYX
LRUY^
XYWZJYPTSX
G\HPY
LRUY^GXUGMZQQ
RPXX

0*-1:(--

5*13:(-,,*,,:(,,J^JQLGJTZSYXPSOGJRPYGNUWG.\WPYL

0*-1:(---*05:(-,.*45:(--   
aalrda,LSKTU.*04:(,4-*--:(-,

MQTHYPSNGPSXYW PRUKLU.GPSXYZJYPTSXWZJYPTSX
4*05:(-,/*00:(-,/*,4:(-,

4*0,:(,5/*2.:(--/LSKTU.LSKTU-LSKTU-*0/:(-,.*33:(-,.*02:(-,-*20:(--J^JQLGJTZSYX
0*-2:(--.*-2:(-,-*,1:(---*0-:(,5-*2,:(--

5*/0:(,5.*/2:(,/

0*-2:(--UWLMLYJOGPSXY X]GRPXXGJTZS X]GRPXXGJTZS TUGWGPZGWLVGR PSXYWZJYPTSGMQK[UGJTZSYGKK[UGJTZSYGUM
WZJYPTSX
YGUM
YGKR
PGNT
T\GJTZSYX
R/*5,:(-,-*-/:(,54*42:(,21*,.:(,5/*22:(--

4*53:(,43*//:(,2<WHUO#&XLJ'.*02:),.

4*,5:),-

5*.3:),-   
a
a

lrda

,*,2%

-*43%

.*-0%

   =+@dgml      
a
a
a
a
a
a

,*,,:(,,

0*14:(,,

4*1-:(,,-*,2:(,,

0*,,:(,,/*1/:),-

   =+@dgml      
a
a
a
a
a
a

,*,,%

-,*14%-5*2/%

.*00%

5*./%

,*4.%

tepo
Z@Aivpra/*,1:),--*,/:(,,

tepo
Z@Aivpr
a

,*3,%

.*/3%

`bb
a

0*40:),-

`bb
a

-*-.%

~kln  
ivpr _!c ~kln_!c

/*03:(,,.*--:(,,,*,,:(,,

~kln  
ivpr _!c ~kln_

!c

4*,-%

0*42%

,*,,%

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~ #9D@A9D@A  2KLB7G@:H58=< 2KLBEFI58=< 2!"9D@A13
133 2  2'(58=< 2 J;<>04
/()9D@A 2
<A5 2

J;<>04C6@? 2 KLB7G@:H58=< 2 KLBEFI58=< 2.+*!&!%&!

$&!

#&!

!&!

&!

%& $& #& !& &)-,*+..)-,*+..

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~ 
#9D@A9D@A  2KLB7G@:H58=< 2KLBEFI58=< 2!"9D@A13
133 2  2'(58=< 2 J;<>04
/()9D@A 2
<A5 2

J;<>04C6@? 2 KLB7G@:H58=< 2 KLBEFI58=< 2.+*!&!%&!

$&!

#&!

!&!

&!

%& $& #& !& &)-,*+..)-,*+..

All Rights Reserved, Copyright © ISLiM, RIKEN 2011~*************************************************************************************
Application - performance monitors*************************************************************************************

Befor

Time(s) InstructionsMIPS
MFLOPS
Cover(%) Start
End------------------------------------------------------------------------------------------------------Elapsed
200.1027 1.554858e+127770.3003
3038.8860
87.1965--- Application------------------------------------------------------------------------------------------------------Elapsed
33.9091 309480667484
9126.7686
4700.0615
96.2603 1377 1849 hifu3d.hifu3d_cal_viscous_
Elapsed21.9806 185927060668
8458.6934
1721.6554
99.2490 2920 3020 hifu3d.hifu3d_cal_t_
Elapsed18.5975 189785811427 10204.9199
3616.7947
98.4694 2057 2157 hifu3d.hifu3d_cal_v_
Elapsed18.3742 186768878699 10164.7500
3586.7241
98.3019 2263 2363 hifu3d.hifu3d_cal_w_
Elapsed28.4768 96586898288
3391.7786
747.4074
60.7027 1158 1265 hifu3d.hifu3d_update_mixture_properties_
Elapsed12.8303 139624795714 10882.4238
5393.4106
99.1439 1856 1956 hifu3d.hifu3d_cal_u_
Elapsed12.7157 104721324854
8235.5811
3514.5505
97.0267 2766 2913 hifu3d.hifu3d_cal_grad_t_
Elapsed9.3909 92206173601
9818.6475
5363.4482
99.0825 2476 2547 hifu3d.hifu3d_cal_p_
Elapsed16.6106 54691619543
3292.5637
810.1867
55.2351--- jwe_gpwd
Elapsed7.5414 46972190323
6228.5947
3524.1199
97.5748 3158 3244 hifu3d.hifu3d_cal_grad_phi_
Time(s) L2 miss(%) mTLB-is(%) mTLB-op(%)
Cover(%) Start
End------------------------------------------------------------------------------------------------------Elapsed
200.1027
0.30720.00000.000087.1965--- Application------------------------------------------------------------------------------------------------------Elapsed
33.9091
0.40900.00000.000096.2603 1377 1849 hifu3d.hifu3d_cal_viscous_
Elapsed21.9806
0.19600.00000.000099.2490 2920 3020 hifu3d.hifu3d_cal_t_
Elapsed18.59750.18110.00000.000098.4694 2057 2157 hifu3d.hifu3d_cal_v_
Elapsed18.37420.39530.00000.000098.3019 2263 2363 hifu3d.hifu3d_cal_w_
Elapsed28.4768
0.14130.00000.000060.7027 1158 1265 hifu3d.hifu3d_update_mixture_properties_
Elapsed12.83030.24570.00000.000099.1439 1856 1956 hifu3d.hifu3d_cal_u_
Elapsed12.7157
0.43200.00000.000097.0267 2766 2913 hifu3d.hifu3d_cal_grad_t_
Elapsed9.39090.38840.00000.000099.0825 2476 2547 hifu3d.hifu3d_cal_p_
Elapsed16.6106
0.05670.00000.000055.2351--- jwe_gpwd
Elapsed7.5414
0.59140.00000.000097.5748 3158 3244 hifu3d.hifu3d_cal_grad_phi_
Time(s) InstructionsMIPS
MFLOPS
Cover(%) Start
End*************************************************************************************------------------------------------------------------------------------------------------------------Elapsed
167.8631 1.279574e+127622.7266
3379.7988
84.7377--- Application------------------------------------------------------------------------------------------------------Elapsed
32.9582 303491811692
9208.3789
5005.4312
96.4877 1407 1927 hifu3d.hifu3d_cal_viscous_
Elapsed28.9257 98329499601
3399.3813
760.7977
60.1695 1183 1295 hifu3d.hifu3d_update_mixture_properties_
Elapsed12.4409 103532620467
8321.9326
3587.9478
96.9842 2866 3013 hifu3d.hifu3d_cal_grad_t_
Elapsed10.5489 106238752306 10071.0410
4376.0215
98.6138 2356 2463 hifu3d.hifu3d_cal_w_
Elapsed10.0296 104768611662 10445.9932
4825.9990
99.2187 1934 2041 hifu3d.hifu3d_cal_u_
Elapsed10.1546 106700586942 10507.6123
4580.7646
98.0174 2143 2250 hifu3d.hifu3d_cal_v_
Elapsed9.4881 92693027995
9769.4053
5309.7554
98.7432 2576 2647 hifu3d.hifu3d_cal_p_
Elapsed9.5217 114825479098 12059.3682
5313.0464
98.2709 3020 3166 hifu3d.hifu3d_cal_t_
Elapsed16.1134 54403140381
3376.2605
844.6558
55.1470--- jwe_gpwd
Elapsed7.5706 49470042876
6534.5195
3790.9597
97.8672 3304 3390 hifu3d.hifu3d_cal_grad_phi_

AfterTime(s) L2 miss(%) mTLB-is(%) mTLB-op(%)
Cover(%) Start
End------------------------------------------------------------------------------------------------------Elapsed
167.8631
0.34420.00000.000084.7377--- Application------------------------------------------------------------------------------------------------------Elapsed
32.9582
0.41670.00000.000096.4877 1407 1927 hifu3d.hifu3d_cal_viscous_
Elapsed28.9257
0.14200.00000.000060.1695 1183 1295 hifu3d.hifu3d_update_mixture_properties_
Elapsed12.44090.43220.00000.000096.9842 2866 3013 hifu3d.hifu3d_cal_grad_t_
Elapsed10.54890.40720.00000.000098.6138 2356 2463 hifu3d.hifu3d_cal_w_
Elapsed10.02960.28020.00000.000099.2187 1934 2041 hifu3d.hifu3d_cal_u_
Elapsed10.1546
0.26900.00000.000098.0174 2143 2250 hifu3d.hifu3d_cal_v_
Elapsed9.48810.38890.00000.000098.7432 2576 2647 hifu3d.hifu3d_cal_p_
Elapsed9.52170.34610.00000.000098.2709 3020 3166 hifu3d.hifu3d_cal_t_
Elapsed16.1134
0.05490.00000.000055.1470--- jwe_gpwd
All Rights Reserved, Copyright © ISLiM, RIKEN 2011~
Elapsed7.5706
0.59150.00000.000097.8672 3304 3390 hifu3d.hifu3d_cal_grad_phi_

2.10 非構造格子 CFD ソルバにおけるタイリング
宇宙航空研究開発機構

情報・計算工学センター

坂下 雅秀

2.10.1 はじめに
864筐体，82,944CPU（663,552コア）という巨大なシステムで論理ピーク演算性能11.3ペタフロッ
プスを実現した京速コンピュータ「京」（「京」）の共同利用が昨年（2012年）秋に開始された[1]．
さらにその先を見据えて，エクサフロップス時代を実現するための様々な検討も，既にはじまっている[2][3]．
そのような現状において，CFDの分野においても10,000並列を超えるような大規模並列計算への対応が求められている．
一方で，スーパーコンピュータ（スパコン）を構成する要素に目を向けてみると，CPUの演算性能向上にメインメモリのアクセススピード（メモリスループット）が追いつかない状況になりつつある．そのため，メモリに比べて少ない容量ではあるが，十分高速にアクセス可能なキャッシュメ
モリ（キャッシュ）と呼ばれる機構がCPU内に設けられている．演算に必要なデータのメモリからの供給が十分でなくなりつつある現状では，いかにしてこのキャッシュを有効に利用するかということも，大規模並列計算への対応と並んで，スーパーコンピューティングにおける重要な課題のひとつとなっている．
ここでは，後者のキャッシュ有効利用について，その代表的な手法のひとつであるタイリングを，
非構造格子CFDソルバに適用する方法について考える．

2.10.2 演算性能とメモリスループット
まずはじめに，「京」を中心として演算性能とメモリスループットの現状について概観する．
「京」は，SPARC64 VIIIfxと呼ばれるCPUを搭載している．そこで，同じSPARC64系のCPUを搭載したハイエンドテクニカルコンピューティングサーバ FX1（FX1）とPRIMEHPC FX10（FX10）を比較対照として傾向を見ていくこととする．ここに，FX1およびFX10は富士通株式会社（富士通）のHPC（High Performance Computing）用途向け製品である．FX1のCPUは，SPARC64 VIIIfxの前世代にあたるSPARC64 VIIであり，FX10は次の世代となるSPARC64 IXfxである．また，いずれのCPUもopen SPARCアーキテクチャに基づいて富士通が開発したCPUである．表1に，各CPUの主な性能諸元を示す．参考として，2012年8月に発表されたCPUであるSPARC64 Xについても同時に示した．表中のBF比（Byte per FLOP）とは，メモリスループットを論理演算性能で除した値のことであり，演算性能に対してメモリスループットが十分であるか否かを判断するひとつの指標である．

CPU
コ ア 数
ピーク性能
[GFLOPS]
メモリスループット[GB/s]
BF 比
[－]
キャッシュ
[MB]
出 荷 開 始 時 期

表1 主な性能諸元[4][5][6] [7]
FX1
FX10
「京」
SPARC64 VII SPARC64 VIIIfx SPARC64 IXfx
4
8
16
40
128
236.5
40
64
85
1
0.5
0.36
6
6
12
2008年
2010年
2012年

―
SPARC64 X
16
382
102
0.27
24
―

表1よりBF比が年々減少していることがわかる．また，図1に1980年の性能を1とした場合のCPUとメモリの性能の推移を示す．この図から，CPUの性能は年率60%程度の性能向上率であるのに対して，メモリの性能向上率は7%程度にしかなっておらず，メモリスループットの問題が，決して今に始まったことではないことがわかる．

CPU

memory

図1 CPUとメモリの性能の推移[8]そこで，以下では圧縮性Navier-Stokes方程式を解く非構造格子CFDソルバ[9]にとって，現状のシステムのBF比がどの程度のものであるか評価することを試みる．
非圧縮性Navier-Stokes方程式を解く場合，計算に必要なデータ量に比べて計算量がもっとも多いのは，数値流束を計算する部分である．したがって，この部分を計算するのに必要なBF比について考える．表2に，FX1において実測した数値流束を計算する際に必要な浮動小数点演算量（FLOP）を示
す．表中，HLLEおよびRoeは，数値流束を計算する場合の代表的なスキームである．実測は，1ノード（1cpu,4process）で，格子点数2,416,496のデータを用い，時間積分200ステップで行い，計算に要した時間（CPU time）および実効性能（MFLOPS)を実測し，これより演算量（GFLOP）を求めた．

HLLE
Roe

表2 数値流束の計算に必要な演算量
CPU time[s]MFLOPS
30.50
4198.5938.70
4852.63

GFLOP
128.07187.80

この結果より，HLLEスキームによる数値流束の計算に必要な1格子点あたりの演算量は，128  109 FLOP  2.4  106 grid  200step  300FLOP
となる．一方で，この計算には，最低限，入力として5次元の保存量ベクトル2本と，出力として，
やはり5次元の数値流束ベクトル1本が必要となるので，これをバイト数に換算すれば，

5  2  5word 8byte/word  120byte
となる．ただし，数値流束は倍精度実数型で計算するものとした．この結果，HLLEスキームによる
数値流束の計算に必要なBF比は，

120byte  300FLOP  0.4と計算できる．この結果からは，FX1のBF比1は数値流束の計算に十分であり，FX10のBF比では不十分ということが言える．
同様に，数値流束をRoeスキームにより計算することにした場合に必要なBF比は，およそ0.27程度
であると計算できる．
ここで注意しなければならないのは，CFDソルバにおける数値流束の計算以外の部分は，演算量が相対的に少なくなるため，より大きなBF比を要求することである．このことを考え合わせると，
FX1はともかく，「京」のBF比0.5でもCFDソルバの計算には不十分である．このBF比の不足を補うための機構がキャッシュであり，これをより有効に利用することが求められる時期に来ていることがわかる．

2.10.3 タイリング
キャッシュを有効に利用する手法のひとつにタイリング（Tiling)と呼ばれる手法がある．ここでは，行列・行列積の計算を例に，そのタイリングとはどのようなものかについて見ることにする．
簡単のため，正方行列の場合について考える．今，N行N列の正方行列A=[aij],B=[bij]について，その積C=[cij]C  ABを計算するには，その要素ごとにcij  cij  aik  bkj

i, j , k  1 ~ N(1)を計算することになる．この計算では，入力データとしてaik，bkjおよびcijの3語を必要とし，出力としてcijの1語が必要であるから，合計4語を必要とする．倍精度浮動小数点演算を行うこととすれば，
1語は8byteであるから，計算に必要なデータは合計32byteである．一方で，この計算は和（+）と積（×）を含むので，浮動小数点演算数は2である．計算で要求されるBF比は，
BF比[Byte/FLOP]=データ量[Byte]÷演算数
で求めることができるので，行列・行列積の計算で要求されるBF比は16となる．
ところで，行列・行列積の計算全体に目を向けた場合，ひとつのN行N列の行列に含まれるデータはN2語であり，行列Cは入力と出力の両方に必要であるから，計算に必要なデータ量は4N2語である．
一方，行列・行列積全体を計算するためには，(1)式の計算をi，jおよびkのそれぞれついてN回づつ繰り返す必要があるので，(1)式を計算するのべ回数はN3となる．したがって，行列・行列積全体の計算で要求されるBF比は，



8  4  N 2 2  N 3  16 Nとなる．たとえば，N=1000とすれば，この計算に必要となるBF比は，わずか0.016でよいことになる．
このことは，行列・行列積の計算を以下のように要素の式として書き下してみると容易に理解できる．

c11  a11b11  a12b21   a1N bN 1
c21  a21b11  a22b21   a2 N bN 1

c N 1  a N 1b11  a N 2b21   a NN bN 1(2)

(2)式において，行列Bの要素b11，b12，…はN回繰り返して現れており，データが再利用されていることがわかる．タイリングでは，このことを利用する．
もし，Nが十分小さくて，行列A，BおよびCの全てがキャッシュに乗る程度の大きさであるなら
ば，BF比は16/Nでよいので，特に問題はない．もし，Nが十分に大きくてキャッシュに乗らない場
合には，行列Aをp(=N/n)行q(=N/m)列の小行列Aij=[aijkl]に，行列Bをq(=N/m)行p(=N/n)列の小行列
Bij=[bijkl]に，それぞれ分割する．ただし，nおよびmは適当な整数である．このとき行列・行列積は，
C11 C12…C1n
C21 C22…C2n: ::Cn1 Cn2…Cnn=

A11 A12…A1m
A21 A22…A2m: ::An1 An2…Anm

B11 B12…B1m
B21 B22…B2m: ::Bn1 Bn2…Bnmとなる．ここで，行列Cij=[cijkl]は行列Cのp行p列の小行列であり，pおよびqはキャッシュに乗る程度

の大きさになるように選ぶ．こうすることにより，小行列どうしの計算，m

Cij  Cij   A ik B kj

i, j  1 ~ nk 1の一部であるAikBkj，k=kの計算，

cij kl  cij kl  a ij ko  bij ol

k  1 ~ p, o, l  1 ~ q

は，キャッシュ上のデータによって計算可能となり，そのときに必要となるBF比は，



8  2  p 2  pq 2 pq 2で与えられる．簡単のためp=qとなるように小行列を選ぶことにすれば，BF比は16/p（p >1）となり，より狭いメモリバンド幅でキャッシュにデータを供給することが可能となる．
このような計算手法は，行列を小行列（タイル）に分割することから，タイリングと呼ばれる．
ここで，行列・行列積というひとつの計算であっても，(1)式を計算するのに必要なBF比は大きく，
演算量は少ないという結果が得られるのに対して，行列・行列積の計算全体を見ると必要とするBF比は小さく，演算量が多いという正反対の結果が得られたことは極めて重要である．このことから，
アプリケーションにおけるBF比を評価する場合には，どういう観点から評価するのかに十分な注意を払わなければならないことがわかる．
以下に，行列・行列積にタイリングを適用したことによる効果の一例を示す．リスト1は，一般的な行列・行列積のコーディングの例であり，それにタイリングを適用した場合のコーディング例が
リスト2である．これらを実際にFX1で逐次（1コア）実行して経過時間と実効性能を測定した結果を表3に示す．測定は，リスト1および2に示されるようにN=4096，n=m=256，p=q=16として行い，実効性能は，2×N3 / tとして計算した．ただし，tは計算に要した経過時間の実測値である．
! N=p*n=NT*NB=256*16=4096
integer, parameter :: NN = 4096 ! NN=N

integer, parameter :: NT =256 ! NT=n=m

real*8,allocatable :: A(:,:), B(:,:), C(:,:)

integer, parameter :: NB =16 ! NB=p=q

real*8,allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:)
allocate( A(NN,NN), B(NN,NN), C(NN,NN) )allocate( A(NB,NB,NT,NT), B(NB,NB,NT,NT),&
C(NB,NB,NT,NT) )(snip)(snip)

call gettod( t_start ) !経過時間計測開始

call gettod( t_start ) !経過時間計測開始
do n=1,NT
do m=1,NT
do l=1,NT

do j=1,NN

do j=1,NB

do k=1,NN

do k=1,NB

do i=1,NN

do i=1,NB

C(i,j) = C(i,j) + A(i,k)*B(k,j)

C(i,j,l,n) = C(i,j,l,n) + A(i,k,l,m)*B(k,j,m,n)

end doend doend doend doend doend doend doend doend focall gettod( t_end ) !経過時間計測終了

call gettod( t_end ) !経過時間計測終了(snip)(sinp)

リスト1 一般的な行列・行列積のコーディング

リスト2 タイリングによる行列・行列積のコーディング例

表3 行列・行列積の測定結果
一般的なコーディング（リスト1）
127.891.07―

経過時間[秒]
実効性能[GFLOPS]
倍率[－]

タイリング適用（リスト2）
60.43
2.27
2.13

表3より，タイリングを適用することにより2倍以上の性能向上が得られたことがわかる．pを変化させた場合の測定結果については，「2.10.6 APPENDX」に示した．
ところで，リスト2のコーディング例では，行列を保存する配列A,BおよびCを2次元配列から小行列に対応する4次元配列に変更している．実際のアプリケーションでは，このような配列の変更には，膨大な工数を必要とするため実現困難な場合も多い．そのような場合には，リスト3に示すように作業用配列を用意し，そこにデータをコピーすることでタイリングを行う簡易的な方法も考えられる．
! N=p*n=NT*NB=256*16= 4096
integer, parameter :: NT = 256
integer, parameter :: NB =16

real*8,allocatable :: A(:,:), B(:,:), C(:,:)
real*8 :: AW(NB,NB), BW(NB,NB), CW(NB,NB)! 作業用配列の確保

allocate( A(N,N), B(N,N), C(N,N) )(snip)
call gettod( t_start ) !経過時間計測開始
do l=1,NT*NT*NT
is = mod(l-1,NT)*NB + 1ie = is + NB - 1
ks = mod(( l -1 )/ NT,NT)*NB + 1
ke = ks + NB - 1
js =( l - 1 )/(NT*NT)*NB + 1

je = js + NB - 1
do k=ks,ke ; do i=is,ieAW(i-is+1,k-ks+1) = A(i,k) ! 行列Aを作業用配列にコピー
end do ; end do
do j=js,je ; do k=ks,keBW(k-ks+1,j-js+1) = B(k,j) ! 行列Bを作業用配列にコピー
end do ;end dodo j=1,NB ; do i=1,NB
CW(i,j) = 0.d0
end do ;! 行列Cの作業用配列を初期化

end dodo j=1,NB ; do k=1,NB ;do i=1,NB

CW(i,j) = CW(i,j) + AW(i,k)*BW(k,j)
end do ;end do ; end do

do j=js,je ;do i=is,ie

C(i,j) = CW(i-is+1,j-js+1) ! 計算結果の書き戻し
end do ;end do!(続き）
end docall gettod( t_end ) !経過時間計測終了(snip)

リスト3 作業用配列を用いてタイリングを適用した行列・行列積のコーディング例

このコーディング例を，FX1で逐次実行したときの経過時間は78.51秒，したがって，実効性能は1.75GFLOPSであった．作業用配列へのコピーのオーバーヘッドがあるため，リスト2のコーディン
グ例に比べれば性能は若干低下するが，タイリングによる一定の効果は得らる．
なお，ここで示したコーディング例（リスト2）は，あくまでも例であって，最適なコーディング
ではない．小行列のサイズは，pとqを等しくとるよりも，p > qとした方がよい可能性が考えられる
し，その場合には，行列Bは転置行列として配列上に確保した方がよいかも知れない．さらに，当然のことではあるが，最適なpとqの組み合わせは，実行するハードウエアによって異なる．
また，タイリングはあくまでもメモリスループットの能力不足を補い，メインメモリからCPU内のキャッシュにデータを効率的に供給するための手法である．よって，キャッシュから演算器へのデータ供給を含めた演算器そのもの利用については，別途効率化を図る必要がある．

2.10.4 非構造格子CFDソルバへのタイリングの適用
CFDソルバの開発に係る人の多くは，CFDに関する専門知識を有しているが，スパコンのハード
ウエアやコンパイラによる最適化手法に関する知識を持っているとは限らない．ここでは，そのような人でも，なるべく追加の知識を必要とせずに，比較的容易にキャッシュの有効利用を図る方法
について考える．
キャッシュを有効利用するための基本的な考え方は，キャッシュ上にあるデータを使ってなるべ
く多くの計算を行うようにすることである．一方で，CFD計算を行うためのプラットホームとしては，スパコンかPCクラスタが一般的であり，その結果MPIによりプロセス並列化されていることが多い．並列化の概略は以下の通りである（図2）．
(1) 解析領域をいくつかのリージョンに分割する．
(2) 隣接格子点の物理量を参照可能にするため「袖」と呼ばれる領域を確保する．
(3) 適宜，「袖」にデータを転送しながら計算を進める．
このリージョンは，一種のタイルと考えることができる．そこで，実際にプロセス数を順次増加させ，領域をより多くのリージョンに細分化したときにキャッシュミス率がどうなるかを実測した
例を図3に示す．これより，プロセス数の増加とともにキャッシュミス率は単調に減少していることがわかる．これは，リージョンに含まれる格子点数が減少することにより，一旦キャッシュにロードされたデータが他のデータをロードする必要からメモリに書き戻される可能性が減少したことによるものであり，タイリングによりキャッシュがより有効に利用されていると考えることができる．
しかし，領域の細分化には問題もある．図3の実測を行ったのと同じ条件のもと，プロセス数の増加とともに計算時間がどのように変化するかを測定し並列化効率を求めた結果を図4に示す．この結果からは，領域の細分化には性能的に限界があることがわかる．これは，プロセス間の負荷分散のアンバランスやプロセス間通信のオーバーヘッドなどの要因による性能低下が，キャッシュの有効利用による性能向上を上回ってしまうことが原因である．このことから，プロセス数を増大させずに処理を細分化する方法を考えなければならないことがわかる．
プロセス数を増大させずに処理を細分化するひとつの方法として，領域分割により生成された各リージョンに対して，再帰的に領域分割を適用し，サブリージョンを生成する方法が考えられる．
すなわち，図2において解析領域をリージョン，リージョンをサブリージョンと読み替えればよい．
適切なサブリージョンの大きさはハードウエアの構成に依存するが，1コア当たり1MBのキャッシュがある場合には，1,000格子点程度が目安であると考えられる．
ただし，データの転送（プロセス間通信）に関しては工夫を要する．今，「勾配の計算」―「勾配制限関数の計算」―「数値流束の計算」という非構造格子CFDソルバにおける典型的な計算の流れを例に考える．図5に一連の計算の流れの概略を示す．通常の領域分割による並列化では，まず計算に必要となる「袖」の部分のデータを転送した後（step1），「勾配の計算」を行う（step2）．この計算結果が次の「勾配制限関数の計算」で使用されるため，全てのリージョンで「勾配の計算」が行われた後，計算結果を「袖」の部分に転送する（step3）．転送が終わったのちに「勾配制限関数の計算」を始めることができる（step4）．「数値流束の計算」（step5）では，「勾配の計算」の計算結果とともに「勾配制限関数の計算」の計算結果も必要となるので，やはり計算を始める前に全てのリージョンで「勾配制限関数の計算」が終了し「袖」の部分へのデータの転送（step6）が終
わっていなければならない．
しかし，この方法をそのままサブリージョンにおける計算に応用すると，あるサブリージョンで「勾配の計算」に使用するためにキャッシュに乗せられたデータが，別のサブリージョンの計算をするためにキャッシュ上から消去されてしまい，効率の良いキャッシュ利用法とは言えない．そこ
で，計算と「袖」へのデータ転送を交互に繰り返すのではなく，「袖」を余分に確保して，最初にそこへ必要十分なデータを転送しておくことにすれば，そのサブリージョンに関する計算だけを連続して行うことが可能となる．今の場合，「袖」を1格子分ではなく3格子分用意し，「勾配の計算」
では「袖」の部分を2格子分，「勾配制限関数の計算」では「袖」の部分を1格子分，余分に計算す
ることにすれば良い（図6）．もし，n段階の計算を行いたい場合には，n格子分の「袖」を用意すれ
ばよい．

解析領域

(1) 領域分割

キャッシュミス率[%]

0.4

0.3

0.2

0.1

0.0

リージョン10

リージョン2

10

20

30

40

50

60

70

プロセス数

(2) 「袖」の確保

図3 プロセス数とキャッシュミス率の関係(3) データの転送

並列化効率[-]

20

15

10

5

0
0

図2 MPI並列化の概要

20

40
プロセス数

60

図4 プロセス数と並列化効率の関係

80step1 勾配の計算に必要なデータの転送

step1 勾配の計算に必要なデータを3格子分転送

step2 勾配の計算
step2 勾配の計算（「袖」の部分も2格子分計算）

リージョン1

リージョン2

step3 勾配の計算結果の転送

サブリージョン1

サブリージョン2

step3 勾配制限関数の計算（「袖」の部分も1格子分計算）

step4 勾配制限関数の計算
step4 数値流束の計算（通常通り計算）

リージョン1

リージョン2

step5 勾配制限関数の計算結果の転送

図6 サブリージョンにおける計算の流れの概略

step6 数値流束の計算

リージョン1
リージョン2
図5 非構造格子CFDソルバの計算の流れの概略
この（「袖」の部分まで計算に含める）方法は，プロセス間通信を最適化する場合によく用いられる方法である．計算量は増えるが通信回数は減っており，通信量が同じであれば通信のオーバーヘッドが削減される．このことから，計算時間の増加に比べて，通信のオーバーヘッドの削減効果が大きければ全体の計算時間は減少する．非構造格子CFDソルバの場合には，勾配の計算結果を「袖」に転送するデータ量に比べ勾配の計算に必要となる「袖」のデータ量の方が少ないので，転送デー
タ量の削減にもなっている．そして，メモリスループットが十分でないハードウエアの場合には，キャッシュを有効に利用することにより計算時間が大幅に削減されることが期待できる．
実装に際しては，サブリージョンiに含まれる格子点の番号をns,i
i 1

ns ,i   m j  1
j 0

m0  0i  1,  n

から始め，サブリージョン内で連番になるように付け替えるとよい．ただし，mjはサブリージョンjに含まれる格子点の総数であり，nはサブリージョンの数である．この番号付け替えによりサブリー
ジョンを生成したことによる既存プログラムのデータ構造の変更が不要になる．
そして，サブリージョン内のデータにアクセスするためには，各サブリージョンにおける格子点
番号の最大値ne,i=ns,i+1－1に加えてne,0=0を保存したテーブルを用意しておけばよい．このとき，サブリージョンiに含まれる格子点の番号は，ne,i-1+1からne,iである．
以上の方法は，MPIによるプロセス並列化の手法を再帰的に適用するものであり，実際にCFDソル
バの並列化を行ったことのある人であれば，新たな知識を必要とせずに実装可能であるところに最大の特徴がある．
2.10.5 まとめ「京」を中心とした現状のスパコンに対して，非構造格子CFDソルバの計算で必要となるBF比が確保されているか概算した結果，十分とは言えない状況になりつつあることが確認された．
そのため，BF比の不足を補うための機構であるキャッシュの有効利用法について考察した．CFD
ソルバがMPIにより領域分割の手法で並列化されていることを前提に，同様の方法を分割されたあとの領域に再帰的に適用することで，キャッシュに乗る程度の細かい領域を作ることが可能となる．
このとき，「袖」を十分な量確保し，必要に応じて袖の部分も計算することにより，他の領域の計算結果を参照することなく計算を進めることが可能となる．これにより，キャッシュ上のデータが他の領域の計算のためにメモリに書き戻されるのを避けることができる．
この方法には，MPIによる領域分割の手法で並列化することができるならば，他の知識を必要とせずにキャッシュの有効利用が計れるという利点もある．
2.10.6 APPENDIX
N行N列（N=4096）の正方行列についての行列・行列積にタイリングを適用（リスト2）し，小行列（タイル）の数n（=m）を適宜変更して，FX1において逐次実行したときの経過時間および実効性
能を表A-1に示す．また，そのときのL1データキャッシュミス率（L1$op miss）およびL2キャッシュ
ミス率（L2$ miss）を表A-2に示す．また，図A-1にL1データキャッシュミス率と経過時間の関係を，
図A-2にL2キャッシュミス率の関係をそれぞれ示す．
図A-2よりn=8（p=512）のときに比べn=16（p=256）のときにL2キャッシュミス率が100分の1以下に減少しており，L2キャッシュが有効に利用されるようになったことがわかる．しかし，この段階では実効性能の向上は見られない．
一方で，図A-1よりn=32（p=128）のときに比べてn=64（p=64）のときにL1$op missが10分の1以下に減少し，L1データキャッシュが有効に利用されるようになったことがわかる．同時に，実効性能も明らかに向上しており，リスト2で示した性能向上の効果は，タイリングによってL1データキャッ
シュが有効に利用されるようになった結果であることがわかる．
また，L1データキャッシュとL2キャッシュのいずれにおいても，小行列のサイズをさらに小さくしていくと，再びミス率は増加に転じており，キャッシュを効果的に利用するには，タイルの大きさを適切に選択しなければならないこともわかる．
ただし，リスト2で示した小行列のサイズn=256（p=16）の場合には，特異的によい実効性能を示しており，単純にキャッシュの利用効率だけで小行列のサイズを決定することはできないこともわ
かる．

表A-1 行列・行列積（リスト2）の測定結果表

n(=m)

p(=q)

経過時間[秒]

1
2
4
8
16
32
64
128
256
512

4096
2048
1024
512
256
128
64
32
16
8

128.10125.61125.68123.91
123.49124.57
83.26
95.48
60.43
120.69

表A-2 行列・行列積（リスト2）のキャッシュミス率

実効性能[GFLOPS]
1.07
1.09
1.09
1.11
1.11
1.10
1.65
1.44
2.27
1.14

150

3.0

150

100

2.0

100

n(=m)

p(=q)

L1$op miss[%]

L2$miss[%]

1
2
4
8
16
32
64
128
256
512

4096
2048
1024
512
256
128
64
32
16
8

2.79952.78642.78512.77732.76312.71720.17910.24950.72590.96230.69470.69390.69340.00410.00560.00860.01250.02480.14220.3530

1.0

0.5
50

0

1

2

4

8

16

32

64

1.0

50

0.0

0

128 256 512

小行列（タイル）の数 n(=m)

0.0

1

2

4

8

16

32

64

128

256

小行列（タイル）の数 n(=m)

L1キャッシュミス率（右軸：％）

L2キャッシュミス率（右軸：％）

経過時間

経過時間

（左軸：秒）

図A-1 L1キャッシュミス率と経過時間の関係

512（左軸：秒）

図A-2 L2キャッシュミス率と経過時間の関係

また，本稿では配列A，BおよびCについてallocate文による動的確保の例（リスト1）を示したが，これを静的に確保した場合には，FX1のコンパイラ1は，自動的にBLASの行列・行列積ライブラリ
MATMULを呼び出す．しかし，このライブラリの実効性能は，配列のサイズを4096×4096として確保すると，少なくともN=512およびN=4096の場合には，およそ430MFLOPS程度にとどまる．確保す
る配列のサイズを5000×5000とすると，N=512の場合の実効性能は8,525MFLOPSとなるので，配列サ
イズ4096×4096の場合に，MUTMALライブラリの性能が特異的に低下するものと推定される．高度に最適化されたライブラリの利用が可能な場合には，それを利用すべきであることは言うまでもな
いが，ライブラリの性能のこのような不安定性は，その利用を阻害するのに十分なものであり，改善が求められる．
また，配列を静的に確保すると自動的に呼び出されるライブラリが，動的に確保すると呼び出されなくなってしまうことに関しても改善の余地があるものと考える．

1

使用したコンパイラは，Fujitsu Fortran Version 8.1．

参考文献
[1] JHPCI
https://www.hpci-office.jp/[2] 文部科学省『「今後のハイパフォーマンス・コンピューティング技術の研究開発について」の報告書のとりまとめ』 平成23年7月15日
http://www.mext.go.jp/b_menu/houdou/23/07/1308508.htm[3] 東北大学サイバーサイエンスセンター他主催 「戦略的高性能計算システム開発」
http://www.open-supercomputer.org/workshop/[4] ハイエンドテクニカルコンピューティングサーバFX1
http://jp.fujitsu.com/solutions/hpc/products/fx1.htm[5] 世界最速スーパーコンピュータ「京」http://www.nsc.riken.jp/shirutsudoi/8-houkoku/p_01.pdf[6] PRIMEHPC FX10
http://jp.fujitsu.com/solutions/hpc/products/primehpc/[7] SPARC64X:Fujitsu's New Generation 16 Core Processor for the next generation UNIX server
http://jp.fujitsu.com/platform/server/sparcenterprise/event/12/hotchips24/pdf/HotChips24_Fujitsu_presentation.pdf[8] Mucci, P., "Memory Bandwidth and the Performance of Scientific Applications: A Studyof the AMD Opteron Processor" AMD Technical Whitepaper, June 2004.
http://web.eecs.utk.edu/~mucci/latest/mucci_pubs.php[9] Hashimoto, A., et al., "Toward the Fastest Unstructured CFD Code 'FaSTAR'" AIAA paper 2012-1075