アットウィキロゴ

MATLAB&CUDAで快適計算ライフ3

好評だった備忘録(個人的に)の続編です.

CUDA-MATLAB連携の例です.
データをグラボに載せたり降ろしたりは結構なオーバーヘッドです.
たとえばグラボ上で A*B+C の行列演算をしたいけど,A,Cは固定で,
BだけMATLABで変更しつつ演算したい…そんな時は…

  • static float *data_on_gpu = NULL;として,staticにポインタを確保する
  • 上記がNULLなら,cudaMallocでデータをGPU上に確保する
  • 関数から抜ける前にdata_on_gpuをfreeせず,そのままにしておく.
  • mexAtExitを使って,クリーンナップ関数を登録しておく.複数回登録しないように防止せんといかん?
  • クリーンナップ関数で,BをcudaFreeすべし!NULL設定を忘れずに.
  • BがNULLじゃない(前もって登録されている)なら毎回転送しないといけないA,Cのデータだけ,cudaMemcpyして,計算実行!

ここでポイントなのは,確保したメモリはmxMallocで確保したわけじゃないし,MATLABのメモリでもないので,
mexMakeMemoryPersistentでpersistentに登録しなくてもよい事.

上記の場合,Bがすでに転送されていれば,もう転送しない,といった感じでできるでしょう.
でも,本当なら自分の好きなタイミングで転送できるといいので,MATLAB上で,
ptr = RegistB(B);
Res = Calc_ABC(A,ptr,C);
とかやりたい処ですが,MATLABにポインタ型を渡すやり方がわからないので,
受け側のCalc_ABCでは整数であろうptrの値の型を無視して強引にポインタにキャストしないといけない気がします…

かといって,二つのスクリプトでextern等でアクセスできるようにしてもどのみち汎用性がないし…
結局
Calc_ABC(NULL,B,NULL);//A,CがNULLだとBを登録
Res = Calc_ABC(A,NULL,C);//BがNULLだと登録したBを使う
としていますが…

うまくやる方法はないんでしょうかね.
グラボ上のメモリを自分で管理するしかしょうがないですね.ラッパを作ってみるか.

本日の来訪者: -
昨日の来訪者: -
累積来訪者: -

おなまえ
こめんと


最終更新:2009年08月09日 23:30