CPU/GPUを協調利用する ソフトウェア開発環境SPRAT

2009年6月24日
筑波大学 計算科学研究センター
CPU/GPUを協調利用する
ソフトウェア開発環境
GPGPU研究会
佐藤 功人(1)
滝沢 寛之(1)
小林 広明 (2)
(1) 東北大学大学院情報科学研究科
(2) 東北大学サイバーサイエンスセンター
GPUを用いた汎用演算時代の到来
描画処理用プロセッサ(GPU)
・・・ 高いメモリバンド幅と浮動小数点演算性能
ピーク浮動小数点演算性能 [Gflop/s]
ピークメモリバンド幅 [GB/s]
汎用データ並列処理を高速化
2009/6/24
GPGPU講習会・研究会
2
GPUにおけるプログラミング環境
CUDA ・・・ NVIDIA社製GPU用プログラミング環境

GPUをコプロセッサとして利用

C言語を拡張したプログラミング言語(C for CUDA)

GPU内部の記憶領域や演算資源を柔軟に利用可能
CUDAによるソフトウェア開発

ハードウェアを意識したチューニングが必須

高い性能を達成するプログラム ・・・ GPUに深く依存
2009/6/24
GPGPU講習会・研究会
3
CUDAにおけるソフトウェア開発の課題
特定計算機構成に特化したプログラムの問題

同一のプログラムの性能可搬性が喪失

搭載するGPUごとにチューニングが必要
理論性能
理論性能
実効性能
CPU
GPU
GeForce 8800 GTX
CPU
GPU
GeForce GTX 280
低効率
高効率
program
実効性能
program
CPU写真出典 www.kakaku.com
2009/6/24
GPGPU講習会・研究会
4
CPUとGPUを搭載する複合型計算機
複合型計算機(ヘテロジニアス型)

複合型 ・・・ 異なる種類のプロセッサを搭載

高いピーク演算性能・電力あたりの演算性能

ソフトウェア開発の難易度増加
CPU
GPU
1. プロセッサごとに異なるプログラミング環境
2. 計算機ごとに異なる最適な処理の割り当て
3. 演算条件ごとに異なる最適なプロセッサ
効率的な利用にはプログラミング支援が必要
2009/6/24
GPGPU講習会・研究会
5
1. プロセッサごとに異なるプログラミング環境
GPU・CPUのソフトウェア開発環境の違い

CPU ・・・ C, C++, FORTRAN等

GPU ・・・ CUDA, Brook+, OpenCL
GPUではベンダごとに開発環境が異なる

NVIDIA = CUDA/PTX
 AMD/ATI
= Brook+/CAL
・・・ ベンダを超えた標準化の動き(OpenCL)
2009/6/24
GPGPU講習会・研究会
6
2. 計算機ごとに異なる最適な処理の割り当て
計算機ごとに異なる構成
2~4GB/s
PCI
express
・・・ 常にGPUが高性能とは限らない

高性能CPU + 低性能GPU

低性能CPU + 高性能GPU

性能比が不明な場合も・・・
データ転送オーバーヘッドの考慮
CPU
GPU
Max 25.6GB/s
Max 141.7GB/s
Main
Memory
Video
Memory

処理を担当するプロセッサの切り替え
・・・ メモリ間でのデータ転送が必要(低速)

性能差が小さい場合に特に重要
2009/6/24
GPGPU講習会・研究会
7
3. 演算条件ごとに異なる最適なプロセッサ
LU分解の実効性能変化
演算条件への依存性
演算対象データ量などに依存して
CPU/GPUの優劣が変化
LU分解における例
CPU
Intel Core 2 Quad
Q6600 2.66GHz 1core
GPU
NVIDIA GeForce 8800GT
1200
実効演算性能 [Mflop/s]

1400

GPUの実行開始オーバーヘッドが大
・・・ 中~大規模演算で優位

実行時まで演算規模が定まらない
1000
800
600
400
200
CPU
0
0
2009/6/24
GPU
512
1024
行列サイズ [N]
GPGPU講習会・研究会
1536
2048
8
複合型向けのプログラミング支援
1. 計算機ごとに異なる最適な処理の割り当て
3. 演算条件ごとに異なる最適なプロセッサ
処理の割り当て支援 ・・・ Runtime Library
開発時
抽象化されたプロセッサに処理を割り当て
実行時
実際のプロセッサから最適なものを予測・選択
2. プロセッサごとに異なるプログラミング環境
統一的なプログラミング言語 + Compiler
・・・ それぞれのプロセッサ用プログラムを自動生成
2009/6/24
GPGPU講習会・研究会
9
ソフトウェア開発環境 SPRAT
Stream Programming with Runtime Auto-Tuning
統一的なプログラミング言語
処理の自動割り当て
SPRAT
program
Unified Executable Code
with SPRAT Runtime
SPRAT Compiler
program
program
for CPU
(C++)
for GPU
(CUDA)
CPU
GPU
2009/6/24
Executable
Code
for CPU
Runtime
Compiler
Library
プログラムの
自動生成
Executable
Code
for GPU
実行時間予測機構
最適プロセッサ予測機構
プロセッサの
自動選択
GPGPU講習会・研究会
10
SPRAT言語とCompiler
プロセッサに依存しないプログラミング言語

プロセッサごとのプログラミング言語を隠蔽

処理の割り当てを意識せずにプログラミング可能
ストリームプログラミングモデルの導入

ストリーム ・・・ 同じ処理を適用するデータ集合

カーネル ・・・ ストリーム要素に適用する処理を定義
入力ストリーム
SPRAT
program
SPRAT Compiler
program
program
for CPU
(C++)
for GPU
(CUDA)
CPU
GPU
出力ストリーム
カーネル
2009/6/24
GPGPU講習会・研究会
11
SPRAT言語による記述例
姫野ベンチマークにおける最内ループのカーネル関数化例
/ the main kernel of HIMENO Benchmark /
kernel map jacobi( gather stream<float> p,
in stream<float> a0, in stream<float> a1,
in stream<float> a2, in stream<float> a3,
in stream<float> b0, in stream<float> b1,
in stream<float> b2, in stream<float> c0,
in stream<float> c1, in stream<float> c2,
in stream<float> bnd, in stream<float> wrk1,
out stream<float> wrk2, out stream<float> gosa)
{
float ss, s0;
s0 = + a0*p[+1][ 0][
+ b0*( p[+1][+1][ 0]
+ b1*( p[ 0][+1][+1]
+ b2*( p[+1][ 0][+1]
+ c0*p[-1][ 0][ 0] +
0] + a1*p[ 0][+1][ 0] + a2*p[ 0][ 0][+1]
- p[+1][-1][ 0] - p[-1][+1][ 0] + p[-1][-1][ 0] )
- p[ 0][-1][+1] - p[ 0][+1][-1] + p[ 0][-1][-1] )
- p[-1][ 0][+1] - p[+1][ 0][-1] + p[-1][ 0][-1] )
c1*p[ 0][-1][ 0] + c2*p[ 0][ 0][-1] + wrk1;
ss = ( s0*a3 - p[0][0][0] )* bnd;
gosa = ss*ss;
wrk2 = p[0][0][0] + 0.8f *ss;
}
2009/6/24
GPGPU講習会・研究会
12
SPRAT言語と自動最適化
SPRAT言語 ・・・ プロセッサに非依存

プロセッサ固有の最適化を記述できない

GPUではハードウェアを考慮した最適化が必要
CUDA言語に対する自動最適化機構
SPRAT
program
SPRAT Compiler
CUDA
Optimizer
・・・ 効果の大きい最適化手法を自動適用

再利用性のあるデータを高速メモリへ再配置

メモリアクセスの効率化
実効性能の向上
GPUごとの最適化の違いを吸収
2009/6/24
GPGPU講習会・研究会
C++
program
(for CPU)
CUDA
program
(for GPU)
13
SPRATコンパイラによる自動最適化の位置付け
ハードウェアを意識しない
最適化領域
通常の
ソフトウェア開発
SPRATの
ソフトウェア開発
CUDA言語
SPRAT言語
演算方法の検討
・ 冗長演算の削減
・ 乗算をシフト演算へ
2009/6/24
ハードウェアを意識した アプリケーション固有の
最適化領域
最適化領域
CUDA言語
コンパイラによる
自動最適化
CUDA言語
メモリアクセスの最適化 アルゴリズムの検討
・ 効率的なメモリアクセス
・ 再利用性のあるデータを
高速なメモリに配置
GPGPU講習会・研究会
・ データ配置の検討
・ 演算方法の変更
14
最適化1:プリフェッチ最適化
再利用性のあるデータを高速なメモリに配置
GPUにおける読み書き可能なメモリの特性
記憶容量
遅延時間
Global Memory
大(~1GB)
長(510 cycle)
Shared Memory
小(16KB)
短(36 cycle)
SPRAT言語の性質

Global
Memory
i-2 i-1 i i+1 i+2 i+3
i+20 i+21 i+22 i+23
再利用性の高いデータを
容易に抽出可能なように設計
i-2 i-1 i i+1 i+2 i+3 i+4 i+5
再利用性の高いデータを
Shared Memoryに配置
2009/6/24
Shared
Memory
i-1 i i+1 i+2 i+3
GPGPU講習会・研究会
15
姫野ベンチマークにおける自動最適化効果
演算サイズ:MIDDLE(256×128×128)
35
Sustained Performance [Gflop/s]

GeForce 8800 GTX SPRAT言語レベルでの
静的アライン調整
GeForce GTX 280
30
自動最適化
25
20
15
10
5
0
SPRATベース実装
2009/6/24
共有メモリへデータを配置 共有メモリ + アライン調整
GPGPU講習会・研究会
16
最適化2:統合メモリアクセス化
非効率なメモリアクセスの効率化
GPUではデータアラインメントの影響が大きい

GeForce 8800 seriesでは実効メモリバンド幅に10倍の差
アラインされていないメモリアクセスを2回に分割して効率化
16N(m-1)
16N(m)
16N(m+1)
バイトアドレス
Global Memory
非アラインドメモリアクセス:低速
アラインドメモリアクセス:高速
N
スレッド群
Shared Memory
2009/6/24
GPGPU講習会・研究会
17
LU分解における自動最適化効果
3.0
実効演算性能比
2.5
GeForce 8800GTX
GeForce GTX280
2.74
2.04
2.0
1.5
1.29
1.16
1.0
0.95
0.82
0.5
0.0
統合メモリアクセス化
プリフェッチ最適化
2009/6/24
ー
ー
適用
ー
GeForce
GTX280
GeForce
8800GTX
ー
適用
適用
適用
GPGPU講習会・研究会
18
プロセッサの抽象化と自動選択

ストリーム処理プロセッサとして抽象化

実行時間履歴の記録と実行時間の予測
実行時間履歴
データベース
データ転送時間
予測機構
2009/6/24
SPRATから見える範囲
Stream
Processor
重み付け係数
CPU予測
実行時間
実行時間
予測機構
抽象度
Runtime Libraryによる実行時支援
GPU予測
実行時間
データ転送
時間
×
×
×
Runtime System
CPU優先度
GPU
優先度
最適プロセッサ
選択結果
予測機構
実行時間予測機構
最適プロセッサ予測機構
CPU
GPU
データ転送
オーバーヘッド
GPGPU講習会・研究会
19
実行時間履歴の記録と実行時間予測
自動プロファイリングと実行時間予測

各プロセッサで評価指標と実行時間の関係を記録

線形近似直線を引いて実行時間を予測

データ転送時間も同様の方法で予測
2. 実行時間予測
予測実行時間直線
実測点
2009/6/24
実行時間
実行時間
1. プロファイリング
予測実行時間直線
評価指標
評価指標
(例 データサイズ)
(例 データサイズ)
GPGPU講習会・研究会
20
自動選択のポリシー
実効性能指向で自動選択

予測実行時間をそのまま優先度として利用
実行時間予測機構
消費エネルギ指向で自動選択
GPU予測
実行時間

予測実行時間と消費電力を考慮した優先度

消費電力による重み付け
CPU予測
実行時間
×
×
重み付け係数
消費電力[W=J/s]
GPU
CPU優先度
CPUで処理した場合のエネルギ
CPU
CPU
GPU
2009/6/24
GPU優先度
GPUで処理した場合のエネルギ
予測実行時間[s]
GPGPU講習会・研究会
21
最適なプロセッサの予測
データ転送オーバーヘッドを考慮したプロセッサ選択

プログラムの周期性を想定

データ転送オーバーヘッド以上に優先度差が生じた場合に切り替え
プロセッサ間の優先度差 ≪ データ転送オーバーヘッド
累積優先度
データ転送オーバーヘッド
CPU
カーネル実行1回での比較
→ 切り替えが発生しない
GPU
CPU CPU CPU CPU CPU CPU CPU
GPU
GPU
GPU
GPU
データ転送オーバーヘッド
GPU
GPU
GPU
カーネル実行N回での比較
→ 切り替えが発生する
累積優先度差
2009/6/24
GPGPU講習会・研究会
22
GPU
CPU
切り替えまでの
オーバーヘッド
転送時間
カーネルの実行回数
累積優先度差
GPU vs CPU
累積消費エネルギ差
累積実行時間差
プロセッサを切り替えるタイミング
(GPU→CPUデータ転送オーバーヘッド)
累積優先度差
カーネルの実行回数
プロセッサ
切り替え
2009/6/24
GPU Switch
CPU
GPGPU講習会・研究会
23
LU分解による自動切り替え評価(1)
異なる構成の計算機で同じプログラムを実行

Core 2 Quad Q6600 + GeForce GTX 280
 Core 2 Quad Q6600 + GeForce 8800 GTX
 Core 2 Quad Q6600 + GeForce 8800 GT
実効性能指向で自動切り替え

評価指標 ・・・ Gflop/s (実効演算性能)
比較対象
CPU only ・・・ CPUのみを利用
 GPU only ・・・ GPUのみを利用
 SPRAT ・・・ CPU/GPUを自動切り替え

2009/6/24
GPGPU講習会・研究会
24
実効演算指向の自動選択
CPU + GeForce GTX280の場合
10000
Performance [MFLOPS]
9000
8000
7000
6000
5000
CPU only
GPU only
SPRAT
4000
3000
2000
1000
0
0
256
512
768
1024
1280
1536
1792
2048
Execution Size [N]
2009/6/24
GPGPU講習会・研究会
25
実効演算指向の自動選択
CPU + GeForce 8800GTXの場合
2000
Performance [MFLOPS]
1800
1600
1400
1200
1000
800
600
CPU only
GPU only
SPRAT
400
200
0
0
256
2009/6/24
512
768
1024
1280
Execution Size [N]
1536
GPGPU講習会・研究会
1792
2048
26
実効演算指向の自動選択
CPU + GeForce 8800GTの場合
Performance [MFLOPS]
1400
1200
1000
800
600
CPU only
GPU only
SPRAT
400
200
0
0
256
512
768
1024
1280
1536
1792
2048
Execution Size [N]
2009/6/24
GPGPU講習会・研究会
27
LU分解による自動切り替え評価(2)
異なる構成の計算機で同じプログラムを実行

Core 2 Quad Q6600 + GeForce GTX 280
 Core 2 Quad Q6600 + GeForce 8800 GTX
 Core 2 Quad Q6600 + GeForce 8800 GT
消費エネルギ指向で自動切り替え

評価指標 ・・・ Gflop/s/W (単位電力あたりの実効演算性能)
比較対象
CPU only ・・・ CPUのみを利用
 GPU only ・・・ GPUのみを利用
 SPRAT ・・・ CPU/GPUを自動切り替え

2009/6/24
GPGPU講習会・研究会
28
消費エネルギ指向の自動選択
CPU + GeForce GTX280の場合
Power Efficiency [Mflop/s/W]
35
30
25
20
CPU only
GPU only
SPRAT
15
10
5
0
0
256
2009/6/24
512
768
1024
1280
Matrix Size [N]
1536
GPGPU講習会・研究会
1792
2048
29
消費エネルギ指向の自動選択
CPU + GeForce 8800GTXの場合
Power Efficiency [Mflop/s/W]
8
7
6
5
4
3
CPU only
GPU only
SPRAT
2
1
0
0
256
512
768
1024
1280
1536
1792
2048
Matrix Size [N]
2009/6/24
GPGPU講習会・研究会
30
消費エネルギ指向の自動選択
CPU + GeForce 8800GTの場合
Power Efficiency [Mflop/s/W]
9
8
7
6
5
4
3
CPU only
GPU only
SPRAT
2
1
0
0
256
512
768
1024
1280
1536
1792
2048
Matrix Size [N]
2009/6/24
GPGPU講習会・研究会
31
まとめ
複合型計算機におけるソフトウェア開発の困難

プロセッサごとに異なるプログラミング環境

計算機ごとに異なる最適な処理の割り当て

演算条件ごとに異なる最適なプロセッサ
・・・ 性能可搬性の低下・プログラミング難易度の上昇
SPRAT (Stream Programming with Runtime Auto-Tuning)

プロセッサの抽象化と実行時自動プロセッサ選択機能

プロセッサに依存しないプログラミング言語
2009/6/24
GPGPU講習会・研究会
32
SPRATを利用する効果
プログラミング難易度の低下

処理の割り当てを考慮せずにプログラミング可能

特定のハードウェア構成を意識する必要が無い
プログラムの移植性・再利用性の向上

計算機構成に依存せずに最適なプロセッサを利用可能

ハードウェア依存の最適化を自動適用
演算条件の動的な変化への対応

与えられた演算条件で最良のプロセッサを自動選択
2009/6/24
GPGPU講習会・研究会
33
SPRATの今後
対応するプロセッサ構成の増加

現状 ・・・ CPU + NVIDIA社製GPU

将来 ・・・ AMD社製GPU, Cell B.E.等
自動選択機能の精度向上

実行時間予測の精度向上
ソフトウェア開発環境の整備・充実

デバッグツール・ライブラリ群などの整備
2009/6/24
GPGPU講習会・研究会
34
ご静聴ありがとうございました
2009/6/24
GPGPU講習会・研究会
35