Mais conteúdo relacionado Semelhante a PEZY-SC2上における倍々精度Rgemmの実装と評価 (20) PEZY-SC2上における倍々精度Rgemmの実装と評価2. PEZY Computing
目次
1. はじめに
2. MIMD型メニーコアプロセッサPEZY-SC2
3. 倍々精度演算
4. pzqdライブラリ
1. pzqdライブラリの機能と実装
2. dd_Rgemmの実装
5. dd_Rgemmの性能
6. まとめ
7. 次世代機PEZY-SC3の紹介
途中での質問も大歓迎!
2018/09/04 JSIAM2018 2
3. PEZY Computing
背景 高精度演算の重要性†
• 計算機環境の大規模化・複雑化
大規模,悪条件な問題に対する物理シミュレーションのニーズが増大
演算精度が原因で解が得られないことがある
コプロセッサ(GPU, Xeon Phi等)を用いた計算環境の普及
− アーキテクチャごとのプログラミング環境・最適化技法
− ライブラリ開発の重要性と複雑さが増大
• 高精度演算を用いれば誤差の影響を低減可能
高精度演算は演算量・メモリデータ量が多い
C,FORTRANは標準では高精度演算は使えずプログラミングが難しい
• 倍々精度演算
倍精度変数2つを組み合わせて、ほぼ4倍精度演算を実行
倍々精度1加算 = 倍精度加算約20回
IEEE 754基準の4倍精度と比べて高速
2018/09/04 JSIAM2018 3
†David H. Bailey and Jonathan M. Borwein,
"High-precision arithmetic in mathematical physics,"
Mathematics, vol. 3 (2015), pg. 337-367.
4. PEZY Computing
関連研究
• 倍々精度演算は、様々なアーキテクチャ上で高速化や
ライブラリ化が行われてきた
• ライブラリ開発
qd: DD, QD精度に対する算術演算・数学関数ライブラリ
− Y.Hida, http://crd-legacy.lbl.gov/~dhbailey/mpdist/
MPACK: QDやMPFRを利用した高精度BLAS/LAPACKライブラリ
− M.Nakata, http://mplapack.sourceforge.net/
• SIMDやGPUによる倍々精度演算の高速化
CPU上でAVXを用いた倍々精度SpMVの高速化 (菱沼, 他, 2014)
− 菱沼 利彰, 藤井 昭宏, 田中 輝雄, 長谷川 秀彦. AVX2を用いた倍精度BCRS形式疎行列と倍々精度ベクトル積
の高速化, 情報処理学会論文誌コンピューティングシステム(ACS), Vol.7, No.4, pp.25-33 (2014).
GPU上で倍々精度BLAS関数の高速化 (D.Mukunoki, et.al., 2010)
− D. Mukunoki, et al., “Implementation and Evaluation of Quadruple Precision BLAS Functions on GPUs",
PARA2010, pp.249-259, 2010.
GPU上で倍々精度GEMMの高速化 (M.Nakata, et.al., 2012)
− M. Nakata, et al., “A fast implementation of matrix-matrix product in double-double precision on NVIDIA
C2050 and its application to semidenite programming",ICNC2012, pp.68-75, 2012.
2018/09/04 JSIAM2018 4
5. PEZY Computing
メニーコアMIMD型プロセッサPEZY-SC2
• メニーコアプロセッサ
1台あたり2,048 Processing Element (PE)をもつ
各PEに20KBの高速なローカルメモリをもつ
− 1サイクルでLoad/Storeが可能
• 1PEあたり8スレッド (Hardware Multi-Threading)
2048 * 8 = 16384スレッド
− ハードウェアレベルで8つのプログラムカウンタをもつ
− レイテンシ隠蔽・スループット向上
• MIMD (Multiple Instruction Stream Multiple Data Stream)
ALU、FPU、命令発行ポートを各PEに備える
GPUと違い、複雑なことをするときの制約が少ない
2018/09/04 JSIAM2018 5
7. PEZY Computing
0. 本発表の結果の概要
• PEZY-SC2向けにqdライブラリ移植
デバイス上で簡単にDD精度が利用可能
• 倍々精度のgemmを開発し性能評価
• ピーク性能の76%
倍精度換算で最大1321 GFLOPS, DD換算で58 GFLOPS
通信を含めると14%程度性能低下した
• 性能を出すにはローカルメモリの利用が重要だった
8 Thread / Core, 4 Cycle / 1 Instructionが基準
今回は4スレッドで十分にパイプラインが詰まった
− スレッドを減らしスレッドあたりのローカルメモリを増やした
ブロック化が有効だった
2018/09/04 JSIAM2018 7
8. PEZY Computing
目次
1. はじめに
2. MIMD型メニーコアプロセッサPEZY-SC2
3. 倍々精度演算
4. pzqdライブラリ
1. pzqdライブラリの機能と実装
2. dd_Rgemmの実装
5. dd_Rgemmの性能
6. まとめ
7. 次世代機PEZY-SC3の紹介
途中での質問も大歓迎!
2018/09/04 JSIAM2018 8
9. PEZY Computing
PEZY-SC2の特徴 (2048 PE)
2018/09/04 JSIAM2018 9
Prefecture (256PE) City (16PE) Village (4PE) PE
Program Counter × 8
L1 Instruction Cache
4KB
ALU
4FP ops/cycle
Register File
32bit × 512w
Local Memory
20KB
PE
PE
L1 Data Cache
2KB
PE
PE
Village
(4PE)
L2 Data Cache
64KB
L2 Instruction Cache
32KB
Village
(4PE)
Village
(4PE)
Village
(4PE)
Special Function UnitCity
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
Prefecture
(256PE)
Prefecture
(256PE)
LLC
2560KB
LLC
2560KB
LLC
2560KB
LLC
2560KB
DDR4 64bit 3.200MHz
Prefecture
(256PE)
Prefecture
(256PE)
LLC
2560KB
LLC
2560KB
LLC
2560KB
LLC
2560KB
DDR4 64bit 3.200MHz
DDR4 64bit 3.200MHz DDR4 64bit 3.200MHz
PCIe Gen4 x8
PCIe Gen4 x8
PCIe Gen4 x8
PCIe Gen4 x8
PE = core
Prefecture
(256PE)
Prefecture
(256PE)
LLC
2560KB
LLC
2560KB
LLC
2560KB
LLC
2560KB
Prefecture
(256PE)
Prefecture
(256PE)
LLC
2560KB
LLC
2560KB
LLC
2560KB
LLC
2560KB
MIPS MIPS MIPS
MIPS MIPS MIPS
• 3階層キャッシュアーキテクチャ (Prefecture-City-Village)
10. PEZY Computing
PEZY-SC2の特徴 (2048 PE)
2018/09/04 JSIAM2018 10
Prefecture (256PE) City (16PE) Village (4PE) PE
Program Counter × 8
L1 Instruction Cache
4KB
ALU
4FP ops/cycle
Register File
32bit × 512w
Local Memory
20KB
PE
PE
L1 Data Cache
2KB
PE
PE
Village
(4PE)
L2 Data Cache
64KB
L2 Instruction Cache
32KB
Village
(4PE)
Village
(4PE)
Village
(4PE)
Special Function UnitCity
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
City
(16PE)
Prefecture
(256PE)
Prefecture
(256PE)
LLC
2560KB
LLC
2560KB
LLC
2560KB
LLC
2560KB
DDR4 64bit 3.200MHz
Prefecture
(256PE)
Prefecture
(256PE)
LLC
2560KB
LLC
2560KB
LLC
2560KB
LLC
2560KB
DDR4 64bit 3.200MHz
DDR4 64bit 3.200MHz DDR4 64bit 3.200MHz
PCIe Gen4 x8
PCIe Gen4 x8
PCIe Gen4 x8
PCIe Gen4 x8
PE = core
Prefecture
(256PE)
Prefecture
(256PE)
LLC
2560KB
LLC
2560KB
LLC
2560KB
LLC
2560KB
Prefecture
(256PE)
Prefecture
(256PE)
LLC
2560KB
LLC
2560KB
LLC
2560KB
LLC
2560KB
MIPS MIPS MIPS
MIPS MIPS MIPS
• 3階層キャッシュアーキテクチャ (Prefecture-City-Village)
② 2048PE
(8 Prefecture)
③ 64bit SIMD
① X-bar接続のLast level Cache (計30MB)
④ ローカルメモリ
20KB/PE
12. PEZY Computing
PEZY-SC2の概要
プロセスルール 16nm
動作周波数 1GHz
メモリ
キャッシュ
L1:4MB(D), 8MB(I);
L2: 8MB(D), 4MB(I)
LLC: 40MB (X-bar接続)
ローカルメモリ 40MB (20KB/PE)
インタフェース
PCIe I/F
PCIe Gen4 8Lane 4Port
(16GB/s x 4 = 64GB/s)
DDR I/F
DDR4 64bit 3,200MHz 4Port
(25GB/s x 4 = 100GB/s)
PE数 2,048 MIMD
SIMD 64bit
ピーク性能
(TFLOPS)
DP 4.1
SP 8.2 (x2 SIMD)
HP 16.4 (x4 SIMD)
消費電力 200W(peak)
2018/09/04 JSIAM2018 12LLC=Last Level Cache
13. PEZY Computing
PEZY-SC2の演算器
• 積和命令:d = a + b × cが利用可能 (MAD命令)
FMA命令は利用不可。乗算の結果を丸めて加算器に入れる
• 8スレッド (表・裏4スレッドずつ、任意タイミングで切替)
• MAD命令8サイクル, 他は全て4サイクルで実行可能
• インオーダー実行
ハードウェアによる命令並べ替えを行わない
2018/09/04 JSIAM2018 13
TH0F TH1F
TH2F
TH0B TH1B
TH3F
TH3B TH2B
l.chgthread
l.actthread
clk
clk
clk
clk
IF1 IF2 IF3 ID RA1 RA2 RA3 RA4 EX1 EX2 EX3 EX4 WB1 WB2 FB CB
IF1 IF2 IF3 ID RA1 RA2 RA3 RA4 EX1 EX2 EX3 EX4 WB1 WB2 FB CB
IF1 IF2 IF3 ID RA1 RA2 RA3 RA4 EX1 EX2 EX3 EX4 WB1 WB2 FB CB
IF1 IF2 IF3 ID RA1 RA2 RA3 RA4 EX1 EX2 EX3 EX4 WB1 WB2 FB CB
Thread 0
Thread 1
Thread 2
Thread 3
14. PEZY Computing
ローカルメモリ
• PEあたり20KBのローカルメモリを利用可能
1サイクルでload/storeが可能
8スレッドで共用
• スレッドごとのスタックとして利用
2.5KB / thread
• ユーザが余剰空間を任意に利用可能
2018/09/04 JSIAM2018 14
Stack for Thread 0
Stack for Thread 1
Stack for Thread 2
Stack for Thread 3
Stack for Thread 4
Stack for Thread 5
Stack for Thread 6
Stack for Thread 7
ユーザ利用可能空間
ローカルメモリ
(20KB/PE)
15. PEZY Computing
• ホストコード(C/C++)をSDKに含まれるPZCL APIで記述
PZCL はOpenCL-Likeなフレームワーク
PZCL-API はデータ転送やスレッド数、スタックの管理などの機能をもつ
• カーネルコードはPZCL Cで記述
OpenCL-LikeなPEZY-SC2プログラミング環境
15
int main(){
float *a, *b, *c;
……
N = sizeof(float) * vector_size;
cl mem mem_a = clCreateBuffer(…, N);
cl mem mem_b = clCreateBuffer(…, N);
cl mem mem_c = clCreateBuffer(…, N);
……
enqueueWriteBuffer(mem_a, true, 0, N, a);
enqueueWriteBuffer(mem_b, true, 0, N, b);
……
Add.setArg(0, mem_a);
Add.setArg(1, mem_b);
Add.setArg(2, mem_c);
Add.setArg(3, N);
……
enqueueNDRangeKernel(Add, 16384, …);
enqueueReadBuffer(d_C, true, 0, C_size, C);
ホストコード (C/C++ and PZCL-API)
void pzc_Add(float* a, float* b,
float* c, int N)
{
int tid = get_tid();
int pid = get_pid();
int pos = pid * get_maxtid() + tid;
int maxid = get_maxpid() * get_maxtid();
for ( ; pos < N ; pos += maxid)
{
float x = a[pos];
float y = b[pos];
c[pos] = x + y;
}
flush();
}
カーネルコード
(PZCL C)
16. PEZY Computing
• ホストコード(C/C++)をSDKに含まれるPZCL APIで記述
PZCL はOpenCL-Likeなフレームワーク
PZCL-API はデータ転送やスレッド数、スタックの管理などの機能をもつ
• カーネルコードはPZCL Cで記述
OpenCL-LikeなPEZY-SC2プログラミング環境
16
int main(){
float *a, *b, *c;
……
N = sizeof(float) * vector_size;
cl_mem mem_a = clCreateBuffer(…, N);
cl_mem mem_b = clCreateBuffer(…, N);
cl_mem mem_c = clCreateBuffer(…, N);
……
enqueueWriteBuffer(mem_a, true, 0, N, a);
enqueueWriteBuffer(mem_b, true, 0, N, b);
……
Add.setArg(0, mem_a);
Add.setArg(1, mem_b);
Add.setArg(2, mem_c);
Add.setArg(3, N);
……
enqueueNDRangeKernel(Add, 16384, …);
enqueueReadBuffer(d_C, true, 0, C_size, C);
ホストコード (C/C++ and PZCL-API)
データ送信
デバイスのメモリ確保
引数をセット
pzc_Add()のコール
void pzc_Add(float* a, float* b,
float* c, int N)
{
int tid = get_tid();
int pid = get_pid();
int pos = pid * get_maxtid() + tid;
int maxid = get_maxpid() * get_maxtid();
for ( ; pos < N ; pos += maxid)
{
float x = a[pos];
float y = b[pos];
c[pos] = x + y;
}
flush();
}
カーネルコード
(PZCL C)データ受信
17. PEZY Computing
• ホストコード(C/C++)をSDKに含まれるPZCL APIで記述
PZCL はOpenCL-Likeなフレームワーク
PZCL-API はデータ転送やスレッド数、スタックの管理などの機能をもつ
• デバイスコードはPZCL Cで記述
OpenCL-LikeなPEZY-SC2プログラミング環境
17
int main(){
float *a, *b, *c;
……
N = sizeof(float) * vector_size;
cl mem mem_a = clCreateBuffer(…, N);
cl mem mem_b = clCreateBuffer(…, N);
cl mem mem_c = clCreateBuffer(…, N);
……
enqueueWriteBuffer(mem_a, true, 0, N, a);
enqueueWriteBuffer(mem_b, true, 0, N, b);
……
Add.setArg(0, mem_a);
Add.setArg(1, mem_b);
Add.setArg(2, mem_c);
Add.setArg(3, N);
……
enqueueNDRangeKernel(Add, 16384, …);
enqueueReadBuffer(d_C, true, 0, C_size, C);
• 各PEはスレッドIDとプロセスIDを用いて独立に制御できる
• キャッシュのコヒーレンシを取ったりスレッドをコントロールする関数を提供
(sync, flush, chgthread, etc..)
ホストコード (C/C++ and PZCL-API)
void pzc_Add(float* a, float* b,
float* c, int N)
{
int tid = get_tid();
int pid = get_pid();
int pos = pid * get_maxtid() + tid;
int maxid = get_maxpid() * get_maxtid();
for ( ; pos < N ; pos += maxid)
{
float x = a[pos];
float y = b[pos];
c[pos] = x + y;
}
flush();
}
カーネルコード
(PZCL C)
19. PEZY Computing
目次
1. はじめに
2. MIMD型メニーコアプロセッサPEZY-SC2
3. 倍々精度演算
4. pzqdライブラリ
1. pzqdライブラリの機能と実装
2. dd_Rgemmの実装
5. dd_Rgemmの性能
6. まとめ
7. 次世代機PEZY-SC3の紹介
途中での質問も大歓迎!
2018/09/04 JSIAM2018 19
20. PEZY Computing
倍々精度型 (DD型)
• Baileyの”Double-Double”精度のアルゴリズム†を用いる
• 倍精度浮動小数点数を2つ用いて4倍精度演算を行う
• IEEE準拠の4倍精度より精度が劣るが高速 (仮数部104bit)
+Exponent part
11bits
Significant part
52bits
Exponent part
11bits
Significant part
52bits
Double-Double precision
Exponent part
15bits
Significant part
112bits
IEEE 754 Quadruple precision
20
†D. H. Bailey, High-Precision Floating-Point Arithmetic in
Scientific Computation, computing in Science and Engineering, pp.54-61, 2005.
21. PEZY Computing
倍々精度行列・行列積 (dd_Rgemm)
• BLASライクなGEMM演算
• CDD= alphaDD * ADD * BDD + betaDD * CDD
• 最内側のループの核はDDのMADで44 flops (cDD += aDD * bDD)
倍精度加算:35 flops
倍精度乗算:9 flops
• 倍精度と比べて1演算に対するメモリ要求量(Byte/flop)が低い
Double : 8 (byte) * 3 (a,b,c) / 2 (flop) = 12.0
DD :16 (byte) * 3 (a,b,c) / 44 (flop) = 1.09
• DDの加算には2種類あり、今回はIEEE-Addを対象とした
Cray-Add:下位の誤差を計算しない (35 flops)
IEEE-Add:下位の誤差を計算する (44 flops)
2018/09/04 JSIAM2018 21
23. PEZY Computing
目次
1. はじめに
2. MIMD型メニーコアプロセッサPEZY-SC2
3. 倍々精度演算
4. pzqdライブラリ
1. pzqdライブラリの機能と実装
2. dd_Rgemmの実装
5. dd_Rgemmの性能
6. まとめ
7. 次世代機PEZY-SC3の紹介
途中での質問も大歓迎!
2018/09/04 JSIAM2018 23
25. PEZY Computing
• “dd_real”型に対する:
変数や関数の宣言
C++の演算子オーバーロードによる四則演算
数学関数
CPU上でqdライブラリを用いたプログラミング例
2018/09/04 JSIAM2018 25
参考:https://na-inet.jp/na/qd_ja.pdf
#include<qd/dd_real.h>
dd_real dd_add() {
dd_real a = "3.14159265358979323846264338327950288";
dd_real b = "2.249775724709369995957";
dd_real c += a * b;
return c;
}
26. PEZY Computing
pzqdのサンプルコード
26
#include “qd.h”
…
int main(){
dd_real *a, *b, *c;
……
size = sizeof(dd_real) * vector_size;
cl_mem mem_a = clCreateBuffer(…, N);
cl_mem mem_b = clCreateBuffer(…, N);
cl_mem mem_c = clCreateBuffer(…, N);
……
enqueueWriteBuffer(mem_a, true, 0, N, a);
enqueueWriteBuffer(mem_b, true, 0, N, b);
……
Add_dd.setArg(0, mem_a);
Add_dd.setArg(1, mem_b);
Add_dd.setArg(2, mem_c);
Add_dd.setArg(3, vector_size);
……
enqueueNDRangeKernel(Add_dd, 16384, …);
enqueueReadBuffer(d_C, true, 0, C_size, C);
ホストコード (C/C++ and PZCL-API)
#include “pzqd_real.h”
void pzc_Add_dd(dd_real* a, dd_real* b,
dd_real* c, int N)
{
int tid = get_tid();
int pid = get_pid();
int pos = pid * get_maxpid() + tid;
int maxid = get_maxpid * get_maxtid();
for ( ; pos < N ; pos += maxid)
{
a[pos] =
"3.14159265358979323846264338327950288";
b[pos] = "2.249775724709369995957";
c[pos] += a * b;
}
flush();
}
カーネルコード
(PZCL C)
• カーネルコード内でdd_real型をqdと同じように利用可能
• 1スレッドだけで実行すればCPUのコードがソノママ使える
27. PEZY Computing
BLAS機能のインタフェース
1. C++ Interface [Simple, easy to use]
MPACKと同様のインタフェース
− データ転送・計算・結果の受け取りを内部で行う
CPU向けのコードであればほとんど変更しなくてよい
2. PZCL Interface [High-performance]
計算のみを内部で行う (転送済のデータを使い回せる)
PZCLを用いたコードに修正する必要がある
27
double Rdot_dd ( const int N,
const dd_real *x, const int incx,
const dd_real *y, const int incy)
2018/03/08 SIAM PP18
int Rdot_dd_pzcl ( const int n, cl_mem d_r,
cl_mem d_x, const int incx,
cl_mem d_y, const int incy,
cl_command_queue *commandQueue
int events_size, cl_event *events, cl_event *event)
28. PEZY Computing
BLAS機能のインタフェース
1. C++ Interface [Simple, easy to use]
MPACKと同様のインタフェース
− データ転送・計算・結果の受け取りを内部で行う
CPU向けのコードであればほとんど変更しなくてよい
2. PZCL Interface [High-performance]
計算のみを内部で行う (転送済のデータを使い回せる)
PZCLを用いたコードに修正する必要がある
28
double Rdot_dd ( const int N,
const dd_real *x, const int incx,
const dd_real *y, const int incy)
2018/03/08 SIAM PP18
int Rdot_dd_pzcl ( const int n, cl_mem d_r,
cl_mem d_x, const int incx,
cl_mem d_y, const int incy,
cl_command_queue *commandQueue
int events_size, cl_event *events, cl_event *event)
一般的なCのコードと同じ
インタフェース
返り値の
Memory objects
PZCL event object
エラーコード
引数の
Memory objects
29. PEZY Computing
目次
1. はじめに
2. MIMD型メニーコアプロセッサPEZY-SC2
3. 倍々精度演算
4. pzqdライブラリ
1. pzqdライブラリの機能と実装
2. dd_Rgemmの実装
5. dd_Rgemmの性能
6. まとめ
7. 次世代機PEZY-SC3の紹介
途中での質問も大歓迎!
2018/09/04 JSIAM2018 29
31. PEZY Computing
ローカルメモリを使わない場合の性能 (正方、通信なし)
2018/09/04 JSIAM2018 31
0
200
400
600
800
1000
1200
1400
1600
1800
0 0.5 1 1.5 2 2.5 3 3.5 4
Performance(44N3/time)
Matrix Size (x103)
2x2blocking_nolocal
CPU (Xeon E5-2618L)
ローカルメモリを使わないとCPUと比べて
最大4.8倍の性能にしかならない
理論値は約39倍
(Xeon: 46GFLOPS, PEZY-SC2: 1745GFLOPS)
x2.4~4.8
Peak
32. PEZY Computing
• スタックをやりくりして全てのデータをローカルメモリに置きたい
⇒ スレッド数を減らす
• 1スレッドあたりが使えるスタックやローカルメモリを増やす
4スレッドで2x2のブロック化であれば、
ブロックや中間変数を全てローカルメモリに置けるようになる
PEあたりのスレッド数を減らせる機能をSDKに用意
2018/09/04 JSIAM2018 32
Stack for Thread 0
Stack for Thread 1
Stack for Thread 2
Stack for Thread 3
Stack for Thread 4
Stack for Thread 5
Stack for Thread 6
Stack for Thread 7
ユーザ利用可能領域
8 スレッド
Stack for Thread 0
Stack for Thread 1
Stack for Thread 2
Stack for Thread 3
ユーザ利用可能領域
4 スレッド
33. PEZY Computing
目次
1. はじめに
2. MIMD型メニーコアプロセッサPEZY-SC2
3. 倍々精度演算
4. pzqdライブラリ
1. pzqdライブラリの機能と実装
2. dd_Rgemmの実装
5. dd_Rgemmの性能
6. まとめ
7. 次世代機PEZY-SC3の紹介
途中での質問も大歓迎!
2018/09/04 JSIAM2018 33
34. PEZY Computing
実験環境 (Shoubu System B)
• PEZY-SC2 (700Mz, 1984core model)
Host CPU: Xeon-D-1571@1.3GHz, 16core
OS: CentOS 7.2
Compiler: gcc 4.8.5, LLVM 3.6.2, PZSDK-4.1
1984 core, 700MHz, 64bit SIMD
Peak (DP) : 0.7 GHz * 1984 (cores) * 2 (mad) ≒ 2777 [GFlops]
倍々精度演算のピーク性能: 1745 GFLOPS
• 比較対象:Intel Xeon CPU (AVX2は使用していない)
Xeon E5-2618L v3@2.3GHz, 8core, 32GB
OS: CentOS7.2
Compiler: gcc 4.8.5
Peak (DP) : 2.3GHZ * 8 (cores) * 2(FMA) * 2 ≒ 73.6 [GFlops]
倍々精度演算のピーク性能: 46 GFLOPS
2018/09/04 JSIAM2018 34
Shoubu SystemB
(installed at Riken)
18.4GFLOPS/W
(Green500 1st Place)
35. PEZY Computing
比較対象
• 2x2のブロック化 (M,N,K loop)
8 threads
− Size=1900程度までしか計算できない
4 threads
2 threads
no_local
− 8 threads, ローカルメモリを使わない
• それぞれ:
通信あり (C++ Interface)
通信なし (PZCL Interface)
• CPUコード (OpenMP, 8 threads)
• 正方行列 N=M=K=100~4000, 10試行の平均時間
2018/09/04 JSIAM2018 35
37. PEZY Computing
0
200
400
600
800
1000
1200
1400
1600
1800
0 0.5 1 1.5 2 2.5 3 3.5 4
性能[GFLOPSfordouble](44N3/time)
行列サイズ (x103)
8 threads 4 threads
no_local 2 threads
dd_Rgemmの性能 (正方、通信なし)
2018/09/04 JSIAM2018 37
Peak
74%
8%
x5.1~8.9
x1.7~2.1
ローカルメモリを使った高速化は有効
命令のレイテンシが消せないので
命令が詰まらず半分程度の性能しか出ない
(mad: 8cycle, Add: 4cycle)
38. PEZY Computing
0
200
400
600
800
1000
1200
1400
1600
1800
0 0.5 1 1.5 2 2.5 3 3.5 4
性能[GFLOPSfordouble](44N3/time)
行列サイズ (x103)
8 threads 4 threads
no_local 2 threads
4スレッドと8スレッドは性能がほとんど変わらない
4スレッドで十分に命令が詰まっているため。
DD演算のようなbyte/flopが低いケースであれば
スレッドを殺してローカルメモリを多く使う方が有効
dd_Rgemmの性能 (正方、通信なし)
2018/09/04 JSIAM2018 38
Peak
8%
40. PEZY Computing
デバイスとの通信あり/なしの比較
2018/09/04 JSIAM2018 40
0
200
400
600
800
1000
1200
1400
1600
1800
0 0.5 1 1.5 2 2.5 3 3.5 4
Performance(44N3/time)
行列サイズ (x103)
PEZY-SC2 (通信あり)
PEZY-SC2 (通信なし)
CPU (Xeon E5-2618L)
PEZY-SC2はサイズ1900から
8->4スレッドに切替
Peak
-56%
(N=200)
-14%
(N=2000)
通信の影響は少なく、
CPUと比べて全てのケースで高速
42. PEZY Computing
目次
1. はじめに
2. MIMD型メニーコアプロセッサPEZY-SC2
3. 倍々精度演算
4. pzqdライブラリ
1. pzqdライブラリの機能と実装
2. dd_Rgemmの実装
5. dd_Rgemmの性能
6. まとめ
7. 次世代機PEZY-SC3の紹介
途中での質問も大歓迎!
2018/09/04 JSIAM2018 42
43. PEZY Computing
まとめ (pzqdライブラリの開発)
• PEZY-SC2上で使えるようにqdライブラリを移植した
ホストコードではqdライブラリ,
カーネルコードではpzqdを使うことで、
PEZY-SC2上でもCPU同様にdd_real型を利用可能
• pzqdライブラリを用いたBLAS機能を実装
• BLAS機能には2つのインタフェースを実装:
MBLAS互換で、通信などを内部で行うC++ interface
PZCLを用いて転送などを自分で記述するPZCL interface
2018/09/04 JSIAM2018 43
44. PEZY Computing
まとめ (dd_Rgemmの性能評価)
• pzqdを用いたRgemmはピーク性能の76%
倍精度換算で最大1321 GFLOPS, DD換算で58 GFLOPS
デバイスとの通信を含めてもCPUの20倍程度の性能
− 通信の影響はサイズ2000で14%程度
14%の性能影響が我慢できるなら、
C++ Interfaceを使えば実装も簡単で早い (ピーク比65%)
• 性能を出すにはローカルメモリの利用が重要
8 Thread / 1Core, 4 Cycle / 1 Instructionが標準
今回は4スレッドで十分に命令パイプラインが埋まる
スレッドを減らしてスレッドあたりのローカルメモリを
増やしたブロック化が有効
2018/09/04 JSIAM2018 44
45. PEZY Computing
今後の課題
• 8スレッドでの動作範囲を広げるために:
使用するスタックサイズの削減
− コンパイラ心理学になるので難しい?
ローカルメモリに確保する中間変数の取捨選択
• より良いライブラリのために:
PEZYポータルWebサイトにおけるライブラリの公開
BLAS機能の拡張 (現状はdot, gemmのみ)
Quad-Double型などへの対応
2018/09/04 JSIAM2018 45
46. PEZY Computing
謝辞
• この研究は理化学研究所と Pezy社、ExaScaler社と
の共同研究で理化学研究所に設置されている、菖蒲
システムBを利用した。
また、文部科学省の高性能汎用計算機高度利用事業
費補助金を受けて実施されている。
• この研究は科研費基盤研究(B)課題番号18H03206
の助成を受けている
2018/09/04 JSIAM2018 46
47. PEZY Computing
We’re interested in your application problems
• We are seeking information exchange and
collaborative research with users!
• Please contact us!
2018/09/04 JSIAM2018 47
pz-user[at]pezy.co.jp