2016-03-25 18 views
0

こんにちは私はopenCLにかなり新しく、多次元配列のインデックスを作成しようとすると問題が発生しました。私が理解するところでは、グローバルメモリに多次元配列を格納することはできませんが、ローカルメモリで可能です。しかし、私は2Dのローカル配列にアクセスしようとすると常に0に戻ってきます。私はhttp://www.notebookcheck.net/NVIDIA-GeForce-GT-635M.66964.0.htmlで私のGPUを見て、私は0の共有メモリを持っていたことがわかりました。私のプログラミング経験で共有メモリの他の制限は0になりますか? 私は直面している問題の小さな簡単なプログラムを投稿しました。 入力は= [1,2,3,4]であり、これを2D配列に保存したいと思います。共有メモリを持たないopenCLの多次元配列ですか?

__kernel void kernel(__global float *input, __global float *output) 
    {//the input is [1,2,3,4]; 
     int size=2;//2by2 matrix 
     int idx = get_global_id(0); 
     int idy = get_global_id(1); 

     __local float 2Darray[2][2]; 
     2Darray[idx][idy]=input[idx*size+idy]; 
     output[0]=2Darray[1][1];//this always returns 0, but should return 4 on the first output no? 
    } 
+0

ノートブックのリンクで参照されている共有メモリは、NVIDIA GPUの計算のコンテキストでは「共有メモリ」とは関係ありません。あなたのGT-635Mは確かに "共有メモリ"、すなわちOpenCL *ローカルメモリ*を持っています。これをOpenCL呼び出しで確認して、[clGetDeviceInfo()](https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetDeviceInfo.html)などのデバイスプロパティを取得することができます。 )on 'CL_DEVICE_LOCAL_MEM_SIZE' –

答えて

0
__local float 2Darray[1][1]; 

1つの要素高い、広い1つの要素です。

2Darray[1][1] 

は存在しない第2行第2列である。

ローカルメモリをエラーなく使用できる場合でも、グローバルメモリに流出し、ローカルメモリスペースに適合しない場合はvramの帯域幅と同じくらい遅くなります。

レース条件:

output[0]=2Darray[1][1]; 

各コアが同じ(0)、インデックスへの書き込みしようとしています。追加すると、1スレッドのみがそれに書き込む前に、追加する。

barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE); 
if(idx==0 && idy==0) 

しかし、これにはまだそれ以前の同期命令が必要です。

+0

whops小さなタイプミス今すぐおかげでそれを編集! – Fluffy

+0

編集された回答。最後まで見てください。 –

+0

これは私のためにいくつかのものをクリアしてくれてありがとう! – Fluffy