忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

C#でOpenCL入門 (OpenCLNet版) コマンドキュー

コマンドキュー

こちらも合わせてお読みください。
今回はコマンドキューの生成と破棄を行います。
残念ながら前回に引き続き今回もサンプルプログラムは画面に何も出力しません。

コマンドキューとは、GPUに対する操作をカプセル化したオブジェクトです。
たとえば、GPU内のバッファにデータを書き込んだりそこから読み込んだり、データに対して計算を行ったりといった感じです。
オリジナルのOpenCLではこういったメソッドのほとんど全てが非同期でした。
おそらくOpenCLNetもそうでしょう。


拍手[0回]

PR

C#でOpenCL入門 (OpenCLNet版) コンテキスト

コンテキスト

こちらも合わせてお読みください。
前回はGPUやCPUといったハードウェアを司るデバイスオブジェクトを扱いました。
しかし実はデバイスオブジェクトでは大したことはできません。
そこらへんXnaやDirectXに似ていますね。

そこで登場するのがこのコンテキストオブジェクトです。
コンテキストはひとつ以上のデバイスをまとめるオブジェクトです。
OpenCLに必要なGPUを動かす命令、メモリ領域などは全てこれを通して作ります。


拍手[0回]


C#でOpenCL入門 (OpenCLNet版) デバイス

デバイス

こちらも合わせてお読みください。

今回のテーマはデバイスです。
OpenCLではデバイスとはGPUかCPUのことです。
OpenCLで並列計算しようと思ったら、デバイスを列挙しなくてはいけません。
(プラットフォームのところでも同じようなことを言ったような気もしますが、プラットフォームはソフトウェアで、デバイスはそれで動くハードウェアということだと思います。)


拍手[0回]


C#でOpenCL入門 (OpenCLNet版) プラットフォーム

OpenCLNet

以前、C#でOpenCLを使った記事を書いたのですが、Deep Learningの重さに耐えかね、復習することにしました。
OpenCLはGPUというグラフィックス表示用のハードウェアを普通の計算に利用しようというものです。
結構速くなるようです。
そして最近人工知能の世界で流行りのDeep Learning、これが重くて重くて仕方がありません。
この2つを組み合わせない手はないでしょう。

しかしP/InvokeでOpenCLのラッパーを書いて…というのは面倒なので、今回はOpenCLNetという物を使おうと思います。
これならC#から簡単にOpenCLが使えるようです。


拍手[0回]


C#でOpenCL入門 チュートリアル一覧

 C#でOpenCLを使うシリーズの一覧をまとめます。
まだメモリフェンスだとか重要な機能を説明していないような気もしますが、どうもいじってみたところ、使わなくてもそれなりのことが出来るような気がします。
(メモリフェンスがなければ失敗するようなプログラムを書こうとしたのですが、仕様にない動作?により上手く動いてしまいました。環境によるのかもしれませんんが)

というわけでここで一区切り。
全部で12の記事になりました:

  1. プラットフォーム
  2. デバイス
  3. コンテキスト
  4. コマンドキュー
  5. バッファ
  6. プログラム
  7. カーネル
  8. データ並列
  9. コンパイルエラー捕捉
  10. グループID、ローカルID
  11. 非バッファ引数
  12. スレッドとグループの個数

感想

以前、似たような技術であるDirectX11のコンピュートシェーダーを扱いました。
それと比べるとOpenCLは簡単かつ柔軟な印象を受けました。

まずインターフェースが綺麗です。
DirectXではなんだか初期化が面倒くさいですがOpenCLはそんなことはありません。
まぁ「そんなことはありません」というと正確ではないかもしれませんが、グラフィックスは無視してGPGPUだけを考えているためか、ましなほうです。
また、スレッドグループのスレッド個数もDirectX11ではHLSLにハードコーディングしなくてはいけませんが、OpenCLではCPU側から柔軟に変更できます(意味があるかはあまりわかりませんが、柔軟といえば柔軟です)。

というふうにOpenCLのいいところだけ書きましたが、APIがC言語で書かれているので、C#との相互運用がちょっとめんどくさいですね。
誰かC#用OpenCLラッパーライブラリを書いてくれればだいぶ使いやすくなりそうです。

APIもラッパーを書きやすいタイプな気がします。
Managed Wrapper for OpenCLなんてのが出たらいいんですけどね。

拍手[1回]