SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
PEZY Computing
PEZY-SC2上における
倍々精度Rgemmの実装と評価
菱沼 利彰1 (hishinuma [at] pezy.co.jp)
中田 真秀2 (maho [at] riken.jp)
1株式会社 PEZY Computing
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
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.
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
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
PEZY Computing
目的
• GOAL:PEZY-SC2向けのDD/QDのBLASを開発し、
高速・高精度に半正定値計画問題を解く
• PEZY-SC2用のqd相当ライブラリ: pzqdの開発
 演算子オーバーロードによる演算子の利用・算術演算
 MPACKから呼び出せるインタフェース
• 上記を用いてDDのRgemm, Rdotを実装し評価
 PEZY-SC2におけるDD演算の性能評価
 PEZY-SC2における高精度演算プログラムの”書きやすさ”
上記に加えて,PEZY-SC2のアーキテクチャ・プログラミングモデル
について前半で解説 (CM?)
Gyoukou移転先・共同研究の申し出を募集中!!
2018/09/04 JSIAM2018 6
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
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
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)
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
PEZY Computing
PEZY-SC2 Die Plot
2018/09/04 JSIAM2018 11
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
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
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)
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)
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)データ受信
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)
PEZY Computing
PEZY-SC2上での実行フロー
• ホストコードはgcc
• カーネルコードはLLVM
2018/09/04 JSIAM2018 18
gcc host.out
C/C++
+
PZSDK
(PZCL-API)
LLVM kernel.pzPZCL C
ホスト コード
(host.cpp)
カーネルコード
(kernel.pzc)
実行時に
呼び出し
カーネルコードでの
C++利用は非サポート
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
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.
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
PEZY Computing
dd_Rgemmのピーク性能
• 倍々精度積和演算は、
倍精度の加減算命令と倍精度の乗算命令に偏りがある
 倍精度加算:35 flops
 倍精度乗算:9 flops
• 積和同時演算を考慮した理論値が出ることはない
• 加減算と乗算のバランスを考慮すると:
倍々精度演算のピーク性能=
peak × (add + mult) / ( 2 ×Max(add, mult) )
• PEZY-SC2の場合:
4100 × (35 + 9) / (2 * 35) = 4100 * 0.628 = 2575 [GFLOPS]
2018/09/04 JSIAM2018 22
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
PEZY Computing
Pzqdライブラリ
• qdライブラリをPEZY-SC2カーネルコード向けに
移植したDD演算ライブラリ
 デバイスプログラムからqdの機能を使える
(qdのdd_real.hが移植されている)
 BLAS関数も内包 (現状はRdot, Rgemmのみ)
 Quad-Double精度は現状では未対応
• qdとの違い
 Quad-Doubleは未実装
 ファイル・標準出力等へのI/O関数は利用できない
 算術演算すべてのテスト・検証は出来ていない
• ライブラリの移植は多くの関数でqdをそのまま利用できた
2018/09/04 JSIAM2018 24
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;
}
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のコードがソノママ使える
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)
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
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
PEZY Computing
ローカルメモリの利用による高速化
• 中間変数をローカルメモリに確保して、
関数も全てinline展開したい
• dd_Rgemmは多くの中間変数が必要
 倍々精度演算の中間変数が多い (積和演算で14つ)
 さらにブロック化・ループのアンローリングにも必要
• ローカルメモリ不使用でも2x2ブロッキングが限界:
 2x2のブロック化で約2.0 KB (8スレッドで16KB)
 4x4のブロック化で約2.8 KB (8スレッドで22.4KB)
• 2x2に対し、スタック領域を削減して、
中間変数をローカルメモリに収めて高速化を図る
2018/09/04 JSIAM2018 30
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
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 スレッド
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
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)
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
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
8スレッドではサイズ1900までしか
計算できない
dd_Rgemmの性能 (正方、通信なし)
2018/09/04 JSIAM2018 36
Peak
74%
8%
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)
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%
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
CPU (Xeon E5-2618L)
8スレッドと4スレッドをサイズに応じて切替、CPUとの性能比較
2018/09/04 JSIAM2018 39
Peak
x31
(N=200)
x23~29
(N>1000)
全てのサイズでCPUより高速
(100~4000)
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と比べて全てのケースで高速
PEZY Computing
0%
10%
20%
30%
40%
50%
60%
70%
80%
90%
100%
0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0
Matrix Size (x103)
通信
計算
通信と計算が占める割合の変化
2018/09/04 JSIAM2018 41
通信はサイズ1400で20%以下に。
比較的小さいサイズでも有効
(このとき実行時間は0.13秒)
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
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
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
PEZY Computing
今後の課題
• 8スレッドでの動作範囲を広げるために:
 使用するスタックサイズの削減
− コンパイラ心理学になるので難しい?
 ローカルメモリに確保する中間変数の取捨選択
• より良いライブラリのために:
 PEZYポータルWebサイトにおけるライブラリの公開
 BLAS機能の拡張 (現状はdot, gemmのみ)
 Quad-Double型などへの対応
2018/09/04 JSIAM2018 45
PEZY Computing
謝辞
• この研究は理化学研究所と Pezy社、ExaScaler社と
の共同研究で理化学研究所に設置されている、菖蒲
システムBを利用した。
また、文部科学省の高性能汎用計算機高度利用事業
費補助金を受けて実施されている。
• この研究は科研費基盤研究(B)課題番号18H03206
の助成を受けている
2018/09/04 JSIAM2018 46
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

Mais conteúdo relacionado

Mais procurados

x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
Minoru Nakamura
 
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
智啓 出川
 
最新技術動向 GlusterFS (仮想化DAY, Internet Week 2011)
最新技術動向 GlusterFS (仮想化DAY, Internet Week 2011)最新技術動向 GlusterFS (仮想化DAY, Internet Week 2011)
最新技術動向 GlusterFS (仮想化DAY, Internet Week 2011)
Keisuke Takahashi
 

Mais procurados (20)

20170329_BigData基盤研究会#7
20170329_BigData基盤研究会#720170329_BigData基盤研究会#7
20170329_BigData基盤研究会#7
 
20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache
 
Reconf 201506
Reconf 201506Reconf 201506
Reconf 201506
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
 
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
20170726 py data.tokyo
20170726 py data.tokyo20170726 py data.tokyo
20170726 py data.tokyo
 
Fpgax 20130604
Fpgax 20130604Fpgax 20130604
Fpgax 20130604
 
pgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpupgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpu
 
20170310_InDatabaseAnalytics_#1
20170310_InDatabaseAnalytics_#120170310_InDatabaseAnalytics_#1
20170310_InDatabaseAnalytics_#1
 
An Intelligent Storage?
An Intelligent Storage?An Intelligent Storage?
An Intelligent Storage?
 
最新技術動向 GlusterFS (仮想化DAY, Internet Week 2011)
最新技術動向 GlusterFS (仮想化DAY, Internet Week 2011)最新技術動向 GlusterFS (仮想化DAY, Internet Week 2011)
最新技術動向 GlusterFS (仮想化DAY, Internet Week 2011)
 
NVIDIA TESLA V100・CUDA 9 のご紹介
NVIDIA TESLA V100・CUDA 9 のご紹介NVIDIA TESLA V100・CUDA 9 のご紹介
NVIDIA TESLA V100・CUDA 9 のご紹介
 
Hello, DirectCompute
Hello, DirectComputeHello, DirectCompute
Hello, DirectCompute
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
OpenCLに触れてみよう
OpenCLに触れてみようOpenCLに触れてみよう
OpenCLに触れてみよう
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
 

Semelhante a PEZY-SC2上における倍々精度Rgemmの実装と評価

x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
Minoru Nakamura
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
Yosuke Onoue
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
Takeshi Arabiki
 

Semelhante a PEZY-SC2上における倍々精度Rgemmの実装と評価 (20)

x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
GTC Japan 2017
GTC Japan 2017GTC Japan 2017
GTC Japan 2017
 
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
 
Wardenで学ぶコンテナの基礎
Wardenで学ぶコンテナの基礎Wardenで学ぶコンテナの基礎
Wardenで学ぶコンテナの基礎
 
IEICE technical report (RECONF), January 2015.
IEICE technical report (RECONF), January 2015.IEICE technical report (RECONF), January 2015.
IEICE technical report (RECONF), January 2015.
 
20170421 tensor flowusergroup
20170421 tensor flowusergroup20170421 tensor flowusergroup
20170421 tensor flowusergroup
 
Cuda
CudaCuda
Cuda
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
retrobsd-2012-JUL-07 at JNUG BSD BoF
retrobsd-2012-JUL-07 at JNUG BSD BoFretrobsd-2012-JUL-07 at JNUG BSD BoF
retrobsd-2012-JUL-07 at JNUG BSD BoF
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
 
Kernel vm-2014-05-25
Kernel vm-2014-05-25Kernel vm-2014-05-25
Kernel vm-2014-05-25
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門
 
Open VZ
Open VZOpen VZ
Open VZ
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP
 
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
 
Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6
 
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
 
【A-1】AIを支えるGPUコンピューティングの今
【A-1】AIを支えるGPUコンピューティングの今【A-1】AIを支えるGPUコンピューティングの今
【A-1】AIを支えるGPUコンピューティングの今
 

PEZY-SC2上における倍々精度Rgemmの実装と評価

  • 1. PEZY Computing PEZY-SC2上における 倍々精度Rgemmの実装と評価 菱沼 利彰1 (hishinuma [at] pezy.co.jp) 中田 真秀2 (maho [at] riken.jp) 1株式会社 PEZY Computing 2理化学研究所
  • 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
  • 6. PEZY Computing 目的 • GOAL:PEZY-SC2向けのDD/QDのBLASを開発し、 高速・高精度に半正定値計画問題を解く • PEZY-SC2用のqd相当ライブラリ: pzqdの開発  演算子オーバーロードによる演算子の利用・算術演算  MPACKから呼び出せるインタフェース • 上記を用いてDDのRgemm, Rdotを実装し評価  PEZY-SC2におけるDD演算の性能評価  PEZY-SC2における高精度演算プログラムの”書きやすさ” 上記に加えて,PEZY-SC2のアーキテクチャ・プログラミングモデル について前半で解説 (CM?) Gyoukou移転先・共同研究の申し出を募集中!! 2018/09/04 JSIAM2018 6
  • 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
  • 11. PEZY Computing PEZY-SC2 Die Plot 2018/09/04 JSIAM2018 11
  • 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)
  • 18. PEZY Computing PEZY-SC2上での実行フロー • ホストコードはgcc • カーネルコードはLLVM 2018/09/04 JSIAM2018 18 gcc host.out C/C++ + PZSDK (PZCL-API) LLVM kernel.pzPZCL C ホスト コード (host.cpp) カーネルコード (kernel.pzc) 実行時に 呼び出し カーネルコードでの 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
  • 22. PEZY Computing dd_Rgemmのピーク性能 • 倍々精度積和演算は、 倍精度の加減算命令と倍精度の乗算命令に偏りがある  倍精度加算:35 flops  倍精度乗算:9 flops • 積和同時演算を考慮した理論値が出ることはない • 加減算と乗算のバランスを考慮すると: 倍々精度演算のピーク性能= peak × (add + mult) / ( 2 ×Max(add, mult) ) • PEZY-SC2の場合: 4100 × (35 + 9) / (2 * 35) = 4100 * 0.628 = 2575 [GFLOPS] 2018/09/04 JSIAM2018 22
  • 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
  • 24. PEZY Computing Pzqdライブラリ • qdライブラリをPEZY-SC2カーネルコード向けに 移植したDD演算ライブラリ  デバイスプログラムからqdの機能を使える (qdのdd_real.hが移植されている)  BLAS関数も内包 (現状はRdot, Rgemmのみ)  Quad-Double精度は現状では未対応 • qdとの違い  Quad-Doubleは未実装  ファイル・標準出力等へのI/O関数は利用できない  算術演算すべてのテスト・検証は出来ていない • ライブラリの移植は多くの関数でqdをそのまま利用できた 2018/09/04 JSIAM2018 24
  • 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
  • 30. PEZY Computing ローカルメモリの利用による高速化 • 中間変数をローカルメモリに確保して、 関数も全てinline展開したい • dd_Rgemmは多くの中間変数が必要  倍々精度演算の中間変数が多い (積和演算で14つ)  さらにブロック化・ループのアンローリングにも必要 • ローカルメモリ不使用でも2x2ブロッキングが限界:  2x2のブロック化で約2.0 KB (8スレッドで16KB)  4x4のブロック化で約2.8 KB (8スレッドで22.4KB) • 2x2に対し、スタック領域を削減して、 中間変数をローカルメモリに収めて高速化を図る 2018/09/04 JSIAM2018 30
  • 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
  • 36. 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 8スレッドではサイズ1900までしか 計算できない dd_Rgemmの性能 (正方、通信なし) 2018/09/04 JSIAM2018 36 Peak 74% 8%
  • 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%
  • 39. 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 CPU (Xeon E5-2618L) 8スレッドと4スレッドをサイズに応じて切替、CPUとの性能比較 2018/09/04 JSIAM2018 39 Peak x31 (N=200) x23~29 (N>1000) 全てのサイズでCPUより高速 (100~4000)
  • 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と比べて全てのケースで高速
  • 41. PEZY Computing 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100% 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 Matrix Size (x103) 通信 計算 通信と計算が占める割合の変化 2018/09/04 JSIAM2018 41 通信はサイズ1400で20%以下に。 比較的小さいサイズでも有効 (このとき実行時間は0.13秒)
  • 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