A01ñLÆ ,HŐĸĽŠv"Ê¯ŤƔŰƓŵƎ£«ÂºƟñL®LMLMéųŴżƎiFVM£«¦ûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«£«´¸• £«Âº– ñLƛ®LMƘ)upƜƟ
£«¶oĸŝŔñÙŤƔŰƓŵƎ• £«+nº– [ƛìØLMƘ)upƜƟg»źƑƙƁƗŭ
– KâQƛ®LMƘ2uƜƟLÆ ·^Ê¯• Ús£«º– ¾ ƛ®LMƘupƜƟ,ųŴżƎőg»Ë– ¥ƛ®LMƘupƜƟ¯ĸŝŔØg»ő{Ý4– ä ƛ®LMƘupƜƟv"ŤƔŰƓŵƎûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«Â(P• £«ÂºƟñLƛ®LMƜƟ20+– ŴƙƃƙůƗƅƑƙŸŐ=ĽŇñÙƆƙƓũIrƛFFTƜ
őŤƔŰƓŵƎ– GPUŐŝŠ4!Ƙ8!°\BLASőOÃōËƛM2Ɵ~LCƜ– GPUŐĸĽŠ²^]¼3ÞmŐŝŠ¿,ƉŬžƔªőñÙ4ƛM2Ɵ h9Ɯ• £«+nºƟ[ƛìØLMƜƟ10+– Multi-{core,socket,GPU}=Ľv"Ê¯ŷƆžŧŨŤő{ÝOÃƘźƑƙƁƗŭlÀő£«• £«+nºƟKâQƛ®LMƜƟ10+– Block Krylov ŤƔŰƓŵƎŐŝŠÚ¬x¨]őÈñÙ4ûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«ŴƙƃƙůƗƅƑƙŸŐ=ĽŇñÙƆƙƓũIrƛĉĉĔƜőŤƔŰƓŵƎ• ,#FFTŐĸĵŋxƝyƝzx=őĶňzx=őřŐ#+/ŁŇG;ƝÑ,4Œ7»ƞ– 1,0241,0241,024FFTţ2,048 MPIƈƖŶŴŌ+/ŌĻŏĵƛ1,024MPIƈƖŶŴŘŌŒ+/7»Ɯ• yƝző

#+/ŌRfŃŠƞ

– 1,0241,0241,024FFTĺ1,048,576ƛ=1,0241,024ƜMPIƈƖŶŴŘ
Ō+/7»ŐŏŠƞ• ¯ß+ōØß+ţŪƙƂƙƒŻƈŀńŠĿōŌƝŀŞŐg»ţ=ŀńŠĿōĺŌĻŇƞ• ŪƙƂƙƒŻƈŐí<}ØƛMPI_IsendƝMPI_IrecvƜţŉŇG;ŐŒƝg»ĺ=ŁŏĵĿōĺĴŠƞ– Øţ¿ĶêŐCPUƓŷƙŴţÏŃŠŇŚƞ– ŅőŝĶŏG;ŐŒØSőŴƕŻſţ¬ňľŠĿōŌƝg»ţt@ƞûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«,#FFTŐĸĽŠ¯ōØőŪƙƂƙƒŻƈ
1. FFTs in
x-direction

2. FFTs in
y-direction

3. FFTs inz-direction

1221Comp. 1 Comm. 1
Comp. 1 Comm. 1
Comp. 2 Comm. 2Comp. 2 Comm. 2
ûùúúøüøþ

wMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«Comp.

ûùúúøüøþ

wMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«ĊĐĕŐŝŠý!Ƙā!°\ąčĄēőOÃōËƛĎû~Ɯ• !°\3UvvŒƝ1961ZŐIBM 7030ƛStretchƜŌT%ŀšŇƞ• 1EFlopsƛ1§çŐ100AƜŌ1ÛçÊ¯ŃŠōƝ±610^23Aő3UvÊ¯ĺ¿ŢšŠ  ŤƋūſƖvōŖŗ<łƞ•ŚÌW­ţ¹jŁŇG;ŐƝ!°\3Uv¯ŌŒ°\ĺ5+ōŏŠÊ¯ĺ*ŋļŠƞ• ũŬűŴŮƙƔųŴżƎŌŒ4!°\¯ĺeÅŐŏŠ7»gĺĴŠƞ• GPUŐŝŠ4!Ƙ8!°\BLASőOÃ
– 4!Ƙ8!°\¯Ɵ¯ãĺKļƝByte/Flop"ĺíXŐUŀĵ– BLASƟ,gĺñĵƉŬžƔƘ¿,¯ĹŞkŠ– GPUŐŝŠ1Ùĺ}_ŌĻŠ• AXPYƝGEMVƝGEMMţOÃŁTesla C2050Ōg»ţËûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«ćć型ý倍・đć型ā倍精度演算（úøû）
ććøđć型データフォーマットþûĜğĦずつ倍精度数に格納する ý倍精度数    ā倍精度数     

đć型ā倍精度11bits208 bits
a0 (52 bits)

a1 (52 bits)

a2 (52 bits)

a3 (52 bits)

a1 (52 bits)

ćć型ý倍精度

104 bits
a0 (52 bits)

112 bits

15bits52 bits

ċĈĈĈòĀþýöûùùā倍精度óĜğġěĤĩòÿýôċĈĈĈòĀþýöûùùāòý倍精度
óĜğġěĤĩòúûāô
指数部
符号òóúòĜğĦôûùúúøüøþ

wMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«

仮数部

ćć型ý倍・đć型ā倍精度演算（ûøû）
ĉĎĄ命令による演算量の削減 ĉĎĄ命令の使用によりý倍・ā倍精度積和演算では演算量が約ûøüになる
¯ã
¯
1¯
ª?

DDD4!°\

QDD8!°\FMAĴş

FMAŏŁFMAĴşFMAŏŁ

10 Flop

24 Flop

193 Flop

333 Flop

20 Flop30 Flop

44 Flop90 Flop
283 Flop

423 Flop倍精度演算に対する演算量の増大（ĉĎĄ命令使用時）
Ĭý倍・ā倍精度の乗算と加算がúăúの割合で出現する場合
 ćć型ý倍精度演算：úþ倍wMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ đć型ā倍精度演算：úýú÷þ倍Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«ûùúúøüøþ

ý倍・ā倍精度ąčĄēの実装
基本方針 演算と入出力すべてがý倍・ā倍精度
 データはĝĢħĜĠĞ型û個（ćć）またはý個（đć）の構造体ý倍・ā倍精度演算 đćライブラリęąěğĠĞĩòĞĦòěĠ÷òûùùûĚをĆĕćĄに移植 ĉĎĄ命令を使用òąčĄēの実装
 まず高速な倍精度演算カーネルを作る
 倍精度演算をý倍・ā倍精度演算に置き換えてチューニング 各スレッドがベクトル・行列のú要素ずつを計算wMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟûùúúøüøþÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«

性能評価ĆĕććąčĄē・ĆĕđćąčĄēの性能をĔĞĥĠěòĆûùþù上で評価
 比較対象として倍精度のąčĄē（ĊĢĦĢòąčĄē，ĆĕąčĄē），およびĆĐĕ（ĆĢĤĞòğĀòĂûù）で動作するý倍・ā倍精度
ąčĄē（ććąčĄēõòđćąčĄē）の性能を測定 ććąčĄē，đćąčĄēはďģĞġĎĐで並列化
ÓRÎ
CPU
GPU!°\GotoBLAS (2-1.13)

CUBLAS (3.2)

DDD4!°\

DDBLASCUDDBLAS

QDD8!°\

QDBLASCUQDBLASčĞĨĞĠöú〜üのü関数（ĄėĐĘõòĊĈĎĖõòĊĈĎĎ）を評価
 入力は乱数で初期化した の正方行列（列優先格のベクトル（Ī，īは乱数で初期化）wMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟûùúúøüøþ納），大きさÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«ĄėĐĘの性能
ĐĆċĞデータ転送時間を含んだ性能：オレンジ色の線で示す

DAXPY

(Double)109876543210DDAXPY (Quadrupl QDAXPY (Octuple
4.5

 
14   

0.8

3.5
30.62.52

   

0.41.5 0.2

  0  
1.E+063.E+065.E+067.E+06
1.E+063.E+065.E+067.E+06
N    
N0 

10.5

1.E+063.E+065.E+067.E+06N

ĐĆċĞ転送性能律速であるがā倍精度でĆĐĕより高速となったûùúúøüøþ
øwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
wMÀîE£«Ĳƅż Ŭ ŐŝŠÐŽŲŦÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«ĊĈĎĖの性能
ĐĆċĞデータ転送時間を含んだ性能：オレンジ色の線で示す

DGEMV  (Double)
25

DDGEMV (Quadrupl QDGEMV (Octuple  

201510  50 1098765432
  
10  1024 3072 5120 7168
1024 3072 5120 7168
N=M    
N=M
1 

0.8
0.6
0.4

  0.2

 01024 3072 5120 7168
N=MĐĆċĞ転送の影響は大きいが，ā倍精度でĆĐĕより高速となったûùúúøüøþ
øwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
wMÀîE£«Ĳƅż Ŭ ŐŝŠÐŽŲŦÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«ĊĈĎĎの性能
ĐĆċĞデータ転送時間を含んだ性能：オレンジ色の線で示す

DGEMM (Double) DDGEMM (Quadrupl QDGEMM (Octuple
350300   
1816  14250

12200150

 60.40512

  
1536 2560 3584
N=M=K 20  

0.80.64 1  10    810050


1.20.2 05121536 2560 3584

512

N=M=K1536 2560 3584
N=M=K

倍精度ではĊĈĎĎでもĐĆċĞý倍・ā倍精度演算では演算量が増
バンド幅の影響が大きい
加し，ĐĆċĞバンド幅の影響が減少wMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
wMÀîE£«ĲůůƗƅƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ

ûùúúøüøþ
ûùúúøüøþÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«Ä;¢èōíYÁ
ƀƍŬŴĳYk22Z\£«ĊĐĕŐĸĽŠ²^]¼3ÞmŐŝŠ• GPUŌ²^]ţ¼3ÞmŁƝ¿,ƉŬžƔªţ¿,ƉŬžƔªőñÙ4ƛĎû ñÙ4Ɯ• CUDAţĵŋƝ4©ðő²^]ƛCRSƝJDSƝELLƝSSƜŌő¿,ƉŬžƔªţOÃŁƝg»ţË• ¼3ÞmőŇŚőƃƒƏƙŸţN• 6cţĵŋƝ¼3ÞmŤƔŰƓŵƎţËĭCRS^]Ō¿,ŽƙŸţ%0ŃŠĮ¼3ÞmŤƔŰƓŵƎţĵŋƝ%0ŀšŇ¿,Ő{Ýŏ²^]ţÞmŁƝIrwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
į6cőO¿ûùúúøüøþÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«¿,ő²^]• CRSƛCompressed Row StorageƜ^]
4ŋĵ
1ĵŠ
2Š
2²6²^
3 1 5– {ś½¡ŐĵŞšŋĵŠ²^]–{śíëÅ³őà,valšŋ
colind1 4 3 1 2 4 2 3rowptr 1 3 4 7 9

íëÅ³ő,8ûŊőà,Ōő:¿ő$ï
ţÂŃà,• ő²^]ő– JDSƛJagged Diagonal StorageƜ^]– ELLƛELLPACK/ITPACKƜ^]– SSƛSegmented ScanƜ^]ûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«

¼3ÞmŤƔŰƓŵƎőšĆĒē^]Ō¿,ţ%0ĆĒē^]JŏŞ²^]ţIr¼3ÞmŤƔŰƓŵƎĆĒē^]ŏŞŅőŘŘČćēòĢĤòĈččòĢĤòēēŐIr6cŏŎőO¿ûùúúøüøþ{Ýŏ²^]ţÞmwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
ŃŠĿōŌƝñÙ4Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«g»Ëƛ1/4Ɯ• 4©ðő²^]Ōő¿,ƉŬžƔªőg»ţË• !°\¯• CPUōGPUçőŽƙŸÒÖőzçŒ>Śŏĵ• ËH
CPUAMD Opteron 6134 ƛ8ůŤƜİ 2ƏŦƗƏƐƓ

4GB

GPU

NVIDIA Tesla C2050

ƄŽŪƏƐƓ3GB

ÍƅƙŬg» 515GFLOPSƛ!°\Ɯ
ECC

ON

æ

CUDA SDK 3.2

HůƗƃŦƒûùúúøüøþ

nvcc (-O3 -arch=sm_20)

version 3.2

wMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«g»Ëƛ2/4Ɯ• ËŐêŁŋŒUniversity of Florida Sparse Matrix
CollectionĹŞ30 ő¿,ţĵŇƞ¿,ÔőåŀíëÅ³v

s3dkt3m290449

3686223

1.031

0.04506

af_shell9504855

17588845

1.148

0.00690tmt_sym

72671350809611.287

0.00096

nd24k

72000

28715634

1.304

0.55393ldoor

95220342493817

1.725

0.00469

m_t1

97578

9753570

2.371

0.10244

pwtk

21791811524432

3.404

0.02427

F1343791

26837113

5.572

0.02271

bmw3_222736211288630

6.767

0.02184

Ga3As3H1261349

5970947

16.6650.15865ûùúúøüøþ

íëÅ³v íëÅ³ƛƚƜőœŞŊĻwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«g»Ëƛ3/4Ɯ• ¼3ÞmŤƔŰƓŵƎţƝ6cţĵŇÚ¬x¨]őÈŐÝŁŋË• 6cŐŒBi-CGSTABţĵƝ6cAvŒ100A• CRS^]Ō¿,ţ%0ŁŇaƝ¼3ÞmŤƔŰƓŵƎŐŝŉŋ{Ýŏ²^]ŐIrŁŋƝ6cţO¿• ¼3ÞmŐÅŃŠzçŜIrőzçţ>ŚŇƝ&őO¿zçţN–%0ŀšŇCRS^]őŽƙŸţCPUĹŞGPUŕÒÖŃŠzçŒ>ŚŏĵûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«g»Ëƛ4/4Ɯ• ËŌŒő6ØşőG;ţN– NVIDIAĺqŁŋĵŠƒŦƇƒƓCUSPARSEţĵŋCRS
^]őŘŘO¿– CRS^]ĹŞ3©ðő²^]ƛJDSƝELLƝSSƜŐIr
ŁŋO¿– CRS^]Ō%0ŁƝ¼3ÞmŤƔŰƓŵƎŐŝŉŋIrŁŋO¿– CRS^]Ō%0ŁƝŅšņšő²^]Ōő¿,ƉŬžƔªţ10AO¿ŁŇµĹŞƝ{Ýŏ²^]ţÞmŁŋƝ6cţO¿ƛexamƜûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«ËµCUSPARSEƛCRS^]ƜŐRŃŠÙ\=

CUSPARSE(CRS)

JDS

SS

ELL

¼3Þm¼3Þm

1.6
1.4
1.2
10.8
0.6
0.40.20¿,ő©ðûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«examŘōŚ• ŴƙƃƙůƗƅƑƙŸŐ=ĽŇñÙƆƙƓũIrƛFFTƜ
őŤƔŰƓŵƎ– ,#FFTŐĸĵŋƝ #+/ŐŝşØzçţ.ŃŠō'ŐƝ¯ōØţŪƙƂƙƒŻƈŀńŠĿōŌƝŀŞŐg»ţt@ŃŠĿōĺŌĻŇƞ• GPUŐŝŠ4!Ƙ8!°\BLASőOÃōË– GPUŐŝŠDDD4!ƘQDD8!°\BLASţOÃŁŇƞ
– 4!°\AXPYƝ4!°\GEMVŒƏƐƓ`ÙōŏşƝO¿zçŒ!°\ŐRŁŋŅšņš±2.2!Ɲ±2.5!ōŏŉŇƞ
– Core i7 920ŐRŁŋ4!°\Ō±8Ơ32!Ɲ8!°\Ō±20Ơ24!őñ
Ù4ţÜkŁŇƞ

• GPUŐĸĽŠ²^]¼3ÞmŐŝŠ¿,ƉŬžƔªőñÙ4– ¿,ő²^]ţ¼3ÞmŃŠĿōŐŝşƝ¿,ƉŬžƔªőñÙ4ţ¿ŉŇƞ– ËŐĵŇ30 ő¿,őĶň28 ő¿,ŐĸĵŋƝCRS^]őŘŘCUSPARSEƒŦƇƒƓţĵŋO¿ŃŠőō<­őñÙ4ţÜkŁŇƞûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«      

NVIDIA GTX285ûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟůŽŲŦƗƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«YÁ

NVIDIA
NVINVN
VIDIA GGTGTX285
GTX285
TX285wÆƟ¿,ªţdŐòĊĐĕŌí<}Ê¯òŅšJŒòĆĐĕŌƌƔźŴƕŻſ,ƉŬžƔŽƙŸőřƊŴžƘŽƂŦŴçÒÖbáRÇ4
B|"Ê¯   

B|"Ê¯

×Ir

NVIDIA GTX285

ûùúúøüøþáRÇ4wMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟÐŽŲŦƗƟÄ;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«

×Ir

ûþ

ûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«
ŹŦƀŦƀ
ƀƍ
ƍŬŴŬŴ
wMÀîE
wwM
MÀîEûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«

– NVIDIA¤őCUDA, CUBLASţ-ŃŠĿōŌPyŐ
GPU,7»– g»NŌŒCUBLASŜMAGMABLASőg»Œ
DGEMMŏŎƕƉƔ3BLASŌŒíXŐŝĵı
– B|"Ê¯ŌeÅŏƕƉƔ2BLASőg»ĺŝĵōŒÉķŏĵò g»t@ŁŇBLAS/CUDAţæ Ł´řÕřwÆƟ¿,ªţdŐòĊĐĕŌí<}Ê¯òŅšJŒòĆĐĕŌƌƔźŴƕŻſ,ƉŬžƔŽƙŸőřƊŴžƘŽƂŦŴçÒÖbáRÇ4   B|"Ê¯áRÇ4

B|"Ê¯

×Ir

×IrwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
«ĲůƗƅżťŬŴÐŽŲŦƗƟ
Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«Z\ «
NVIDIA GTX285

ûùúúøüøþ

ûāCPU only(4cores)

CUBLAS3.1 MAGMA0.2

MYBLAS+MAGMA0.3

ŝşŝĵBLASOÃŐŝŉŋñÙ4ĺŏŀšŠ

MYBLAS+MAGMA+thunking.dgem
gemm

MYBLASv2+MAGMA+thunking.d
gemm

1000 0.243

0.286

0.275

0.267

0.298

0.294

2000 1.813

1.397

1.213

1.141

1.178

1.160

3000 5.857

3.944

3.403

3.032

2.997

2.865

4000 13.672

8.153

7.0886.457

5.841

5.559

5000 25.049

14.783

12.932

11.168

10.669

9.871

6000 42.326

24.275

21.389

18.076

17.020

15.19

7000 65.715

37.322

32.472

27.063

25.429

22.64

8000 101.263 54.234

46.969

38.747

35.49030.79

ûùúúøüøþwMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«ûùúúøüøþ

wMÀîE£«ĲůƗƅƑƙżťŬŴŐŝŠÐŽŲŦƗƟ
Ä;¢èōíYÁŹŦƀƍŬŴĳYk22Z\£«