GPGPU
[Wikipedia|▼Menu]
□記事を途中から表示しています
[最初から表示]

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とプログラマブルシェーダーの登場

続いて1999年GeForce 256の発売によってジオメトリエンジングラフィックスアクセラレータに統合した「GPU」という製品カテゴリが登場し、2000年11月9日にはアセンブリ言語で128個の命令のみ記述可能な原始的なプログラマブルシェーダーシェーダーモデル1.x)が登場した。2002年、GPUの固定機能シェーダーがプログラマブルシェーダーに置き換わったことでブレイクスルーが起きたと主張し、ムーアの法則を超える速度で進化するGPUのストリーム・プロセッサとしての未来を予感したIan Buckにより、再度GPUによるレイトレーシング計算の高速化についての論文が発表された[13]
2002年: シェーダーモデル2.0への進化

2002年12月20日のシェーダーモデル2.0の登場により、GPUのプログラマブルシェーダーで従来より遥かに長い命令長と浮動小数点演算が扱えるようになった直後の2003年頃からGPGPUが大々的に試みられ始め、2004年8月には世界初のGPGPU学会「GP2」(Workshop on General Purpose Computing on Graphics Processors)が開催された[14]


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

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