Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,513 views

Published on

PEZY-SC2上にqdライブラリを移植したpzqdライブラリを実装し、Double-DoubleのRgemmを行った。
性能はPeakの74%で、qdライブラリのdd_real型をPEZY-SC2上でソノママ利用できる。

Published in: Software
  • @KatsuhisaYuasa おっと,間違ってますね..申し訳ありません.おっしゃる通り「通信なしが濃い赤」,「通信ありが薄い赤」です.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • 40ページ目の凡例、通信なしの方が性能が上なので濃い赤線で、通信ありだと性能が下がるので薄い赤線、でしょうか?
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

  1. 1. PEZY Computing PEZY-SC2上における 倍々精度Rgemmの実装と評価 菱沼 利彰1 (hishinuma [at] pezy.co.jp) 中田 真秀2 (maho [at] riken.jp) 1株式会社 PEZY Computing 2理化学研究所
  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. 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. 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. 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. 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. 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. 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. 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. 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. 11. PEZY Computing PEZY-SC2 Die Plot 2018/09/04 JSIAM2018 11
  12. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 45. PEZY Computing 今後の課題 • 8スレッドでの動作範囲を広げるために:  使用するスタックサイズの削減 − コンパイラ心理学になるので難しい?  ローカルメモリに確保する中間変数の取捨選択 • より良いライブラリのために:  PEZYポータルWebサイトにおけるライブラリの公開  BLAS機能の拡張 (現状はdot, gemmのみ)  Quad-Double型などへの対応 2018/09/04 JSIAM2018 45
  46. 46. PEZY Computing 謝辞 • この研究は理化学研究所と Pezy社、ExaScaler社と の共同研究で理化学研究所に設置されている、菖蒲 システムBを利用した。 また、文部科学省の高性能汎用計算機高度利用事業 費補助金を受けて実施されている。 • この研究は科研費基盤研究(B)課題番号18H03206 の助成を受けている 2018/09/04 JSIAM2018 46
  47. 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

×