開発およびチューニングの難しさと移植性
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/18 09:34 UTC 版)
「GPGPU」の記事における「開発およびチューニングの難しさと移植性」の解説
2015年現在、GPGPU対応プログラムの開発環境・APIとして代表的なものはCUDA、OpenCL、およびDirectComputeであり、GPGPU黎明期の開発環境に比べればはるかに開発しやすくなっているものの、依然としてアクセラレーターとなるハードウェアを意識したGPGPU特有のプログラミング知識が不可欠である。また、規格によってある程度標準化・抽象化されているとはいえ、いずれもデバイスとの通信を行なうローレベルのAPIを使いこなさなければならないなど、通常の C/C++ や Fortran を用いたソフトウェア開発とは次元の異なる難しさがあり、導入のハードルが高い。特に OpenCL と DirectCompute はハードウェアに共通にアクセスできる API を規定しているだけであり、CUDAよりもさらにローレベルの抽象度である。この点に関しては、アクセラレーターの存在を抽象化し、従来のCPUベース並列プログラミング用の共通規格 OpenMP に近い高レベルプログラミング環境を提供する OpenACC や C++ AMP といった規格も徐々に整備されつつある。 CPU上で動作するプログラムは組み込み環境を除き、ライブラリも含めて高レベルに洗練された開発環境が整っていることが多い。例えばC++、Java、C#言語などの代表的な高級言語では、単純な連続メモリの配列構造だけでなく、リンクリスト・二分探索木・ハッシュテーブルといった基本的なデータ構造はプログラミング言語標準ライブラリで提供されていることがほとんどだが、GPUプログラミングの場合は高速に処理できないという理由から[要出典]基本的には配列構造しか用意されていない。フォトンマッピング手法の開発者であるWann Jensen博士によると、複雑なデータ構造をGPU上で扱おうとするとCPUよりもはるかに困難となる場合が多いと評されている。他にも、GPUプログラミング言語であるHLSL、GLSL、およびOpenCL CではC++テンプレートのようなジェネリックプログラミング機能がサポートされないため、生産性が低い。なおBLASやFFTに関しては、NVIDIAによるCUDA実装のcuBLASやcuFFT、およびAMDによるOpenCL実装のclMath (clBLAS, clFFT) が存在する。そのほか、二分探索、ソート、リダクション、スキャンといったよく使われるアルゴリズムに関しては、NVIDIAによるCUDA実装のC++テンプレートベース並列アルゴリズムライブラリThrustや、AMDによるOpenCL/C++ AMP実装の同等ライブラリBoltが存在するが、両者に互換性はない。 また、GPUで演算した結果をCPUで読み出して利用する場合、従来アーキテクチャではGPUメモリからCPUメモリへのデータ転送が必要となる。その逆もまた然りである。こうしたCPU-GPU間のメモリ転送にかかる処理時間およびプログラミング上の手間が、性能のボトルネックやソフトウェア開発の難しさにつながるという問題も抱えている。これは物理的にメモリが分離されているdGPUとCPUによる構成だけでなく、従来型のオンボードグラフィックスやCPU内蔵GPUといった、物理メモリを共有する構成においても同様である。CUDAやOpenCLにはソフトウェア(ドライバー)レベルでこの転送の手間を解決する仕組みとして統合メモリ (unified memory) 機能や共有仮想メモリ (shared virtual memory) 機能が用意されてはいるが、あくまでメモリ空間のアドレッシングを仮想化して転送処理を自動化するだけの仕組みであり、アプリケーションプログラマーが明示的に転送処理を記述してチューニング・最適化する場合と比べてパフォーマンス上の問題もある。この点に関しては、AMDが推進しているHSA (Heterogeneous System Architecture) におけるhUMA (heterogeneous Uniform Memory Access) といった解決策が模索されている。 GPGPUプログラムの移植性に関しては、CUDAはNVIDIAハードウェア専用であり、また DirectCompute (DirectX) はMicrosoftプラットフォーム(Microsoft Windows、Xbox Oneなど)専用という制約がある。一方でOpenCLは、GPUだけでなく対応するあらゆるハードウェア・あらゆるプラットフォームへ展開できる高い移植性を持っているが、性能に関するポータビリティは必ずしも確保・保証されず、場合によってはデバイスやチップごとにコードをチューニングする必要がある。
※この「開発およびチューニングの難しさと移植性」の解説は、「GPGPU」の解説の一部です。
「開発およびチューニングの難しさと移植性」を含む「GPGPU」の記事については、「GPGPU」の概要を参照ください。
- 開発およびチューニングの難しさと移植性のページへのリンク