【CUDA】テクスチャメモリの使用方法 その1

CUDA入門
マウスコンピューター/G-Tune

テクスチャメモリ(TextureMemory) とは、グローバルメモリと同様に扱えるメモリです。

使用するメリットですが、スレッド内で連続したメモリ領域にアクセスした場合、 キャッシュが効くようなので グローバルメモリよりも高速化できる可能性があります。

ちょっとしたコードの追加で使えるようになるので、試しに使ってみましょう。

API

テクスチャメモリをバインドする際に使用するAPIです。以下は2次元で読み出すときに使います。
1次元や3次元で使用できるものもありますが、今回は省略します。

API名解説
cudaBindTexture2Dデバイスメモリにテクスチャメモリをバインドします。
cudaUnbindTextureテクスチャメモリのバインドを解除します。
tex2Dカーネル内で使用します。テクスチャメモリからデータを取得します。

コード例

コード例を示します。
こちらで示したコードを、テクスチャメモリ化しています。

【CUDA】ブロック・スレッドを2次元で使う
CUDAのスレッドは2次元で持つことができるので、その使い方の解説をします。

カーネルは以下の通り。

処理関数は以下の通り。

バインド時の引数でcudaCreateChannelDesc<int>を指定することで、tex2D使用時に4Byteを1要素として読み出すことができます。
int を unsigned char や short に置き換えると、1Byte,2Byteを1要素として読み出せるようになります。

速度比較

テクスチャメモリ使用時・未使用時のカーネルの処理時間を比較しました。
なぜか若干遅くなっていますね・・・どのようなケースで高速化されるかもう少し検証が必要そうです。

環境(CPU:Intel Corei7 8700 3.2GHz  GPU:GeForce GTX1070)

テクスチャメモリ未使用3.7msec
テクスチャメモリ使用4.3msec

とりあえず、高速にはなりませんでしたが、メモリ範囲外を読んだときに指定値で自動補完してくれたり、tex2Dのx,y引数に整数以外を指定すると補完値を返すモードがあったりして便利なので使う価値はあるでしょう。

補足

・読み取り専用なので、書き込みには使えません。
・メモリサイズは512byteでアライメントされている必要があります。(512の倍数)
・単一のテクスチャのオブジェクトが(CPU側の)複数スレッドから同時にアクセスされないように注意。
・X、Yどちらの方向のメモリにアクセスしてもキャッシュが効くようです。
・デバッグモードだと結構遅くなります。

作成方法のパターン2はこちら。

【CUDA】テクスチャメモリの使用方法 その2
テクスチャメモリ(TextureMemory)の使用方法のパターンその2を解説します。 こちらで解説する方法だと、動的にテクスチャのオブジェクトを生成したり、その他の設定ができます。
マウスコンピューター/G-Tune