CUDAにはデバイスエミュレーションモードがあるのでCUDA対応GPUがなくてもプログラムの実験ができます。というお話。
- 導入環境
- WindowsXP 64bitEdition
- RadeonX1600PRO
- VisualStudio2005SP1
無茶をするなと。
以下導入メモ:
- http://developer.nvidia.com/object/cuda.html]から開発に必要なものを入手する。具体的にはCUDA ToolkitとCUDA SDK。32bitとか書いてあるけど気にしない。
- ToolkitとSDKを導入。特に文句は言われない。
- Toolkitは C:\CUDA に導入されたのを確認。
- SDKは C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK に導入されたのを確認。
- Tookit導入時にご丁寧に C:\CUDA\bin にパスが通されていることに気がつく。いきなりnvcc.exeを実行可能。
- 適当なサンプルCUDAプログラムを準備。今回は自前の超単純なプログラムを利用することにする。
- nvccでコンパイルしてみるが、エラー。ヘッダファイルが見つからない旨を伝えられる。
- nvcc cuda.cu
- エラーメッセージを参考に、Program Files以下のMicrosoft Visual Studio 8\VC\includeとNVIDIA Corporation\NVIDIA CUDA SDK\common\incをインクルードパスとして指定することにする。
- nvcc cuda.cu -I”C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include” -I”C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK\common\inc”
- ヘッダファイルが見つからない旨は消えたが、clが無いといわれる。
- clと言ったらVCのアレなので、C:\Program Files (x86)\Microsoft Visual Studio 8\VC\binにパスを通してみる。
- 今度はmspdb80.dllが見つからないと怒られる。適当にファイル検索し、C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\IDEに見つけたのでパスを通す。
- LINKエラー、libcpmt.libが開けないらしい。nvcc実行時引数に-Lオプションか。
- C:\Program Files (x86)\Microsoft Visual Studio 8\VC\libにターゲットを捕捉。-Lオプションを追加する。
- nvcc cuda.cu -I”C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include” -I”C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK\common\inc” -L”C:\Program Files (x86)\Microsoft Visual Studio 8\VC\lib”
- __imp__cutCheckCmdLineFlag@12の未解決エラー。ライブラリのリンク不足なのは自明。名前からして恐らくcutilライブラリ。
- C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK\common\libにcutil32.libを発見。-Lと-lのオプションを追加する。
- nvcc cuda.cu -I”C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include” -I”C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK\common\inc” -L”C:\Program Files (x86)\Microsoft Visual Studio 8\VC\lib” -L”C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK\common\lib” -lcutil32
- nvcc成功。しかし実行すると今度はcutil32.dllが無いと怒られる。ああそうか、dll使ってるのか。パス通ってないんだな。
- C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK\common\libにdllを捕捉、パスを通す。
- 実行。There is no device supporting CUDA.で止まる。そりゃそうだ、Radeonだし。
- デバイスエミュレーションに望みを託す。nvccに-deviceemuオプションをつけてやればOK。
- nvcc cuda.cu -I”C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include” -I”C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK\common\inc” -L”C:\Program Files (x86)\Microsoft Visual Studio 8\VC\lib” -L”C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK\common\lib” -lcutil32 -deviceemu
- 実行。ちゃんと動く。
- ちなみに-deviceemuの有無でバイナリサイズは変わらず。動的リンクだからでいいのかな。
というわけで無事実行に成功。
DirectXのREFみたいにnativeとemulationでできることできないことに差が生じる可能性は否定しないけど、その辺は追々ということで。