ラベル GPUコンピューティング の投稿を表示しています。 すべての投稿を表示
ラベル GPUコンピューティング の投稿を表示しています。 すべての投稿を表示

2011年4月23日土曜日

CUDAにしようか

しばらく放置されていたGPUコンピューティングですが,機会があって遊んでみることになりました.

DirectComputeを直接使って計算するにはHLSL(High Level Shading Language)を使って開発することになるのですが,(多くの場合)そこで問題が発生します.

まずdoubleでの開発が予想以上に難しい...というのも,組み込み関数はdoubleに対応していないのです.(私の実力不足と言えばそれまでですがorz)

たとえば指数関数を使おうとすると,ご存知の通りマクローリン展開などで適当に実装するわけにはいきません.加えて,乱数が必要な計算の場合には(基本的に)自分で実装することになりそうです.noiseという疑似乱数生成用の組み込み関数はありますが,少々ヤバそうです.(グラフィクス関連の用途には便利だそうですが)

結果的に,HLSLでの開発は断念ということに.代替手段としてCUDA(NVIDIA),あるいはATI Stream(AMD)などがあります.

新しくグラボを購入するほどではなさそうなので,CUDAを使ってみよう!

2010年9月9日木曜日

DirectComputeの注意点

ComputeShaderの基本でシェーダの基本的なことは分かったが,実用に供するにはまだ足りないようだ.

ドライバのタイムアウト

Windows Vistaでは,GPUが2秒(既定)以内にタスクを終わらない場合,ハングと見なされてGPUのハードウェアの状態がリセットされます.(WDDM によるタイムアウトの検出と GPU の回復

計算にどう影響するかはわかりません.

ShaderModel 5.0の制約

Shader Modelのバージョン,シェーダの種類毎に色々と制限がある.(High Level Shader LanguageHYPERでんち(shadermodel)

仕様書とか見つけられないTT

ただ,DispatchするときのX * Y * Z・スレッドグループ数・シェーダのコードのサイズ,の積がある大きさを超えると正しく動作しなくなるようである(?)
プログラマブル・シェーダによる積極的なGPUの活用にもループ回数を大きくできないということが書かれている,関係あるかも.

2010年9月4日土曜日

ComputeShaderの基本

大体の使い方は,以下のようなものを見ればわかる.

私の場合は,SlimDXをC#から使用して,ソフトを組むことにした.実際に計算するコードはHLSLを使って書かなくてはならないが,C言語チックな仕様なので何とかなるだろうと思う.因みに,Direct3Dを使うのはこれが初めて.

スレッド・グループ

スレッドグループについてはここ(MSDN)を見ると分かりやすく説明されている.また,Dispatchする際のスレッドグループ数はMSDNにはX,Y,Zそれぞれが65535以下であると記されている.(私の環境では,X = Y = 65535, Z = 1 の場合正しく動かないようだが,それついては特に記述がないような)

スレッドグループのサイズは,SDKのサンプルでは(1,1,1)となっている.しかしながら,この設定はパフォーマンス的によろしくないので,適度に大きくしたほうがよい.大きくしすぎるのもよくない.(設定の目安とかはよくわからないですorz)

Shader Resource View(SRV)とUnordered Access View(UAV)

Resource Viewとはリソースのデータ(バッファ)へのアクセス方法を規定するもので,1つのリソースに対して複数のViewを作成できる.

演算シェーダのデータの入出力には,このResource Viewを用いる.演算シェーダにデータを渡す方にはSRV,演算シェーダの結果を書き込む方にはUAVが使われる.

SRVはRead-Onlyであり,シェーダ内で書き換えることはできない.また,同じリソースを同時にSRV・UAVの両方としてシェーダに渡すことはできない.

UAVはランダムアクセス(Unordered Access)をするためのResource Viewであり,ReadまたはWriteのアクセスが可能である.ただし,連続したメモリ領域に書込むようにした方が効率的である.また,読み書きを同時に行う場合にはRAW(read-after-write) hazardに注意.

参考:Introduction to a Resource in Direct3D 11DirectX 11 DirectCompute: A Teraflop for EveryoneBest Practices for DirectX 11 Development

Structured BufferとRaw Buffer

Structured Bufferは同じサイズの要素(構造体)の配列である.一方,Raw Bufferというのは,Byte Address Bufferのことであり,バイト・オフセットを使ってデータにアクセスするものである.詳細については,New Resource Typesを確認する.

初めに紹介したSDKサンプルのシェーダのコードを見てもわかるとおり,Structured Bufferを使うと楽にアクセスできる.

2010年9月3日金曜日

DirectComputeを選択した理由

GPUコンピューティングを行うに当たっては,DirectCompute・CUDA・OpenCLなど様々なアプローチがある.その中からDirectComputeを選んでみた理由をメモしておく.

  • DirectComputeを使うことは,DirectXの枠組みの中でGPUコンピューティングを行うことである.
    • 「Support for multiple vendors」先行き不透明な時代には嬉しい.
    • 今後XBOXでDirectComputeが使えるようになれば,非常に安価に計算機を手に入れることが可能になる?
    • 演算結果の可視化をするにあたって,他のアプローチより少しだけ楽かもしれない?
    • もしかするとWindows Phoneでも使えるようになる?
  • グラフィックカードを使うのは,ゲームとかCADがメインだと思う.ゲームはDirectXが多いし,有名なCADのソフトもDirectXを採用している.多くの人に使われるものが一番よくなっていくのではないだろうか
    (数値計算ではCUDAが多いように思われるが・・・)

※CUDAの方が倍精度浮動小数点を使った計算の関数は整っていたりするし,「このアプローチが一番素晴らしい!」というのは難しい.半分以上趣味の問題かもね

CPU・GPUの将来についてはIntel・NVIDIA・AMDが模索中といったところのようだ.数年後には,GPGPUなんて言葉は死語になっているかもしれないし,黄金時代を迎えているかもしれない.

GPGPUがあるからといって,用途の異なる従来型スーパーコンピュータの予算が削られないよう願いたい.

2010年8月30日月曜日

GeForceでGPGPUをするには

DirectComputeで倍精度浮動小数点演算をまともに行うためには,DirectX 11 Shader Model 5.0に対応したGPUが必要.GeForce系のグラボを使おうと思ったのだが,公式の製品紹介に載っているカタログスペックだけで選んではいけないらしい.

Fermiバージョン2と言えるGF104の正体の解説によるとGTX460に載っているGF104はあまり倍精度浮動小数点計算には向いていないようだ.その1つ前のバージョン(?)のGF100の方がよいらしい.ちなみにダイの意味
GF100はGTX465,470,480に載っている.(NVIDIA,GF100の製品名を「GeForce GTX 480&470」に決定“扱いやすいFermi”がようやく登場か。GeForce GTX 465を試す

GeForce GTX 400 Architectureのページに白書があり,さっきのページと同じようなことも書いてありました.製品紹介ではなく,こういうのを見ればいいのか~

GPGPU (CUDA) 性能を比較・検証してみたを見ると,今のところ練習用にしかならない気がする・・・
とはいえ,GTX 460ですら並みのCPUでは勝てないし,コストパフォーマンスはよい.(もちろん計算の内容によってはこの限りではない)

NVIDIAは今回倍精度の演算性能を確保しきらなかったらしいので,次回作に期待したいですね.