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