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