関東GPGPU勉強会#4 -Kepler, Maxwell, Pascalで線形方程式系を解く-

青子守歌(aokomoriuta)

はじめに

GPGPU.KANTO

and Thanks to
@telmin_orca and SAKURA Internet

結果

結果発表!!

実行方法演算器実行時間[ms]
逐次実行Intel Core i7 4790 (Haswell)1908
OpenMP(8スレッド)Intel Core i7 4790 (Haswell)1381
OpenMP(256スレッド)Intel Xeon Phi KNL 64 Core96
cuSPARSE(ELL形式)+cuBLASTesla K20c (Kepler)134
cuSPARSE(ELL形式)+cuBLASGeForce GTX TITAN X (Maxwell)71
cuSPARSE(ELL形式)+cuBLASGeForce GTX 1080 (Pascal)80
cuSPARSE(ELL形式)+cuBLASTITAN X (Pascal)55

結論

  • Maxwell(TITAN X)つよい
  • K20c(Kepler)爺も頑張ってる
  • 適当に書いたKNL強すぎる
  • P100に乞うご期待!!

ご清聴ありがとうございました

目次

  1. 自己紹介
  2. 共役勾配法
  3. 性能評価
  4. まとめ&やり残したこと

自己紹介

目次

  1. 自己紹介
  2. 共役勾配法
  3. 性能評価
  4. まとめ&やり残したこと

だれ?

青子守歌(あお こもりうた)

なんのひと?

Twitter
@aokomoriuta
Blog
aokomoriuta's blog
専門分野(?)
土木工学・水理学・計算力学・プログラム高速化・(C#er/C++er)
GPGPU勉強会

今日もまた

線形方程式系の話をします!

∵ MPS法で圧力ポアソン方程式を求めるのに必要

共役勾配法

目次

  1. 自己紹介
  2. 共役勾配法
  3. 性能評価
  4. まとめ&やり残したこと

線形一次方程式解法としての共役勾配法

資料作る時間がなかったので省略。

詳しくは第2回の資料p.13-15あたり参照

共役勾配法で重要なこと

疎行列・ベクトル積(SpMV)が一番重い!!

ついで、内積→ベクトル加減算の順

至言

世の中はだいたいSpMVで出来ている

SpMVじゃないもの

  • Top500(LINPACK, GEMM)
  • 画像処理フィルター
  • ディ(検閲済み)ング

※個人の感想です

ということで

誰が一番SpMV速いのか!!

を決めるベンチマークっぽいもの書きました

aokomoriuta/ConjugateGradient

なぜHPCGとかじゃないのか

問題設定をより非正規化して、MPS法への適用性を見たかった

性能評価

目次

  1. 自己紹介
  2. 共役勾配法
  3. 性能評価
  4. まとめ&やり残したこと

改めて、必要な処理3つ

  • SpMV(疎行列・ベクトル積)
  • DotProduct(ベクトルの内積)
  • VectorAdd(ベクトルの加減算)

※疎行列の格納形式はELL(で十分なので)

CPUで素直に逐次実行版

コード貼り付けても仕方ないので↓見てね

CPUでOpenMPつけただけ

コード貼り付けても仕方ないので↓見てね

CPUの結果

実行方法演算器メモリ実行時間[ms]
逐次実行Intel Core i7 920 (Nehalem)DDR3-13332503.610
OpenMP(8スレッド)Intel Core i7 920 (Nehalem)DDR3-13332013.830
逐次実行Intel Core i7 4790 (Haswell)DDR3-8001907.520
OpenMP(8スレッド)Intel Core i7 4790 (Haswell)DDR3-8001381.230
逐次実行Intel Xeon E5-2623 v3 (Haswell)DDR4-21331665.050
OpenMP(16スレッド)Intel Xeon E5-2623 v3 (Haswell)DDR4-21333812.690

詳細はレポジトリのウィキページ参照

CUDAに乗せよう!

SpMVを素直にCUDA化(1スレッド1行)

実装

素直なCUDA実装版の結果

実行方法演算器実行時間[ms]
逐次実行Intel Core i7 4790 (Haswell)1908
OpenMP(8スレッド)Intel Core i7 4790 (Haswell)1381
CUDA(素直)GeForce GT 705 (Fermi)18635
CUDA(素直)Tesla K20c (Kepler)1009
CUDA(素直)GeForce GTX TITAN X (Maxwell)248
CUDA(素直)GeForce GTX 1080 (Pascal)206

詳細はレポジトリのウィキページ参照

キャッシュ効率の改善

共有メモリを使って1行を1ブロックが実行する

(各スレッドがメモリ連続アクセスになる)

実装

Warp Shuffle

KeplerからはWarp Shuffleが使えるので使いましょう

実装

CUDA改良版の結果

実行方法演算器実行時間[ms]
逐次実行Intel Core i7 4790 (Haswell)1908
OpenMP(8スレッド)Intel Core i7 4790 (Haswell)1381
素直→お手製CUDAGeForce GT 705 (Fermi)18635→3745
素直→お手製CUDATesla K20c (Kepler)1009→783
素直→お手製CUDAGeForce GTX TITAN X (Maxwell)248→195
素直→お手製CUDAGeForce GTX 1080 (Pascal)206→183
お手製CUDATITAN X (Pascal)141

詳細はレポジトリのウィキページ参照

さらなる改良

ライブラリを使おう!!

CUDAには既に最強ライブラリがある

cuSPARSE
疎行列演算ライブラリ→実装
cuBLAS
密行列演算ライブラリ→実装

ライブラリの使い方は2012年のGPGPU Advent Calenderの記事を参照

ライブラリを使った結果

実行方法演算器実行時間[ms]
逐次実行Intel Core i7 4790 (Haswell)1908
OpenMP(8スレッド)Intel Core i7 4790 (Haswell)1381
素直→改良お手製→cuSPARSE→cuBLASTesla K20c (Kepler)1009→783→222→177
素直→改良お手製→cuSPARSE→cuBLASGeForce GTX TITAN X (Maxwell)248→195→110→91
素直→改良お手製→cuSPARSE→cuBLASGeForce GTX 1080 (Pascal)206→183→111→97
改良お手製→cuSPARSE→cuBLASTITAN X (Pascal)141→84→70

詳細はレポジトリのウィキページ参照

cuSPARSEをELLで使おう!!

標準(?)はCSRだが、ELLの方が単純だから速いはず

(※もちろん問題による)

→実装

ライブラリをELLで使った結果

実行方法演算器実行時間[ms]
逐次実行Intel Core i7 4790 (Haswell)1908
OpenMP(8スレッド)Intel Core i7 4790 (Haswell)1381
素直→改良お手製→cuSPARSE→cuBLAS→ELLTesla K20c (Kepler)1009→783→222→177→134
素直→改良お手製→cuSPARSE→cuBLAS→ELLGeForce GTX TITAN X (Maxwell)248→195→110→91→71
素直→改良お手製→cuSPARSE→cuBLAS→ELLGeForce GTX 1080 (Pascal)206→183→111→97→80
改良お手製→cuSPARSE→cuBLAS→ELLTITAN X (Pascal)141→84→70→55

詳細はレポジトリのウィキページ参照

KNLの結果

実行方法演算器実行時間[ms]
逐次実行Intel Core i7 4790 (Haswell)1908
OpenMP(8スレッド)Intel Core i7 4790 (Haswell)1381
素直→改良お手製→cuSPARSE→cuBLAS→ELLTesla K20c (Kepler)1009→783→222→177→134
素直→改良お手製→cuSPARSE→cuBLAS→ELLGeForce GTX TITAN X (Maxwell)248→195→110→91→71
素直→改良お手製→cuSPARSE→cuBLAS→ELLGeForce GTX 1080 (Pascal)206→183→111→97→80
OpenMP(256スレッド)Intel Xeon Phi KNL 64 Core (DDR4)381
OpenMP(256スレッド)Intel Xeon Phi KNL 64 Core (MCDRAM)96

詳細はレポジトリのウィキページ参照

性能速い順

順位演算器実行時間[ms]
1TITAN X (Pascal)のライブラリ版55
2GTX TITAN X (Maxwell)のライブラリ版71
3GTX 1080 (Pascal)のライブラリ版80
3.5KNLのお手製OpenMP版96
4K20c (Kepler)のライブラリ版134
5TITAN X (Pascal)のお手製版141
6GTX 1080 (Pascal)のお手製版183
7GTX TITAN X (Maxwell)のお手製版195
8K20c (Kepler)のお手製版222

まとめ&やり残したこと

目次

  1. 自己紹介
  2. 共役勾配法
  3. 性能評価
  4. まとめ&やり残したこと

まとめ

  • 手で書いたらPascalが速かった
  • でもライブラリだとMaxwellの方が速かった
  • →まぁ、GTXとTITANを比較するのは可哀想ではある
  • Tesla P100に期待!!
  • 適当に書いてライブラリ版に迫る性能が出るKNLすごい
  • cuSPARSEとかcuBLAS、使い方めんどい。っていうかCUDAめんどい(エラー時は例外投げてほしい)

やり残したこと

  • 手で書いてもっと速くできるはず
  • ちゃんと細かいプロファイル取る(理論性能比とか)
  • cuBLAS/cuSPARSE以外のライブラリを使う(ViennaCLとか)
  • Pascal TITANとかP100を試す
  • AMD Radeon Fury XやIntel KNLと対戦

第5回で発表予定!!(?)

return 0;