dokyouのブログ -3ページ目

DirectCompute

GPGPUをWindowsでサポートする「DirectCompute」

まずは「GPGPUとはなんぞや?」をおさらいしよう

 GPUの高機能化にともない、GPUをグラフィックス処理だけではなく、汎用プログラムを動かしてさまざまな処理をさせようというのが、「GPGPU」(General Purpose GPU)のコンセプトだ。

現在のパソコンは、

CPUとGPUという

2つの頭脳を持っている

(PDC09資料より引用、以下同)

 例えば、GPGPUを利用すればCPUだけで処理するよりも、動画のエンコードやフォーマット変換(トランスコーディング)が高速化できる。 GPGPUに対応しているサイバーリンク(株)の変換ソフト「MediaShow Espresso」では、1920×1080のHDビデオをiPod用のビデオ(解像度640×360ドット)に変換するのに、CPUだけと比べると 40%ほど高速化されるという。もちろん、一概にすべての環境で40%高速化されるわけではないが、低速なCPUでもGPUを利用すれば、高速なトランスコードが可能になる。

現在のGPUは、

2万円以下の

グラフィックカードでも

1TFLOSの性能を有している

 GPGPUはCPUのように、どんなプログラムでも高速に動作するわけではない。GPUのハードウェアを考えれば、物理シミュレーションや金融シミュレーション、ビデオ変換処理など、並列性を生かして単純なデータを一括処理する用途に向いている。


DirectComputeを使えば、画像を高速にFFT(フーリエ変換)できる


GPUによるFFTの

性能計測結果。

DirectComputeで

GPGPUを使えば、

CPUだけに比べて2~5倍も速い

 最近のGPGPUの事例としては、長崎大学工学部と独立行政法人理化学研究所が、GPGPUを使ったスーパーコンピューターの開発で、IEEEのゴードン・ベル賞(価格性能比部門)を2009年末に受賞した事例が話題となった。このスーパーコンピューターは380台のGPUを接続して、 158TFLOPSを実現している。天文学や流体力学に使われている「階層化N体シミュレーションプログラム」に特化しているが、「地球シミュレータ」の 122TFLOPSを上回っている。

 GPGPUは、パソコンのパフォーマンスを大幅に向上すると期待されているが、肝心の対応アプリケーションがなかなか増えてこない。これは、 NVIDIAやAMDなどGPUによって、プログラミング方法が異なるためだ。アプリケーション開発者が両社のGPUに対応しようとすれば、まったく異なるアーキテクチャーを持つNVIDIAとAMD用のプログラムを2つ開発しなければならない。ただでさえ、GPGPUのプログラミングは難しいのに、市場環境を考えれば、両社のGPUに対応するのは大変だ。

 こうした状況を改善すべく、GPGPU用ソフトウェア開発のための標準化技術が各方面で開発されている。そこにマイクロソフトが提案する技術が「DirectCompute」だ。


DirectXにDirectComputeを追加

 マイクロソフトは、Windowsプラットフォームで使用するグラフィックス機能のAPI群として、DirectXを提供している。 DirectXはDirectX対応GPUと対になって、高速な2D/3Dグラフィックや高品質なテキスト表示(DirectWrite)などを実現しているのはご承知のとおりだ(関連記事 )。

 DirectXはグラフィック表示に特化しており、GPUでグラフィック以外のプログラムを動かすためのAPI群は用意されていなかった。そのため、今までNIVDIAやAMDが規定した独自のAPIが使われていたわけだ。しかしDirectComputeは、グラフィック中心のDirectXに統合した形で、GPUにプログラムとデータを送り込む仕組みを実現する。

 また、DirectComputeのプログラムは、HLSL(High Level Shader Language)というプログラミング言語を利用する。HLSLはC/C++と似たプログラミング言語だ。ただしC/C++と異なるのは、プログラムを中間言語として実行する点にある。NVIDIAやAMDのグラフィックドライバーが、HLSLの中間言語を自社GPU用のコードに変換して実行させる。そのため、GPUメーカーが異なったり世代が異なるGPUでも、同じコードのプログラムをさまざまなGPUで動かせる。

HLSL のコード例。

プログラミング言語としては、

C/C++に似ている

HLSL のプログラムは

中間言語

(Intermediate language)に

変換され、

GPUメーカー提供の

ドライバーで各GPUの

ネイティブコードに変換される。

中間言語を使うことで、

GPUメーカーの違いは

吸収される


当初DirectComputeは、「DirectX 11対応のGPUから対応」と言われていた。しかしマイクロソフトは2008年11月に開催されたハードウェア技術者向け国際会議「WinHEC 2008」で、「DirectX 10.1からサポートする」と表明した。これによりDirectX 10世代のGPUでも、DirectComputeが利用できるようになった。

 また、DirectComputeはWindows 7だけでなく、Windows Vistaでも利用できるようになった。ただし、VistaでDirectComputeを利用するためには、Windows Updateで提供されている「プラットフォーム更新プログラム」の適用が必要になる(関連リンク )。もちろんDirectComputeに対応したグラフィックドライバーも必要だ。ただ注意が必要なのは、すべてのDirectX 10世代のGPUで、DirectComputeが動作するわけではない(DirectX11世代GPUでは、DirectCompute対応が保証されている)。

DirectX 11では、GPUのマルチスレッド化を進化させている。マルチスレッド化により、グラフィック表示とDirectComputeを同時に動かしても問題が起きないようにしている


DirectX 11でのパイプラインの流れ

DirectComputeの普及はCPUとGPUの統合が進む2011年からか?

 本稿執筆時点では、市販されているDirectX 11世代のGPUは、AMDのRadeon HD 5000シリーズしかない。しかし2010年には、NVIDIAからもDirectX 11世代GPUが登場するだろうから、普及もそれなりに進み、DirectComputeを使ったアプリケーションが徐々にリリースされると期待される。

 DirectComputeは最初のうち、ビデオのエンコード/トランスコードなど、ビデオ関連のアプリケーションで使われるだろう。その後は Adobe PhotoshopやIllustratorなど、現在はGPUメーカー固有のAPIを使っている写真編集/グラフィックソフトでも使われるとみられる。

 グラフィック分野以外の用途では、アンチウィルスソフトのカスペルスキー・ラボ社が、GPGPU技術でウィルススキャンを高速化するアイデアも検討しているという。またゲームなどでは、NPC(コンピューター操作のキャラクター)の行動を、GPGPUで計算するようになるかもしれない。同種の技術はすでに、プレイステーション3用ゲームで活用されている。

 さらに2011年には、AMDがCPUにGPUを統合した「APU」(Accelerated Processing Unit)、コード名「Llano」をリリースする(関連記事 )。またインテルでも、計画は仕切り直しになったが「Larrabee」のようなデータ並列ユニットを、CPUに取り込むことを考えている。Windows 7登場で一気にDirectComputeが普及する……とはいかないかもしれないが、2年後にCPUがGPGPUの機能を取り込むようになれば、より多くの対応アプリケーションが登場することだろう。

Microsoft DirectX

Microsoft DirectX(ダイレクトエックス)は、マイクロソフト 社が開発したゲーム およびマルチメディア 処理用のAPI の集合である。

DirectXコンポーネントのうち、グラフィックスを担うDirectX GraphicsはMicrosoft Windows 、Xbox 、Xbox 360 向けのゲーム 開発で広く利用されている。DirectX互換のビデオカード を利用することにより、高品質の3Dグラフィックスを高速にレンダリング できるため、DirectXはこれ以外のソフトウェア産業、特にエンジニアリングの分野でも広く利用されている。

DirectXのランタイムライブラリ とSDK は、いずれもマイクロソフトのウェブサイト から無償でダウンロードできるが、プロプライエタリ でソースコード は非公開である。DirectXはWindowsに含まれているが、最新版をウェブサイトからダウンロードすることが可能である。

2009 年 11月現在の最新バージョンは、DirectX 11.0である。これは、Windows 7 に同梱されており、Windows Vista においてはWindows Updateを通じて入手可能である。(DirectX 10以降は、Windowsのグラフィックアーキテクチャに大規模な修正が加えられた事と、Windows Display Driver Model が導入された事から、Windows XP などの旧Windows製品では利用できない。)

FLOPSとGHz

Hzは元々振幅を表す単位でヘルツ(周波数単位)といいます。例えば、電気のコンセントの交流電流は50Hz/60Hzで一秒間に電流が正負に50回または60回振幅しています。これは、ゆとり教育でどうなったか分かりませんが、小学校~中学校の理科で習う項目です。オシロスコープなどを使うかな?

パソコンでいう動作周波数(正確にはクロック周波数と言います)は、この振幅を1秒間に何回するかを表した物です。それが性能にどのように直結するかというと、これは電気の流れだと思えば分かりやすいのです。
周波数の山や谷のどちらかまたは両方のエッジ(波頂点か谷の頂点)、一定量のデータをサーフィンで波にのっているかのように載せるのです。
波が小刻みであればその波にのって大量のデータが一秒間に運ばれます。

例えば、1GHzで1Hz辺り64bit(8バイト)のデータを転送できる64bitバスのプロセッサなら、2GHzで16GBの情報を1秒間で扱うことができます。実際には周波数は最大値ですか、波に乗り遅れたり、データが乗った波をうまく計算部で演算できず破棄される(遭難する)ケースもありますけどね。

即ち、まったく同じ構造のCPUなら性能の指標になります。(違う構造だとロスの数やバス幅が異なる場合がありますから、性能指標になりません)
ただ、どれだけ転送できるかであり、どれだけの計算が出来ているかではないので、他のプロセッサと比べられないのです。

flopsはFloating point number Operations Per Secondの略で、1秒間(Per Second)に浮動小数点演算(Floating Point nunber/FP)をどれだけできるか(Operating/操作や制御の意訳)を指します。
flopsが1であれば、1秒間に1回。10なら10回です。1000回なら1Kflops(キロフロップス)、100万回なら1Mflops(メガフロップス)、10億回なら1Gflops(ギガフロップス)となり、1兆回なら1Tflops(テラフロップス)、1000兆回なら、1Pfops(ペタフロップス)となります。

これは、FPU(浮動小数点演算装置)の性能を測るためのもので、既に枯れつつあるALU(整数演算装置)の性能指標ではないことに注意してください。同じFPUでもインテルCPUの場合は、SIMDを利用するため、32bit単精度と64bit倍精度で数値が2倍(または1/2)に変化します。
単精度であれば、2コアがフル稼働すると仮定した場合に、3GHzでCore2は倍精度24Gflopsを達成できます。(クロックの4倍×2コア)
単精度なら、その1/2になります。
Core2はスカラ型の演算ユニットを利用する特性上、実際の実行クロックはそれより低くなります。

尚、これらの演算性能はOSやミドルウェア、アプリケーションなどの土俵が最適化されていての話です。例えば、Cellを使うPS3が200Gflops を扱えるCPUでも、実際のソフトでそれを活用できるものの開発には時間が掛かりました。そのため、数字上の理論値や実行値と本当に業務に有用なソフトを使う上での性能は必ずしも比例するとは限りません。まあ、x86に関しては、同じプロセッサの延長線上にあるので、新しいほど高速化しますけどね。