GPGPU
GPUという製品カテゴリが登場する前年でプログラマブルシェーダーも存在しない1998年に、Ian BuckによりSGI O2 R5000とSGI Indigo2 R4400 Maximum IMPACTのグラフィックスアクセラレータで、OpenGLのフレームバッファを漸化式の各計算ステップ用に2枚用いた単純な流体計算の高速化が試みられ、実際に数倍程度は高速化された。この当時のSGIのグラフィックスワークステーションにはジオメトリエンジンが独立したLSIチップとして搭載されており、後のGPUの原型とも言える構成となっていた。しかし固定機能シェーダーしか存在しない時代であったため非常に簡単なモデルしか計算できず、実用には程遠い代物であった。
固定機能シェーダーを用いて流体計算を高速化する方法はGPGPUの着想時に試みられたのみであり、今日的な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プログラミングの場合は高速に処理できないという理由から基本的には配列構造しか用意されていない。
GPGPUで性能が向上するアプリケーションの例として、下記が挙げられる。
数値計算 シミュレーション 分子動力学法、格子ボルツマン法 物理シミュレーション 流体計算・気候シミュレーション 天体シミュレーション
暗号解読 暗号通貨の採掘
音声処理
CT再構築
データベース処理
市況分析
機械学習(ニューラルネットワークなど行列計算によるもの) ディープラーニング
最適化問題(DRAMにコアレスアクセスするもの)
グラフィックス用途での汎用計算
実際の演算内容としては、行列演算、配列のリダクション、およびフーリエ変換などが挙げられる。
変わった例ではカスペルスキー・ラボが現在Radeon HD 2900で行っている実証試験として、GPUのパワーを使ってセキュリティソフトによる大まかなセキュリティチェックを行う機能を開発している。これによりCPUへの負担を減らすことができるとしている。
一方で、大量の条件分岐が伴う創薬研究や遺伝子解析のような用途にはスカラー計算機が適しており、ベクトル計算機やGPGPUベースの計算機には向かないとされている。