[関東GPGPU勉強会#2] ライブラリを使って大規模疎行列線形方程式を解いてみよう3. - 3 -
aokomoriuta (2013-06-01): 関東GPGPU勉強会
感謝を述べましょう
Thank you!!!!!!!!!!!!!!
山田さん
&
YamadaSysems
<まずはじめに>
5. - 5 -
aokomoriuta (2013-06-01): 関東GPGPU勉強会
名前とアバター
青子守歌 / aokomoriuta
※call me “あお”
<自己紹介>
6. - 6 -
aokomoriuta (2013-06-01): 関東GPGPU勉強会
いろんなとこのアカウント
twitter: @aokomorita
github: aokomoriuta
web: j.mp/ao_komoriuta
<自己紹介>
7. - 7 -
aokomoriuta (2013-06-01): 関東GPGPU勉強会
専門分野
分類:
土木工学
>水理学
>計算力学
粒子法(MPS法)を用いた計算力学
@土木工学(主に水工学分野)
<自己紹介>
8. - 8 -
aokomoriuta (2013-06-01): 関東GPGPU勉強会
計算力学とは
実験空間 計算空間
File:Coastal defences, Beesands - geograph.org.uk - 69707.jpg
by Nigel Chadwick : CC-BY-SA 2.0 Generic
File:Gileston20.jpg
by Mick Lobbi : CC-BY-SA 2.0 Generic
File:Dolos.jpg
by Adam Brinki : CC-BY-SA 3.0 Unported
現実空間
海岸工学・水工学分野において
代替となりうるか?
<自己紹介>
9. - 9 -
aokomoriuta (2013-06-01): 関東GPGPU勉強会
こんなこと言ってますので
プログラマじゃないです!!
計算力学屋です!
<自己紹介>
(超重要)
13. - 13 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
共役勾配法
連立一次方程式の解法
<解法の紹介>
ベクトル・行列演算を
収束するまで繰り返す
Ax=bを解く
x・Ax/2 - x・bを最小化
※Aが対称正定値のみ
14. - 14 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
共役勾配法アルゴリズム
ap=Ax
r2=r・r
ap=Ap
α=r2 / p・ap
x'=x + αp
p=r
r=b - ap
r'=r - αap
r2'=r'・r'
β=r2'/r2
p=r' + βp
収束するまで繰り返し
<解法の紹介>
15. - 15 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
共役勾配法の内訳
ap=Ax
r2=r・r
ap=Ap
α=r2 / p・ap
x'=x + αp
p=r
r=b - ap
r'=r - αap
r2'=r'・r'
β=r2'/r2
収束するまで繰り返し
p=r' + βp
行列とベクトルの積
ベクトル同士の加減
ベクトルの複製
ベクトルの内積
行列とベクトルの積
ベクトルの内積
ベクトルの内積
ベクトル同士の加減
ベクトル同士の加減
ベクトル同士の加減
浮動小数点演算
<解法の紹介>
16. - 16 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
共役勾配法は
<解法の紹介>
GPGPU向き?
行列・ベクトル演算
だけで解ける!!
18. - 18 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
GPGPU行列演算ライブラリ
<ライブラリ>
・CUBLAS/cuSPARSE
・MAGMA
・APPML
・ViennaCL
CUDA
OpenCL
両方
19. - 19 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
一番速いのは
<ライブラリ>
おそらく
CUBLAS/cuSPARSE
(※もちろん環境による)
20. - 20 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
一番手軽なのは
<ライブラリ>
(※もちろん環境による)
おそらく
ViennaCL
21. - 21 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
今日は
<ライブラリ>
(せっかくTitanが使えるので)
CUBLAS/cuSPARSE
23. - 23 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
CUBLAS
<CUBLAS/cuSPARSE>
(CUDA SDKに標準付属)
BLASがCUDAで使える
ライブラリ
by NVIDIA
24. - 24 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
cuSPARSE
<CUBLAS/cuSPARSE>
(CUDA SDKに標準付属)
CUBLAS=密行列
cuSPARSE=疎行列
25. - 25 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
再掲:共役勾配法
ap=Ax
r2=r・r
ap=Ap
α=r2 / p・ap
x'=x + αp
p=r
r=b - ap
r'=r - αap
r2'=r'・r'
β=r2'/r2
収束するまで繰り返し
p=r' + βp
行列とベクトルの積
ベクトル同士の加減
ベクトルの複製
ベクトルの内積
行列とベクトルの積
ベクトルの内積
ベクトルの内積
ベクトル同士の加減
ベクトル同士の加減
ベクトル同士の加減
浮動小数点演算
<CUBLAS/cuSPARSE>
26. - 26 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
必要な演算
・行列=ベクトル積
・ベクトル加減
・ベクトル内積
・ベクトルの複製
・浮動小数点演算
<CUBLAS/cuSPARSE>
27. - 27 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
ベクトル複製
<CUBLAS/cuSPARSE>
cublasDcopy_v2(cublas,
count,
x, offsetX
y, offsetY);
count: ベクトルのサイズ
offsetX, offsetY: 演算を開始するベクトルの先頭(通常は1)
cublas: 後述@p.27
COPY
y = x
28. - 28 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
ベクトル加減
<CUBLAS/cuSPARSE>
cublasDaxpy_v2(cublas,
count,
&alpha,
x, offsetX
y, offsetY);
count: ベクトルのサイズ
offsetX, offsetY: 演算を開始するベクトルの先頭(通常は1)
cublas: 後述@p.27
AXPY
y = αx + y
29. - 29 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
ベクトル内積
<CUBLAS/cuSPARSE>
cublasDdot_v2(cublas,
count,
x, offsetX,
y, offsetY,
&z);
count: ベクトルのサイズ
offsetX, offsetY: 演算を開始するベクトルの先頭(通常は1)
cublas: 後述@p.27
DOT
z = x・y
30. - 30 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
行列=ベクトル積
<CUBLAS/cuSPARSE>
cusparseDcsrmv_v2(cusparse,
CUSPARSE_OPERATION_NON_TRANSPOSE,
count, count, elementsCount,
&alpha,
matDescr,elements, rowOffsets, columnIndeces,
x,
&beta, y);
y = αAx + βy
count: 行列のサイズ
elementsCount: 行列の非ゼロ要素数
elements, rowOffset, columnIndeces: 係数行列AのCSR形式
cusparse, matDescr: 後述@p.27
CSRMV
31. - 31 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
準備するもの
<CUBLAS/cuSPARSE>
cublasHandle/cusparseHandle
// CUBLASハンドルを作成
::cublasHandle_t cublas;
::cublasCreate(&cublas);
// cuSPARSEハンドルを作成
::cusparseHandle_t cusparse;
::cusparseCreate(&cusparse);
cusparseMatDescr
// 行列形式を作成
// * 一般的な形式
// * 番号は0から開始
::cusparseMatDescr_t matDescr;
::cusparseCreateMatDescr(&matDescr);
::cusparseSetMatType(matDescr, CUSPARSE_MATRIX_TYPE_GENERAL);
::cusparseSetMatIndexBase(matDescr, CUSPARSE_INDEX_BASE_ZERO);
32. - 32 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
詳しくは
<CUBLAS/cuSPARSE>
リファレンス見てね!
・http://docs.nvidia.com/cuda/cublas/index.html
・http://docs.nvidia.com/cuda/cusparse/index.html
34. - 34 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
URLはこちら
<コード解説・デモ>
https://github.com/aokomoriuta/ConjugateGradient/
tree/master/SimpleConjugateGradient
Titanで動かしてみます!
35. - 35 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
CPUは?
<コード解説・デモ>
boost::numeric::ublas
割と最適化されてて
速いらしい
36. - 36 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
比較しなきゃ!!
<コード解説・デモ>
01:30 就寝
08:00 起床
11:11 GPU側コード書き終わり
12:47 資料作成終わり
13:57 会場入り(遅刻)
14:00 エクストリームコーディング開始
37. - 37 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
エクストリームコーディング1
<コード解説・デモ>
serializationなんて用意してない
@手元のノートPC
38. - 38 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
エクストリームコーディング2
<コード解説・デモ>
型チェック(?)で怒られる
@YamadaSystem
39. - 39 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
頑張ったよ!
<コード解説・デモ>
CPUとの比較ができませんでしたぁぁ!!
私が無能なばかりに(略)
40. - 40 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
はい
<コード解説・デモ>
<お断り>
前のページは、主宰者はじめ周囲からの圧
力があったので入れたかっただけです。
41. - 41 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
結論
<コード解説・デモ>
GPGPUライブラリを使うと
簡単に線形方程式が
解けますね!
48. - 48 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
計算シミュレーション勉強会
<余談>
計算機を使って
シミュレーション
してる人たちの
勉強会?
49. - 49 -
aokomoriuta (2012-09-11): 関東GPGPU勉強会
シミュレーション
<余談>
「シミュレーション」
と言えればなんでも!
(自称/他称問わず)