テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル


log

2012.07.10 考察:CPUとGPUの速度の関係

最近は色々考察していたことが多かったので、おまけにもう一つ考察メモを書いて
おこうと思います。こちらはCPUによる3D計算の話。かなり憶測な部分が多いので
冗談半分程度に読んでもらえれば幸いです苦笑。

最近のCPUであるIntel Corei7はHDグラフィックスという機能を用いてDirectX10.1
相当をサポートし、処理速度でいえばGeforce7の上位版もしくはGeforce8の下位版に
相当している訳ですが。これは従来のIntel CPUのように内臓GPUを搭載しているわけ
ではなくCPUで全て計算しているので、そのことを考えると「何でCPUでこんなに処理
できんの?」と思ったりした訳です。

まずGPUはCPUと比べて何故早いのかということについて考えてみると、GPUは複数の
ユニットを持ちそれらのユニットで並列に処理させており、なおかつベクトル処理を
まとめて1命令で実行できるように設計されています。つまりこれをCPUに置き換えると
マルチコア+マルチスレッド+SIMDということになる訳です。
Intel Corei7のSIMD命令は従来のSSEだけではなくAVXという256bit単位の処理
も可能となり、SIMDだけでいえばGPUと同等のはずです。問題はマルチスレッド処理
ということになります。Intel Corei7のコア数は8もしくは16なので「それらのスレッド全て
を使って並列に動作させ且つSIMDを使用した場合、ユニット数が16程度のGPUと同等
程度ということになるのでは?」と仮定し、ネットで調べてみたところ、Geforce7の
ユニット数は12-20程度とかなり似通っていることが分かりました。ということで、HD
グラフィックスはコア数が同程度のGeforce7の上位版と同程度の性能ということに
なるのではないかと思いました(CPU-GPU間転送とか考慮していない上にCPUには
GPUに無い処理スキップ用の機能があるのでアレですが)。
ちなみに最新のGPUのコア数は千幾つとかなので、CPUとGPUの差は縮まるどころ
か広がってます(そう考えると昔のGPUってそれほど大したものでもなかったんだなあ)。

将来的にコア数が32,64のCPUが登場した場合を考えてみると、Geforce8の上位版と
同等の性能になるのではないかと予想されます。
画像処理以外の計算もコア数分のスレッド+SIMDでかなり高速化するはずですが…
そんな大規模な並列処理って画像処理くらいだからなあ。とりあえず自前のレイトレー
サーを機会があれば高速化しようかなと思います。

2012.07.10 C++:DirectX11の話

前々から色々と試したいと思っていたDirectX11を今回ようやく試してみることにしま
した。とりえずここここを参考に、ポリゴンとテクスチャの描画やコンピュートシェーダを
実装してみたので、今まで使用していたDirectX9との違いと利点についてまとめて
みようと思います。

・デバイスロスト処理が不要
 他のサイトでも色々説明されてますが、デバイスロストしなくなりました。
 ただしGPUのドライバ更新時はロストするとかしないとか(まぁ実行中にドライバ更新
 する人なんてまずいないと思いますが)。
・D3Dデバイスが3つに分離
 従来のD3DデバイスがD3Dデバイス、デバイスコンテキスト、スワップチェインの3つに
 分離しました。具体的にはD3DデバイスがVRAMリソースの作成、デバイスコンテキスト
 がGPUに描画コマンドを発行、スワップチェィンがウィンドウへの描画を実行といった
 感じに担当が分かれています。何故こんな面倒なことになったのかというとこれは自分
 の予想なのですが、コードを見渡してみるとロード周りはD3Dデバイスを使用し、描画
 周りはデバイスコンテキストとスワップチェインを使用するといった風に見事に分かれて
 いるため、マルチスレッドで次のシーン読み込みを行っている場合従来のようにD3Dデバ
 イスをクリティカルセクション等で制御する必要がなくなっているのです。つまり、処理を
 高速化させるためにこういった分離がされているのだろうなと推察しました。
・Shader Model4.0
 SM4.0では従来のGPUの構造とは全然違うので、シェーダ命令数が無限です(
 ちなみにWebGLのGLSLも命令数が無限ぽいのでおそらくSM4.0以上で動作させて
 んだろうと思います。
・フューチャレベル
 WindowsVista以降ではDXGIという新しいシステムによってDirectX9,10,11での
 GPUへのアクセスを共通化できるようになったのでDirectX11SDKからはフューチャ
 レベルというものを使用してD3DデバイスをDirectX9.x,10,10.1,11のいずれかの
 モードで作成出来るようになりました。
 なので実は自分の環境はDirectX11に対応していないのですが、DirectX10.1で
 DirectX11SDKを利用している訳です;
・Compute Shader
 従来のシェーダは1プリミティブがシェーダに渡されて対応した1プリミティブを返すと
 いった感じでしたが、Compute Shaderでは構造化バッファという構造体のバッファを
 利用して任意の位置のデータを拾って来たり、任意の位置にデータを渡したり出来ます。
 つまりCPUで計算するのと同じように処理出来ます。更にこの恩恵はピクセルシェーダに
 も適応され、SM4.1,5.0ではピクセルシェーダでも一部の構造化バッファにアクセス
 出来るようです(この辺はまだ試していないので何とも言えませんが)。
 更に新しいDirectX11.1+SM5.1ではピクセルシェーダだけでなく全てのシェーダから
 もアクセス出来るようになるとのことで、GPUがCPUとほとんど同じような働きが出来る
 ようになるのではないかと思います。
 ちなみにCompute ShaderはいわゆるGPGPU用なので従来のパイプラインと同じ
 流れの中で処理するのではなく、Compute Shaderから開始してCompute Shader
 で終了する、いわば唯我独尊シェーダです笑。

パッと思いつく限りこんな感じです。ただ利点ばかりではなく欠点もそれなりにあるわけで。
例えばD3DX算術関数がサポートされていないので、D3DX算術関数を利用する場合は
D3DX10math.hとd3dx10.libを読み込んDirectX10の機能を借りなければならないです。
更にはHLSLコードも含めて、DirectX9とは仕様ががらりと違うのでDirectX9を一から
覚えるのと同じ位面倒だと感じました。なまじDirectX9の作法が頭に入っていると混乱
するみたいなところがあるので新しく触る方はお気を付けください。