2012-04-27 8 views
3

私はparallel.gpu.CUDAKernelを使用して、Matlab 2011aでCUDAカーネルを起動しています。私は同じgpuArrayをループ内の後続のカーネルの起動で実装するようにコードを設計しましたが、それぞれの起動はgpuArrayの一意のセグメントに限定されています。MatlabでのCUDAカーネル起動時のgpuArrayデータの維持

実行が終了するまでには、アレイ全体が一杯になる必要があります。しかし、gather()を使用してメモリをホストに戻すと、最後のカーネルの起動時に書き込まれたメモリだけが正しいことになります。それ以外は空白です。これは真ん中のどこかでループから脱出する場合にも当てはまります。

カーネル反復を示すフラグを渡すことで、これが実際に行われていることを確認しました。それが最初の繰り返し以外のものであれば、カーネルは何もしません。しかし、後続のカーネルは何もしなくても、最初のカーネルによって書き込まれたデータの場所はまだ空です。私が最初のカーネルを起動した直後にループから抜け出すと、これは当てはまりません。

このように、Matlabはカーネルの起動の間にgpuArrayをリセットしているようです。それを防ぐ方法はありますか?

+0

Parallel Computing ToolboxのgpuArrayはあまり機能しません。あなたはジャケットを使う方が良いです。私がジャケットに取り組んでいるので私が偏っている間、私はあなたがgpuArrayであなたの時間を無駄にするべきではないと言ったときに冗談ではない。ジャケットを使用しない場合は、CPUに固執したり、自分のCUDAコードを書くのが良いでしょう。 – arrayfire

+0

それは素晴らしい製品のようです。残念ながら、学生である私は私の大学が提供するフリーソフトウェアとソフトウェアに限られています。今のところ私は代わりにmexインターフェイスを書こうとしています。 – Richard

+0

いいですね。あなたがジャケットを購入するようにIT部門に伝えるメモを送ると、そうするかもしれません。実際に、彼らはすでにジャケットのライセンスを持っているかもしれません(ほとんどの大学では現在いくつかのジャケットライセンスがあります)。 – arrayfire

答えて

2

feval呼び出しの出力をキャプチャすれば、これはうまくいくはずです。その後

__global__ void setOneEl(double * array, double val, int element) { 
    array[element] = val; 
} 

、MATLABに以下のコードを実行すると、私はあなたが後にしていると考えているように動作します:このような些細なカーネルを考えてみましょう通常のMATLABの意味と一致するように

>> k = parallel.gpu.CUDAKernel('kern.ptx'); 
>> g = parallel.gpu.GPUArray.zeros(1,10); 
>> for ii = 1:2:10, g = k.feval(g, rand, ii); end 
>> gather(g) 
ans = 
     0 0.0975   0 0.2785   0 0.5469   0 0.9575   0 0.9649 

gpuArrayオブジェクトの値がありますしたがって、gpuArrayインスタンスを変更する場合は、他のMATLABデータ型の場合と同じように、出力値を同じ配列にキャプチャする必要があります。ただし、CUDAKernel.fevalコールは、結果を同じ変数に取り込むときに理解し、インプレース最適化を使用してコピーを避けることができます。

関連する問題