GPGPU
[Wikipedia|▼Menu]

GPGPU(General-purpose computing on graphics processing units; GPUによる汎用計算)とは、GPUの演算資源を画像処理以外の目的に応用する技術のことである[1][2]ビッグデータなどを含む科学技術計算に対し大量の計算を実行できるというメリットのため、広く使われるようになった[3]2022年、単一マシンとしては世界初のエクサスケールコンピュータとなった米HPEの「フロンティア」にもベクトル計算用にAMDGPUが搭載されるなど、世界最速を競うスーパーコンピュータでの利用も一般的である。

GPGPUは、GPUが持つベクトル計算機としての特性を活かした汎用的なストリーム・プロセッシングの一形態である。GPUはコンピュータゲームで多用されるリアルタイム画像処理向けのデータ並列計算とパイプライン処理に特化した命令発行形態を持ち、またGPUとメインメモリ間の帯域幅は通例狭く[注釈 1]、固定長レジスタしか扱えない[注釈 2](後述)ものの、GPUと直結されるVRAM間には十分広い帯域幅を備えておりSIMDやSIMT(英語版)による並列計算も行える[4]

GPGPUは制約はあるもののHPCの分野で注目される応用技術である。伝統的に構築されてきた、カスタムCPUとして開発されるベクトルプロセッサを主体としたスーパーコンピュータと比較して、疎行列で計算効率が低下する[注釈 3]、可変長ベクトル命令が扱えずレジスタ長で割り切れない要素を別途考慮する必要があるという欠点はある[5]ものの、GPUを主体として計算機システムを構成する方がコストパフォーマンスが高くなることからHPC分野での導入が進んでいる[6]

しかし、GPU特有の制約は無くなりつつある。2023年現在ではプログラマブルシェーダーの発展によりCPUと同程度のプログラマビリティが実現されており[7]、OpenCLなどを用いることでCPUとGPUでの相互で互換性を持ったプログラムを作成することも可能であることから[8]、前述のランダムメモリアクセスに弱い、可変長ベクトル命令が利用できないという、伝統的なベクトルプロセッサと比較した場合の原理的な欠点以外については改善されてきている。
GPGPUブームまでの略史

最初の試みから一般的に使えるAPIが完成するまでに10年の歳月を要した。
1998年: SGIのグラフィックスワークステーションを用いた実験

GPUという製品カテゴリが登場する前年でプログラマブルシェーダーも存在しない1998年に、Ian Buck[9]によりSGI O2 R5000とSGI Indigo2 R4400 Maximum IMPACTのグラフィックスアクセラレータで、OpenGLフレームバッファ漸化式の各計算ステップ用に2枚用いた単純な流体計算の高速化が試みられ、実際に数倍程度は高速化された[10][11]。この当時のSGIグラフィックスワークステーションにはジオメトリエンジンが独立したLSIチップとして搭載されており、後のGPUの原型とも言える構成となっていた[12]。しかし固定機能シェーダーしか存在しない時代であったため非常に簡単なモデルしか計算できず、実用には程遠い代物であった。

固定機能シェーダーを用いて流体計算を高速化する方法はGPGPUの着想時に試みられたのみであり、今日的なGPGPUの観点からすると極めて特殊でイメージが付きづらいため、下記にその研究で実行されたコードの引用[10]と各行の説明を示す。概要としてはOpenGLの標準機能の1つである2次元畳み込みフィルタを漸化式の各計算ステップにおける拡散の操作として転用することで、各領域の拡散の計算がハードウェアで並列化されるというアイデアとなっていた。下記のコードを見れば分かる通り、物理モデルを2次元畳み込みフィルタとして表現して標準機能に渡すことしかできず、今日的なGPGPUと比較すればブラックボックスな固定機能シェーダーに並列計算を任せるしかないため、全く自由が利かないことが分かる。またRGBの各色8bitを数値に割り当てるため、計算精度が重要な科学技術計算として8bitを超える精度で計算するためにはRGBの各色間での桁の繰り上がりなども実装する必要があったが、その際に大きなオーバーヘッドが生じて計算が非常に遅くなってしまうという問題があった。当時はIan Buck自身も、これらの実用に当たって許容できない制約を緩和するためには今後のグラフィックスハードウェアの進歩が必要であると述べている。#define k .2 // 拡散係数の定義/* 畳み込みフィルタの定義 */float filter[] = { 0.0, k, 0.0, k, 1-4*k, k, 0.0, k, 0.0};glConvolutionFilter2D(filter) // 畳み込みフィルタを設定glEnable(GL_CONVOLUTION) // 畳み込みフィルタを有効化glReadBuffer(GL_FRONT) // 読み込み側のフレームバッファ(1ステップの畳み込み計算における現ステップ(例えばtと置く)の値を保存するバッファ)glDrawBuffer(GL_BACK) // 書き込み側のフレームバッファ(1ステップの畳み込み計算における次ステップ(例えばt+1と置く)の値を保存するバッファ)... Draw any initial conditions ... // 任意の初期条件の描画glRasterPos(1,1); // ピクセル操作のラスター位置を(x,y)=(1,1)に設定/* 畳み込み計算の繰り返し実行 */while(1) { glCopyPixels(0, 0, Width, Height, GL_COLOR); glxSwapbuffers(dspy, wnd);}
1999年-2000年: GPUとプログラマブルシェーダーの登場


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:101 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef