そこで、 CUDA な MEXファイルを作って MATLAB で使う方法を試してみました。
結構簡単ですが、ハマるところがいくつかあったので記録を残しておきます。
現在僕が使っている環境は
- Windows 7 (64bit)
- MATLAB 2010a (64bit)
- CUDA 3.1 (64bit)
- Visual Studio 2008 Professional
なので、参考にするときは注意してください。以下順にハマったところを挙げていきます。
64bitのコンパイラをインストールする
これはCUDAに限りませんが、mexファイルのコンパイルにVisual C++を使う際、64bitの環境では64bit用のコンパイラをインストールしておく必要があります。VS2008では64bit用のコンパイラはデフォルトではインストールされません。また、Express Edition には64bit用のコンパイラが含まれていないようです。
最新版のMATLAB plug-in for CUDAを入手する
このページで右側のフォームに住所氏名などなどを記入するとダウンロードできるのが最新版です。
こっちのページでダウンロードできるのは古いバージョンです。(古いMATLABだとこっちを使うべきなのかもしれません。)最初新しいバージョンは非公開と勘違いしていました・・・
ちなみに日本語版のサイトには新しいバージョンへのリンクすら存在してないようです。
nvmex.mを修正する
Host_Compiler_Location = '-ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin"';
としました。ソースファイルで変更しろと書かれているのはここだけですが、実際にはあといくつか修正が必要で、下のほうの nvccCommandLine を作る部分で、インクルードファイルのパスを指定している部分にダブルクォーテーションが抜けてるバグがあります。Linux環境では問題が発生しなくて見逃したのでしょうか?あと、ついでにCUDAのサンプルでよく使われているcutilを使うためのヘッダファイルのパスも追加しておきます。
' -I"' matlabroot '\extern\include" ' ... ' -I"C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\common\inc"'...
これに対応してリンカのオプションも mexCommandLine の作成の部分に追加しておきます。
mexCommandLine = ['mex (''' filename '.o' ''', ''' '-L' CUDA_LIB_Location ''', ''-LC:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\common\lib''' ', ''-lcudart'', ' '''-lcutil64'')'];
あと、cutilを使っているプログラムを実行する際には cutil64.dll をパスが通っている場所に置かなければならないので注意してください。
とりあえず、ここまでの修正でサンプルが動くところまではいけたはずですが、
何か思い出したことがあったらまた追記します。
とりあえず、ここまでの修正でサンプルが動くところまではいけたはずですが、
何か思い出したことがあったらまた追記します。