Upload
niran
View
127
Download
0
Embed Size (px)
DESCRIPTION
正方行列向け特異値分解の CUDA による高速化. 2009 年 6 月 24 日 GPGPU 研究会 筑波大学 計算科学研究センター. 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学). 単純計算では CPU の数十倍の性能 CPU を上回る性能向上 開発環境の整備. NVIDIA GeForce8800 GTX. (単精度演算: 345.6GFLOPS ). CUDA の利用例:行列計算,重力多体計算,分子軌道計算,流体計算など. 2006 年に NVIDIA 社が発表 - PowerPoint PPT Presentation
Citation preview
山本 有作 (名古屋大学)深谷 猛 (名古屋大学)畝山 多加志 (京都大学)中村 佳正 (京都大学)
正方行列向け特異値分解のCUDA による高速化
2009 年 6 月 24 日
GPGPU 研究会 筑波大学 計算科学研究センター
( 2/35 )
研究背景
◆ GPGPU ( General Purpose GPU )
◆ CUDA ( Compute Unified Device Architecture )
一般の科学技術計算への GPU の利用• 単純計算では CPU の数十倍の性能• CPU を上回る性能向上• 開発環境の整備 NVIDIA GeForce8800 GTX
(単精度演算: 345.6GFLOPS )
GPGPU のための統合開発環境• 2006 年に NVIDIA 社が発表• C/C++ の拡張により GPGPU のプログラミングが可能• GPU 向けにチューニング済みのライブラリ( BLAS , FFT )
CUDA の利用例:行列計算,重力多体計算,分子軌道計算,流体計算など( Cf. http://www.nvidia.co.jp/object/cuda_home_jp.html )
( 3/35 )
研究目的
◆ 正方行列の特異値分解• A : n×n 密行列• U : n×n 直交行列• : n×n 対角行列• V : n×n 直交行列
(応用分野:画像処理,情報検索,主成分分析など)
◆ 研究目的CUDA による正方行列の特異値分解計算の高速化
• 実装コストと汎用性の考慮• GPU に適したアルゴリズムを選択• 性能評価と課題の発見
※ GPU を使う部分の計算は単精度で行う
( 4/35 )
発表の流れ
1. 研究背景と目的
2. 高速化の方針
3. アルゴリズムの選択
4. 実装の概要
5. 性能評価
6. 終わりに
高速化の方針
( 6/35 )
CUDA による行列計算の高速化
◆ GPU 向けにプログラムの移植• 拡張された C 言語でコーディングして, nvcc でコンパイル
• 自由度の高いプログラミングが可能
• GPU の性能を十分に引き出すには様々なチューニングが必要(スレッド数,条件分岐,メモリアクセスの連続性など)
◆ CUBLAS の利用• CUDA で提供されている BLAS ( Basic Linear Algebra Subprograms )
• 標準の C 言語のプログラム中で利用可能 ( gcc でコンパイル可能)
• 限られた基本演算(行列ベクトル積,行列乗算など)のみ
• GPU 向けにチューニング済み
今回はできるだけ CUBLAS を使って高速化を行う
( 7/35 )
CUBLAS の特徴
◆ 仕様の特徴• ユーザー自身がデータ転送を制御• ボードのデータはプログラム終了まで保持
メインメモリ
グラフィックボード
(1)Set Data
GPU 用メモリ
GPU
(3)Get Data
(2)SGEMM etc.
PCI-Express
メモリ配置の工夫によるデータ転送コストの削減
SGEMM の有効利用
◆ 性能
× =
× =
SGEMM (行列乗算)
SGEMV (行列ベクトル積)
020
406080
100
120140
0 1000 2000 3000 4000 5000
( GFLOPS )
( Size )GeForce8800 GTX & CUBLAS ver. 1.0
※ 転送時間は含んでいない
( 8/35 )
特異値分解計算の特徴
◆ 計算手順と特徴
A B
(a) 二重対角化:
(b) 二重対角行列の特異値分解:
(c) 逆変換:
• U1, V1 :直交行列, B :下二重対角行列
• 大半が BLAS ルーチンにより計算可能• 演算量: O(n3)
• 様々なアルゴリズム( QR 法,分割統治法, MR3 , I-SVD など)• 丸め誤差の影響を受けやすい• 演算量: O(n2) ~ O(n3)
• 大半が BLAS ルーチンにより計算可能• 演算量: O(n3)
( 9/35 )
特異値分解計算の特徴
◆ 計算時間の内訳
◆ GPU を使う効果とコスト• 二重対角化と逆変換 : 少ない実装コストで大きな効果が期待できる
• B の特異値分解 : 実装コストは大きいが効果は小さい可能性が高い
大半が BLAS ルーチンで計算可能 ⇒ CUBLAS の利用が可能 計算時間全体に占める割合が大きい ⇒高速化の効果が高い
様々なアルゴリズムが存在 ⇒ 各々について検討が必要 複雑な演算パターン ⇒ プログラムの移植が必要 ⇒ チューニングコスト大 丸め誤差の影響を受けやすい ⇒ 単精度演算に適していない
(n)
Core2 Duo (1.86GHz) & Intel MKL ver. 8.10%
20%
40%
60%
80%
100%
1280 2560 3840 5120
逆変換B I- SVDの特異値分解( )二重対角化
( 10/35 )
高速化の方針
◆ GPU の使い方
SGEMM をできるだけ利用する メインメモリと GPU 用メモリ間のデータ通信コストを抑える
• できるだけ CUBLAS を使う
•GPU 向けのプログラムの移植は最小限にする
◆ 特異値分解の計算• 二重対角化と逆変換の計算には GPU を利用する•B の特異値分解の計算は CPU のみで行う
アルゴリズムの選択(二重対角化・逆変換)
( 12/35 )
従来法
◆ 鏡像変換による二重対角化
鏡像変換 : I -
A B・・・
◆ 逆変換に対して
( 13/35 )
従来法の特徴
◆ 二重対角化• 計算の逐次性
:行列ベクトル積 ( SGEMV )
: rank-1 更新 ( SGER )
•鏡像変換の作成のための通信コスト
鏡像変換の作成には直前の A の情報(ベクトル 1本分)が必要
鏡像変換の作成は BLAS ルーチンのみで行えない( CPU で行う必要がある) 鏡像変換の作用ごとに 2 回の通信( A の情報の取得,鏡像変換の転送) 通信するデータ量はベクトル 1本分程度
•鏡像変換の作用は SGEMV が中心
CUBLAS による高速化の効果があまり期待できないのでは・・・?
( 14/35 )
Bischof の手法
◆ 二段階の二重対角化(a-1) 下三角帯行列化:
(b) 二重対角行列の特異値分解:
(c-1) 村田法の逆変換:
(a-2) 村田法:
(c-2) 帯行列化の逆変換:
• U11, V11 :直交行列, C :半帯幅が L の下三角帯行列
• 大部分を行列乗算により計算可能• 演算量: 8n3/ 3 (ただし n ≫ L )
• U12, V12 :直交行列, B :下二重対角行列
• 演算量: 8n2L
• 演算量: 4n3
• 演算量: 4n3
A C
BC
( 15/35 )
Bischof の手法
◆ ブロック鏡像変換による下三角帯行列化
ブロック鏡像変換 : I -
A ・・・ C
( 16/35 )
Bischof の手法
◆ 村田法による帯行列の二重対角化
・・・
•第 1 列の二重対角化
•第 2 列の二重対角化
サイズの小さい鏡像変換による bulge-chasing
・・・
・・・C
( 17/35 )
Bischof の特徴
◆ 二重対角化• 二重対角化の大部分は帯行列化
• ブロック鏡像変換の作成のための通信コスト 一回の通信量の増加(ベクトル→行列) 通信回数の減少 ( 1/L )
二重対角化全体としては CUBLAS を効果的に使えるのでは・・・?
•村田法に CUBLAS を使っても効果が乏しい 鏡像変換のサイズが小さい 演算は SGEMV が中心
帯行列化の演算は SGEMM が中心
◆ 逆変換• 演算量が従来法の 2 倍に増加
逆変換のコストの増加の影響は・・・?
( 18/35 )
性能予測による比較
◆ CUBLAS の性能測定(ブロック)鏡像変換の作用では,段々と行列のサイズが小さくなる
段々とサイズを変化させて SGEMM , SGEMV を実行演算量の合計
実行時間の合計( FLOPS )
Bischof の手法の方が効果が期待できる
◆ 両手法の性能予測
0
10
20
30
40
50
60
70
従来法 Bischof
逆変換(帯行列化)
逆変換(村田法)
逆変換
村田法
帯行列化
二重対角化
予測時間 (sec) • n = 5120
• L = 64
• SGEMV : 3.54 GFLOPS
• SGEMM : 95.20 GFLOPS
• 村田法は CPU での実際の実行時間
各ステップの演算量と演算の種類から時間を予測
実装の概要
( 20/35 )
Bischof の手法の実装
◆ GPU を利用する部分(a-1) 下三角帯行列化
(b) 二重対角行列の特異値分解
(c-1) 村田法の逆変換
(a-2) 村田法
(c-2) 帯行列化の逆変換
CUBLASCPU
GPU 向けに移植 (nvcc)
CPU
CUBLASCPU
CUBLAS
( 21/35 )
下三角帯行列化
GPUCPU
=
SGEMM
=
( 22/35 )
帯行列化の逆変換
SGEMM
※ V も同様にして計算
GPUCPU
( 23/35 )
村田法の逆変換
・・・
GPUCPU
SGEMM
※ V も同様にして計算
・・・
SGEMM
SGEMM
SGEMM の性能が出るサイズに合成
( 24/35 )
GPU への村田法の移植
◆ bulge-chasing のパイプライン式並列化
・・・
・・・
•第 1 列の二重対角化
•第 2 列の二重対角化 更新範囲が重ならない
◆ GPU 上での並列計算方法 ( GeForce8800 GTX )• 16個の MP で bulge-chasing をパイプライン式に並列実行• MP 内の 8個の SP で鏡像変換の作用を並列計算( MP 内の共有メモリを利用)
( 25/35 )
特異値分解計算の全体の様子
GPUCPUA A
C
U2 V2
U V
Q
BH
鏡像変換の作成・作用
B H
C
Q
ブロック鏡像変換の作成 ブロック鏡像変換の作用 CUBLAS
鏡像変換の合成
U’ V’
合成結果の作用 CUBLAS
U V
ブロック鏡像変換の作用 CUBLAS
特異値分解
U2 V2
性能評価
( 27/35 )
評価方法
◆ 評価問題• [-0.5 , 0.5] の乱数を要素とする n×n の正方行列の特異値分解
• n = 1280, 2560, 3840, 5120
◆ 手法• 二重対角行列の特異値分解は全て I-SVD の倍精度計算で行う• 二重対角化と逆変換の計算法は以下の通り(全て単精度で行う)
従来法( LAPACK のルーチン)を CPU のみで実行
Bischof の手法(自作プログラム)を CPU のみで実行
Bischof の手法(自作プログラム)を CPU と GPU で実行
◆ 実行環境• CPU : Intel Core2 Duo (1.86GHz), Intel MKL ver. 8.1, gcc オプション -O3
• GPU : NVIDIA GeForce8800 GTX, CUBLAS ver. 1.0, nvcc ver. 1.0
※ Bischof の手法における半帯幅 L は 32, 64, 128
( 28/35 )
二重対角化と逆変換の評価
0.00
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
10.00
従来法 Bischof(32) Bischof(64) Bischof(128) Bischof(32) Bischof(64) Bischof(128)
逆変換(帯行列化)逆変換(村田法)逆変換村田法帯行列化二重対角化
◆ n=1280
CPU ( 2 コア) CPU ( 1 コア) & GPU
実行時間 (sec)
2.9 倍の高速化
( 29/35 )
特異分解計算全体の評価
0.00
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
10.00
従来法 Bischof(32) Bischof(64) Bischof(128) Bischof(32) Bischof(64) Bischof(128)
逆変換(帯行列化)逆変換(村田法)逆変換I- SVD村田法帯行列化二重対角化
◆ n=1280
CPU ( 2 コア) CPU ( 1 コア) & GPU
実行時間 (sec)
1.9 倍の高速化
( 30/35 )
二重対角化と逆変換の評価
0
50
100
150
200
250
300
350
400
従来法 Bischof(32) Bischof(64) Bischof(128) Bischof(32) Bischof(64) Bischof(128)
逆変換(帯行列化)逆変換(村田法)逆変換村田法帯行列化二重対角化
◆ n=5120
CPU ( 2 コア) CPU ( 1 コア) & GPU
実行時間 (sec)
7.0 倍の高速化
( 31/35 )
特異分解計算全体の評価
0
50
100
150
200
250
300
350
400
従来法 Bischof(32) Bischof(64) Bischof(128) Bischof(32) Bischof(64) Bischof(128)
逆変換(帯行列化)逆変換(村田法)逆変換I- SVD村田法帯行列化二重対角化
実行時間 (sec)
◆ n=5120
CPU ( 2 コア) CPU ( 1 コア) & GPU
4.2 倍の高速化
( 32/35 )
Bischof の手法のステップごとの評価
0.0
5.0
10.0
15.0
20.0
25.0
1280 2560 3840 5120
帯行列化 村田法 逆変換(村田法) 逆変換(帯行列化)
Speedup
◆ L=64 の場合
(n)Speedup = CPU (2 コア ) での実行時間 / CPU (1 コア ) & GPU での実行時間
( 33/35 )
性能予測の評価
0
10
20
30
40
50
60
70
従来法 Bischof Bischof Bischof
逆変換(帯行列化)逆変換(村田法)逆変換村田法帯行列化二重対角化
予測 実際
時間 (sec) n = 5120 , L = 64
• 予測性能は実際の性能の上限を見積もっている
• 従来法の予測性能 < Bischof の手法の実際の性能
村田法は CPU
Bischof の手法の選択は適切であったと言える
( 34/35 )
精度評価
1.0E- 11
1.0E- 10
1.0E- 09
1.0E- 08
1.0E- 07
1.0E- 06
1.0E- 05
1.0E- 04
1.0E- 03
1.0E- 02
1.0E- 01
1.0E+00
1280 2560 3840 5120
CPU_LAPACK (double)CPU_LAPACK (single)CPU_Bischof (single)CPU & GPU_Bischof (single)
1.0E- 12
1.0E- 11
1.0E- 10
1.0E- 09
1.0E- 08
1.0E- 07
1.0E- 06
1.0E- 05
1.0E- 04
1.0E- 03
1.0E- 02
1.0E- 01
1.0E+00
1280 2560 3840 5120
n n
終わりに
( 36/35 )
まとめと今後の課題
◆ まとめ• CUDA を用いた正方行列の特異値分解計算の高速化
• CUBLAS の SGEMM の利用を中心とした高速化
• 性能予測により, Bischof の手法を二重対角化・逆変換の手法として選択
• メモリ配置の工夫によるデータ転送コストの削減
• CPU 上での事前計算による, CUBLAS の SGEMM の有効利用
• 数値実験による性能評価(特異値分解全体で最大 4 倍程度の高速化)
◆ 今後の課題• CPU と GPU の仕事の分担のさらなる効率化• 適切な半帯幅の決定方法•村田法の高速化• 最新バージョンの CUDA や他のアクセラレータを用いた性能評価• 対称行列の固有値計算への適用