108ページの tex1Dfetch()
の説明がちょっと分かりにくい。次のように解釈した:
tex1Dfetch()
は関数のように見えるが、実は関数ではなく、コンパイラに組み込まれている機能である。その実装では、tex1Dfetch()
でアクセスするテクスチャが(リンク時や実行時でなく)コンパイル時に判明している―テクスチャ参照の宣言がコンパイラに見えている―必要がある。このため、tex1Dfetch()
を用いてテクスチャにアクセスするblend_kernel()
に例えば引数としてテクスチャ参照へのポインタを渡すことで入力バッファと出力バッファを切り替えることはできない。そこで今回のコードでは、テクスチャ参照2つをファイルスコープで(=関数の外で)宣言し、どちらのバッファを使うかをフラグdstOut
で指定することにした。
ただ、テクスチャ参照は左辺値のようだし(sizeof
できるしポインタも取れる)、tex1Dfetch()
も関数のようだ(ポインタを取ろうとすると overloaded function と言われる)。本の nvcc と自分が使っている nvcc で版が違うのかも知れない。
$ nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2010 NVIDIA Corporation Built on Thu_Nov_11_15:26:50_PST_2010 Cuda compilation tools, release 3.2, V0.2.1221
anim_gpu()
内で dstOut
を volatile としてる理由は謎。
あと、試しにテクスチャ参照をブロック内で宣言してみたら、どうも勝手に static
扱いになってるみたいだった。