CUDA BY EXAMPLE、とりあえずひと通りやってみた。 ただし OpenGL/GLUT は動かないので8章は飛ばした。 あと、使っている MacBook Air にはデバイスが一つしか載ってないから複数デバイスのところは読むだけ。
ストリームとワープのあたりがまだ理解できた気がしないので、さらに何かを読まなければいけなそうだ。
8章のサンプルコード、どれも問題なくコンパイルできるが、すべて Bus error で落ちる。Crash reporter のログによると、glGenBuffers
あたりで落ちているように見えるが…MacPorts で入れた mesa を使っているからよくないのだろうか。
OpenGL/GLUT はよく分からないので、とりあえず8章は飛ばすことにしよう。
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
扱いになってるみたいだった。