疎行列ベクトル積における格納形式の自動最適化

疎行列ベクトル積における格納形式
の自動最適化
1
コンピュータサイエンス専攻1年
200920710 久保田 悠司
指導教員 高橋 大介
研究の背景
 GPU
(Graphics Processing Unit)は個人のPC
に搭載されるようになり,身近なものとなっている
 GPUの性能は年々上昇し,ピーク演算性能はCPU
を上回っている
 近年,GPUを汎用な演算に用いるGPGPU
(General-Purpose computation on GPU)が注
目されている
 GPGPU


元々グラフィック演算を専門とするアクセラレータである
GPU をより汎用的で自由度の高い計算に用いること
特に,N体問題や連立一次方程式などの科学技術計算
によく用いられる
2
研究の目的
 科学技術計算に用いられる連立一次方程式の多
くは疎行列を対象

反復法で解くため,疎行列ベクトル積の性能が重要
 疎行列は零が多いため,それを省略して格納
 格納形式には様々な種類があり,行列ごとに最適
な格納形式は異なる
 GPU上での疎行列ベクトル積の高速化


入力された疎行列によって最適な格納形式を判別
格納形式を変換してから疎行列ベクトル積を行う
 今回はその第一歩として,
を実装し,性能を評価する
GPU上で各格納形式
3
GPU(Tesla C1060)
 複数のコアを搭載したメニーコアプロセッサ
 それぞれのコアでスレッドを同時に実行できる
ストリーミング
マルチプロセッサ
(SM)
グローバルメモリ
(4GB)
ストリーミング
プロセッサ
倍精度
ユニット
SP
SP
SP
SP
SP
SP
SP
SP
DP
共有メモリ
(16KB)
4
CUDA(Compute Unified Device
Architecture)
 NVIDIA社が提供している統合開発環境
 C言語と同様の記述が可能
 GPU上でのプログラムはスレッド単位で実行さ
れる
 CUDAでのメモリ参照



32バイト,64バイト,128バイトごと
それぞれのスレッドが,離れているメモリ領域にアク
セスすると参照回数が多くなる
連続するスレッドで連続するメモリ領域にアクセスす
るほうが効率が良い
5
疎行列の格納形式
 CRS(Compressed

4
0

2

0
0
0
6
1
行方向に走査し,零要素を省く
0
2
0
5
1
0
3

0
val:
4 1 2 2 6 3 1 5
非零要素の配列
colind:
1 4 3 1 2 4 2 3
非零要素の列番号
rowptr:
 CCS(Compressed

4
0

2

0
0
0
6
1
Row Storage)形式
1 3 4 7 9
上2つの配列での各行の先頭
を表す配列
Column Storage)形式
列方向に走査し,零要素を省く
0
2
0
5
1
0
3

0
val:
4 2 6 1 2 5 1 3
非零要素の配列
rowind:
1 3 3 4 2 4 1 3
非零要素の行番号
colptr:
1 3 5 7 9
上2つの配列での各列の先頭
を表す配列
 この2つの形式は格納が容易である
6
疎行列の格納形式(2)
 JDS(Jagged
Diagonal Storage)形式
1行あたりの非零要
素数が多い順に行
を並べ替える
行方向へ
非零要素
を詰める
4
0

2

0
0
0
6
1
0
2
0
5
1
0
3

0
4 1 
2



2 6 3


1 5 
2 6 3
4 1 


1 5 


2

val:
2 4 1 2 6 1 5 3
非零要素の配列
colind:
1 1 2 3 2 4 3 4
非零要素の列番号
ptr:
1 5 8 9
上2つの配列での各列の先頭を
表す配列
perm:
3 1 4 2
元の行列の行番号を表す配列
3
各行の非零要素数の最大値
max:
7
CUDAによる実装
③
④
CPU
ホストからデ
デバイスから
バイスへ
ホストへ GPU
データ転送
データ転送
プログラム
を起動
プログラム
を実行
デバイスメモリ
②
CPU上でプログラムを起動
デバイスメモリに領域を確保し,ホストメモリか
らデータを転送する
スレッドを生成し,GPU上で動作させるプログ
ラムを実行
結果をホストメモリへ転送する
ホストメモリ
①
8
CUDAを用いた行列ベクトル積(CRS形式)
4
0

2

0
0
0
6
1
0
2
0
5
4 1 2 2 6 3 1 5
colind:
1 4 3 1 2 4 2 3
x:
1
2
3
1
1 
 4  1  1 4 
8
2


6
0
2

3
 = 
×   = 
3
2  1  6  2  3  4
 26
3

 


 
0
4
1

2

5

3
 


17
val:
rowptr:
0
y[0] =
val[0] * x[colind[0]]
+ val[1] * x[colind[1]]
1 3 4 7 9
1 2 3 4
入力ベクトルの配列
SP
0
SP
1
SP
2
SP
3
SP
SP
SP
SP
DP
共有
メモリ
9
CUDAを用いた行列ベクトル積(CCS形式)
4
0

2

0
0
0
6
1
0
2
0
5
4 2 6 1 2 5 1 3
rowind:
1 3 3 4 2 4 1 3
x:
1
2
3
1 1 
4  1  0   0  1 4 
8
 0   0   2  3  0 
6
0  2 
+ 
+ 
+ 
 =  
×
=
2  1 6  2  0  3  4
 26
3  3 
  

 
 
 

 
0  4 
0
1

2
5

3
0

 
 
 

17
val:
colptr:
0
y[rowind[0]]
+= val[0] * x[0]
同じアドレスに
書き込むときは
y[rowind[1]]
+= val[1] * x[0]
排他制御が必要
1 3 5 7 9
1 2 3 4
入力ベクトルの配列
SP
0
SP
1
SP
2
SP
3
SP
SP
SP
SP
DP
共有
メモリ
10
CUDAを用いた行列ベクトル積(JDS形式)
2 6 3
4 1 


1 5 


2

4
0

2

0
0
0
6
1
0
2
0
5
1 1 
0  2 
×
=
3  3 
  
0  4 
val:
2 4 1 2 6 1 5 3
colind:
1 1 2 3 2 4 3 4
ptr:
1 5 8 9
perm:
3 1 4 2
max:
3
x:
0
1
2
3
 4  1  1 4 
8


6
2

3

=  
2  1  6  2  3  4
 26


 
 1 2  5  3 
17
y[perm[0]] =
val[0] * x[colind[0]]
+ val[5] * x[colind[5]]
+ val[8] * x[colind[8]]
SP
0
SP
1
SP
2
SP
3
SP
SP
SP
SP
DP
共有
メモリ
11
1 2 3 4
入力ベクトルの配列
評価
 各格納形式での行列ベクトル積の実行速度を計測
 計測はGPU上での実行時間のみ


メモリの確保やデータ転送は含めない
反復法のように,GPU上で何度も呼び出すアプリケーション
を想定
 倍精度演算を使用
 評価環境
CPU
GPU
CPU
AMD Opteron 2350×2
メモリ
16GB
GPU
NVIDIA Tesla C1060
メモリ
4GB
開発環境
CUDA SDK 2.3
コンパイラ
nvcc (-O3) version 2.3
12
評価(2)
of Florida Sparse
Matrix Collectionから以下の疎行列を用いた
 評価ではUniversity
Matrix
Size
非零要素数
mario002
389874
1167685
2.995032
tmt_sym
726713
2903837
3.995851
s3dkt3m2
90449
1921955
21.24905
msdoor
415863
10328399
24.83606
ldoor
952203
23737339
24.92886
F1
343791
13590452
39.53115
audikw_1
943695
39297771
41.64245
x104
108384
5138004
47.40556
crankseg_2
63838
7106348
111.3185
nd24k
72000
14393817
199.9141
1行あたりの
非零要素数
13
評価結果
2.5
早
GFLOPS
性能
2
1
0.5
遅
CCS形式では排他
制御を行うため低速
1.5
0
CRS
JDS
1行あたりの非零要
素数が少ないときは
CRS形式が高速
1行あたりの非零要CCS
素数が多いときは
JDS形式が高速
行列の種類
少
1行あたりの非零要素数
多
14
考察
 JDS形式では連続するスレッドが連続するメモ
リ領域にアクセスするため効率が良い
 しかし,1要素を計算する時のメモリ参照の回数
が多い
 1行あたりの非零要素数が少なくなるとCRS形
式でのメモリアクセスの効率が上がる
 1行あたりの非零要素数が少ないときはCRS形
式の方が実行速度が向上する
15
関連研究
 SILC(Simple
Interface for Library
Collections) [梶山ら,2005]


行列計算ライブラリインターフェース
CPU上で疎行列の格納形式を変更し,行列ベクトル
積の高速化を行った
 CG
on GPU-enhanced Clusters [A.Cevahir,
et al,2009]


GPUクラスタ上での共役勾配法の実装
異なる格納形式の疎行列ベクトル積を数回実行し,
最も高速なものを選択
16
まとめ
 CUDAを用いて,各格納形式の疎行列ベクトル積
を実装し,性能を評価した
 評価結果から,1行あたりの非零要素数によって,
各格納形式での行列ベクトル積の実行速度に違
いが生じる


多いときはJDS形式が高速
少ないときはCRS形式が高速
 最適な格納形式の選択には,1行あたりの非零要
素数を考慮する必要がある
17
今後の課題
 他の疎行列での評価

より多くの疎行列で評価を行い,より正確な疎行列と格
納形式との関連性を調べたい
 他の格納形式の実装

3つの格納形式で実装し評価を行ったが,他の格納形
式での実装,評価を行いたい
 CCS形式の行列ベクトル積の高速化

CCS形式では排他制御を行うため,低速であったが,
排他制御の回数を減らすことで高速化できる
 疎行列の格納形式選択アルゴリズムの実現

本研究の目的は,最適な格納形式を動的に選択するこ
とであるため,今回の結果を考慮した選択アルゴリズム
を実現したい
18
ご清聴ありがとうございました
19