2010年7月16日金曜日

MATLAB MEXでCUDAを使う

GPU 関連のプログラミングでは大抵、C言語+αを使ってプログラムを書くみたいですが、データの処理や結果の可視化は普段使っている MATLAB のほうが楽です。

そこで、 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を修正する

MATLAB plug-in for CUDA と一緒に入手できるガイドラインにも書いてありますが、使用環境に応じて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 をパスが通っている場所に置かなければならないので注意してください。


とりあえず、ここまでの修正でサンプルが動くところまではいけたはずですが、
何か思い出したことがあったらまた追記します。