2011年3月1日火曜日

とりあえずひと通り

CUDA BY EXAMPLE、とりあえずひと通りやってみた。 ただし OpenGL/GLUT は動かないので8章は飛ばした。 あと、使っている MacBook Air にはデバイスが一つしか載ってないから複数デバイスのところは読むだけ。

ストリームとワープのあたりがまだ理解できた気がしないので、さらに何かを読まなければいけなそうだ。

8章のコードは動かず

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 扱いになってるみたいだった。