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
© Copyright 2026 ExpyDoc