山本 有作 (名古屋大学) 深谷 猛 (名古屋大学)...

36
山山 山山 山山山山山山 () 山山 山山山山山山 () 山山 山山山 山山山山山 () 山山 山山 山山山山山 () 山山山山山山山山山山山山 CUDA 山山山山山山 2009 山 6山 24 山 GPGPU 山山山 山山山山 山山山山山山山山山山

Upload: niran

Post on 06-Jan-2016

127 views

Category:

Documents


0 download

DESCRIPTION

正方行列向け特異値分解の CUDA による高速化. 2009 年 6 月 24 日 GPGPU 研究会  筑波大学 計算科学研究センター. 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学). 単純計算では CPU の数十倍の性能 CPU を上回る性能向上 開発環境の整備. NVIDIA GeForce8800 GTX. (単精度演算: 345.6GFLOPS ). CUDA の利用例:行列計算,重力多体計算,分子軌道計算,流体計算など. 2006 年に NVIDIA 社が発表 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

山本 有作  (名古屋大学)深谷 猛 (名古屋大学)畝山 多加志 (京都大学)中村 佳正  (京都大学)

正方行列向け特異値分解のCUDA による高速化

2009 年 6 月 24 日

GPGPU 研究会 筑波大学 計算科学研究センター

Page 2: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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 )

Page 3: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 3/35 )

研究目的

◆ 正方行列の特異値分解• A : n×n 密行列• U : n×n 直交行列• : n×n 対角行列• V : n×n 直交行列

(応用分野:画像処理,情報検索,主成分分析など)

◆ 研究目的CUDA による正方行列の特異値分解計算の高速化

• 実装コストと汎用性の考慮• GPU に適したアルゴリズムを選択• 性能評価と課題の発見

※ GPU を使う部分の計算は単精度で行う

Page 4: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 4/35 )

発表の流れ

1. 研究背景と目的

2. 高速化の方針

3. アルゴリズムの選択

4. 実装の概要

5. 性能評価

6. 終わりに

Page 5: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

高速化の方針

Page 6: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 6/35 )

CUDA による行列計算の高速化

◆ GPU 向けにプログラムの移植• 拡張された C 言語でコーディングして, nvcc でコンパイル

• 自由度の高いプログラミングが可能

• GPU の性能を十分に引き出すには様々なチューニングが必要(スレッド数,条件分岐,メモリアクセスの連続性など)

◆ CUBLAS の利用• CUDA で提供されている BLAS ( Basic Linear Algebra Subprograms )

• 標準の C 言語のプログラム中で利用可能 ( gcc でコンパイル可能)

• 限られた基本演算(行列ベクトル積,行列乗算など)のみ

• GPU 向けにチューニング済み

今回はできるだけ CUBLAS を使って高速化を行う

Page 7: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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

※ 転送時間は含んでいない

Page 8: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 8/35 )

特異値分解計算の特徴

◆ 計算手順と特徴

A B

(a) 二重対角化:

(b) 二重対角行列の特異値分解:

(c) 逆変換:

• U1, V1 :直交行列,  B :下二重対角行列

• 大半が BLAS ルーチンにより計算可能• 演算量: O(n3)

• 様々なアルゴリズム( QR 法,分割統治法, MR3 , I-SVD など)• 丸め誤差の影響を受けやすい• 演算量: O(n2) ~ O(n3)

• 大半が BLAS ルーチンにより計算可能• 演算量: O(n3)

Page 9: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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の特異値分解( )二重対角化

Page 10: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 10/35 )

高速化の方針

◆ GPU の使い方

SGEMM をできるだけ利用する メインメモリと GPU 用メモリ間のデータ通信コストを抑える

• できるだけ CUBLAS を使う

•GPU 向けのプログラムの移植は最小限にする

◆ 特異値分解の計算• 二重対角化と逆変換の計算には GPU を利用する•B の特異値分解の計算は CPU のみで行う

Page 11: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

アルゴリズムの選択(二重対角化・逆変換)

Page 12: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 12/35 )

従来法

◆ 鏡像変換による二重対角化

鏡像変換 : I -

A B・・・

◆ 逆変換に対して

Page 13: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 13/35 )

従来法の特徴

◆ 二重対角化• 計算の逐次性

:行列ベクトル積 ( SGEMV )

: rank-1 更新 ( SGER )

•鏡像変換の作成のための通信コスト

鏡像変換の作成には直前の A の情報(ベクトル 1本分)が必要

鏡像変換の作成は BLAS ルーチンのみで行えない( CPU で行う必要がある) 鏡像変換の作用ごとに 2 回の通信( A の情報の取得,鏡像変換の転送) 通信するデータ量はベクトル 1本分程度

•鏡像変換の作用は SGEMV が中心

CUBLAS による高速化の効果があまり期待できないのでは・・・?

Page 14: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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

Page 15: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 15/35 )

Bischof の手法

◆ ブロック鏡像変換による下三角帯行列化

ブロック鏡像変換 : I -

A ・・・ C

Page 16: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 16/35 )

Bischof の手法

◆ 村田法による帯行列の二重対角化

・・・

•第 1 列の二重対角化

•第 2 列の二重対角化

サイズの小さい鏡像変換による bulge-chasing

・・・

・・・C

Page 17: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 17/35 )

Bischof の特徴

◆ 二重対角化• 二重対角化の大部分は帯行列化

• ブロック鏡像変換の作成のための通信コスト 一回の通信量の増加(ベクトル→行列) 通信回数の減少 ( 1/L )

二重対角化全体としては CUBLAS を効果的に使えるのでは・・・?

•村田法に CUBLAS を使っても効果が乏しい 鏡像変換のサイズが小さい 演算は SGEMV が中心

帯行列化の演算は SGEMM が中心

◆ 逆変換• 演算量が従来法の 2 倍に増加

逆変換のコストの増加の影響は・・・?

Page 18: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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 での実際の実行時間

各ステップの演算量と演算の種類から時間を予測

Page 19: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

実装の概要

Page 20: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 20/35 )

Bischof の手法の実装

◆ GPU を利用する部分(a-1) 下三角帯行列化

(b) 二重対角行列の特異値分解

(c-1) 村田法の逆変換

(a-2) 村田法

(c-2) 帯行列化の逆変換

CUBLASCPU

GPU 向けに移植 (nvcc)

CPU

CUBLASCPU

CUBLAS

Page 21: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 21/35 )

下三角帯行列化

GPUCPU

SGEMM

Page 22: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 22/35 )

帯行列化の逆変換

SGEMM

※ V も同様にして計算

GPUCPU

Page 23: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 23/35 )

村田法の逆変換

・・・

GPUCPU

SGEMM

※ V も同様にして計算

・・・

SGEMM

SGEMM

SGEMM の性能が出るサイズに合成

Page 24: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 24/35 )

GPU への村田法の移植

◆ bulge-chasing のパイプライン式並列化

・・・

・・・

•第 1 列の二重対角化

•第 2 列の二重対角化 更新範囲が重ならない

◆ GPU 上での並列計算方法 ( GeForce8800 GTX )• 16個の MP で bulge-chasing をパイプライン式に並列実行• MP 内の 8個の SP で鏡像変換の作用を並列計算( MP 内の共有メモリを利用)

Page 25: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 25/35 )

特異値分解計算の全体の様子

GPUCPUA A

C

U2 V2

U V

Q

BH

鏡像変換の作成・作用

B H

C

Q

ブロック鏡像変換の作成 ブロック鏡像変換の作用 CUBLAS

鏡像変換の合成

U’ V’

合成結果の作用 CUBLAS

U V

ブロック鏡像変換の作用 CUBLAS

特異値分解

U2 V2

Page 26: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

性能評価

Page 27: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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

Page 28: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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 倍の高速化

Page 29: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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 倍の高速化

Page 30: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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 倍の高速化

Page 31: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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 倍の高速化

Page 32: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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 での実行時間

Page 33: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 33/35 )

性能予測の評価

0

10

20

30

40

50

60

70

従来法 Bischof Bischof Bischof

逆変換(帯行列化)逆変換(村田法)逆変換村田法帯行列化二重対角化

予測 実際

時間 (sec) n = 5120 , L = 64

• 予測性能は実際の性能の上限を見積もっている

• 従来法の予測性能 <  Bischof の手法の実際の性能

村田法は CPU

Bischof の手法の選択は適切であったと言える

Page 34: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 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

Page 35: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

終わりに

Page 36: 山本 有作 (名古屋大学) 深谷 猛 (名古屋大学) 畝山 多加志(京都大学) 中村 佳正 (京都大学)

( 36/35 )

まとめと今後の課題

◆ まとめ• CUDA を用いた正方行列の特異値分解計算の高速化

• CUBLAS の SGEMM の利用を中心とした高速化

• 性能予測により, Bischof の手法を二重対角化・逆変換の手法として選択

• メモリ配置の工夫によるデータ転送コストの削減

• CPU 上での事前計算による, CUBLAS の SGEMM の有効利用

• 数値実験による性能評価(特異値分解全体で最大 4 倍程度の高速化)

◆ 今後の課題• CPU と GPU の仕事の分担のさらなる効率化• 適切な半帯幅の決定方法•村田法の高速化• 最新バージョンの CUDA や他のアクセラレータを用いた性能評価• 対称行列の固有値計算への適用