CUDAのカーネル関数でprintfを使う

カーネル関数でもprintf()が使えるようになったのに全然使ってこなかったので、
折角なのでためそうとCUDAプログラミングガイドのソースをそのまま持ってきてコンパイルしたら・・・

error: calling a host function from a __device__/__global__ function is not allowed

って言われたorz
バージョンもnvcc3.2でprintf()が使えるって書いてある。
GPUもFermiを使ってるのになんで?ってなった時のメモです。

環境

  • SUSE Linux Enterprise Server 11 SP1
  • Tesla M2050
  • nvcc 3.2

解決策

ためしに参考資料のCUDAプログラミングガイドの中のB.14 Formatted Outputの部分にあるサンプルをそのままコンパイルしているのにダメだったのでなんでかなぁと参考資料のあたりを読んでいると、どうやらコンパイルするときに
nvccのオプションに-arch=sm_20か -arch=sm_21をつけないとダメなそうな。
実際に付けてみるとコンパイルは通りました。

cuda-gdbもあるし昔と違って大分カーネル関数の部分のデバグが楽になったなぁ