2

処理するデータがいくつかあり、各ブロックがデータの特定のサブセットを担当しています。

私のアプリケーションの性質上、このデータをテクスチャメモリに配置したいと思います。ただし、データが大きすぎて1つのテクスチャ参照に収まりません。

正しく理解していれば、複数のテクスチャ参照を持つことはできますが、テクスチャ参照の配列を持つことはできません。

各ブロックのデータの異なるサブセットを処理する必要があるため、(カーネルで)次のようなことを行うことを考えていました。

while(counter < 10000) {

 if(blockIdx.x == 0)
     foo = tex2D(tex0, x, y);

 else if(blockIdx.x == 1)
     foo = tex2D(tex1, x, y);

 ...

}

しかし、これは見た目が悪いだけでなく、発散の問題が発生しないかどうかもわかりません。

のようなことをする

texture<int, 2, cudaReadModeElementType> ref;

(..)

/* kernel code from now on */

if(blockIdx.x == 0)
    ref = tex0;

else if(blockIdx.x == 1)
    ref = tex1;

...

while(counter < 10000)
    foo = tex2D(ref, x, y)

また、テクスチャ参照はグローバルであり、スレッドにプライベートではないと私は信じているので、まったく正しくないようです。

他に選択肢はありますか?ありがとうございました。

4

1 に答える 1

1

可能であれば、テクスチャデータを単一のテクスチャに保持し、ハードウェアの制限内に収まるように、必要に応じて座標に変換を適用する必要があります。

それ以外の場合は、予測を介して複数のテクスチャ参照から選択できます。述語のない命令だけが実際にテクスチャメモリ参照を生成します。

CUDAハンドブックのtex1dfetch_big.cuサンプルは、ハードウェアでサポートされている27ビットインデックスを超えてアドレス指定を増やすために、これを行う方法を示しています。

https://github.com/ArchaeaSoftware/cudahandbook/blob/checkpoint/texturing/tex1dfetch_big.cu

于 2012-08-24T00:31:57.070 に答える