青子守歌(aokomoriuta)
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 Core | 96 |
cuSPARSE(ELL形式)+cuBLAS | Tesla K20c (Kepler) | 134 |
cuSPARSE(ELL形式)+cuBLAS | GeForce GTX TITAN X (Maxwell) | 71 |
cuSPARSE(ELL形式)+cuBLAS | GeForce GTX 1080 (Pascal) | 80 |
cuSPARSE(ELL形式)+cuBLAS | TITAN X (Pascal) | 55 |
ご清聴ありがとうございました
青子守歌(あお こもりうた)
線形方程式系の話をします!
∵ MPS法で圧力ポアソン方程式を求めるのに必要
資料作る時間がなかったので省略。
詳しくは第2回の資料p.13-15あたり参照
疎行列・ベクトル積(SpMV)が一番重い!!
ついで、内積→ベクトル加減算の順
世の中はだいたいSpMVで出来ている
※個人の感想です
誰が一番SpMV速いのか!!
を決めるベンチマークっぽいもの書きました
問題設定をより非正規化して、MPS法への適用性を見たかった
※疎行列の格納形式はELL(で十分なので)
コード貼り付けても仕方ないので↓見てね
コード貼り付けても仕方ないので↓見てね
実行方法 | 演算器 | メモリ | 実行時間[ms] |
---|---|---|---|
逐次実行 | Intel Core i7 920 (Nehalem) | DDR3-1333 | 2503.610 |
OpenMP(8スレッド) | Intel Core i7 920 (Nehalem) | DDR3-1333 | 2013.830 |
逐次実行 | Intel Core i7 4790 (Haswell) | DDR3-800 | 1907.520 |
OpenMP(8スレッド) | Intel Core i7 4790 (Haswell) | DDR3-800 | 1381.230 |
逐次実行 | Intel Xeon E5-2623 v3 (Haswell) | DDR4-2133 | 1665.050 |
OpenMP(16スレッド) | Intel Xeon E5-2623 v3 (Haswell) | DDR4-2133 | 3812.690 |
詳細はレポジトリのウィキページ参照
SpMVを素直にCUDA化(1スレッド1行)
→実装
実行方法 | 演算器 | 実行時間[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ブロックが実行する
(各スレッドがメモリ連続アクセスになる)
→実装
KeplerからはWarp Shuffleが使えるので使いましょう
→実装
実行方法 | 演算器 | 実行時間[ms] |
---|---|---|
逐次実行 | Intel Core i7 4790 (Haswell) | 1908 |
OpenMP(8スレッド) | Intel Core i7 4790 (Haswell) | 1381 |
素直→お手製CUDA | GeForce GT 705 (Fermi) | 18635→3745 |
素直→お手製CUDA | Tesla K20c (Kepler) | 1009→783 |
素直→お手製CUDA | GeForce GTX TITAN X (Maxwell) | 248→195 |
素直→お手製CUDA | GeForce GTX 1080 (Pascal) | 206→183 |
お手製CUDA | TITAN X (Pascal) | 141 |
詳細はレポジトリのウィキページ参照
CUDAには既に最強ライブラリがある
ライブラリの使い方は2012年のGPGPU Advent Calenderの記事を参照
実行方法 | 演算器 | 実行時間[ms] |
---|---|---|
逐次実行 | Intel Core i7 4790 (Haswell) | 1908 |
OpenMP(8スレッド) | Intel Core i7 4790 (Haswell) | 1381 |
素直→改良お手製→cuSPARSE→cuBLAS | Tesla K20c (Kepler) | 1009→783→222→177 |
素直→改良お手製→cuSPARSE→cuBLAS | GeForce GTX TITAN X (Maxwell) | 248→195→110→91 |
素直→改良お手製→cuSPARSE→cuBLAS | GeForce GTX 1080 (Pascal) | 206→183→111→97 |
改良お手製→cuSPARSE→cuBLAS | TITAN X (Pascal) | 141→84→70 |
詳細はレポジトリのウィキページ参照
標準(?)はCSRだが、ELLの方が単純だから速いはず
(※もちろん問題による)
実行方法 | 演算器 | 実行時間[ms] |
---|---|---|
逐次実行 | Intel Core i7 4790 (Haswell) | 1908 |
OpenMP(8スレッド) | Intel Core i7 4790 (Haswell) | 1381 |
素直→改良お手製→cuSPARSE→cuBLAS→ELL | Tesla K20c (Kepler) | 1009→783→222→177→134 |
素直→改良お手製→cuSPARSE→cuBLAS→ELL | GeForce GTX TITAN X (Maxwell) | 248→195→110→91→71 |
素直→改良お手製→cuSPARSE→cuBLAS→ELL | GeForce GTX 1080 (Pascal) | 206→183→111→97→80 |
改良お手製→cuSPARSE→cuBLAS→ELL | TITAN X (Pascal) | 141→84→70→55 |
詳細はレポジトリのウィキページ参照
実行方法 | 演算器 | 実行時間[ms] |
---|---|---|
逐次実行 | Intel Core i7 4790 (Haswell) | 1908 |
OpenMP(8スレッド) | Intel Core i7 4790 (Haswell) | 1381 |
素直→改良お手製→cuSPARSE→cuBLAS→ELL | Tesla K20c (Kepler) | 1009→783→222→177→134 |
素直→改良お手製→cuSPARSE→cuBLAS→ELL | GeForce GTX TITAN X (Maxwell) | 248→195→110→91→71 |
素直→改良お手製→cuSPARSE→cuBLAS→ELL | GeForce 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] |
---|---|---|
1 | TITAN X (Pascal)のライブラリ版 | 55 |
2 | GTX TITAN X (Maxwell)のライブラリ版 | 71 |
3 | GTX 1080 (Pascal)のライブラリ版 | 80 |
3.5 | KNLのお手製OpenMP版 | 96 |
4 | K20c (Kepler)のライブラリ版 | 134 |
5 | TITAN X (Pascal)のお手製版 | 141 |
6 | GTX 1080 (Pascal)のお手製版 | 183 |
7 | GTX TITAN X (Maxwell)のお手製版 | 195 |
8 | K20c (Kepler)のお手製版 | 222 |
第5回で発表予定!!(?)
return 0;