2011-05-06 5 views
1

私はOpenCLプログラミングの新人で、入力は3D配列です。インデックスを次のように計算しています。OpenCLでの3D配列

int gidX = get_global_id(0)?1:get_global_id(0); 
    int gidY = get_global_id(1)?1:get_global_id(1); 
    int gidZ = get_global_id(2)?1:get_global_id(2); 


    int index = gidX + (gidY*SizeX) + (gidZ*SizeY*SizeZ); 

これは正しい方法ですか? 3D配列でローカルスレッドIDを使用するにはどうすればよいですか?私は2D配列で次のように使用していました:

int tid = get_local_id(0); 
int gid = get_global_id(0); 
int index = tid + gid*width; 

そして、3Dボリュームにimage3d_tタイプを使用する方法はありますか?あなたが必要とするように見える何

おかげで、
サヤン

答えて

1

3D配列をメモリに線形化する方法によって異なりますが、Rickの答えはインライン関数としてコード化されているとうまくいきます。可能であれば、ローカルメモリにプリフェッチすることもできます。

/* Visualize as a cube. You are looking at the front in x,y coordinates. Z is depth. You have stored it by starting at (x=0, y=0) and taking the depth z lists of elements one by one and placing them in a contiguous array.*/ 

//Inline this 
int matrix3D_lookup(int x, int y, int z, int sizeZ, int sizeX){ 
     return   z+ sizeZ*x +(sizeZ*sizeX*y); 
} 
3

は、機能性とOpenCLの作業の原則に関するいくつかの基本的な情報です。以下のリンクをご覧下さい:

  1. http://developer.download.nvidia.com/compute/cuda/3_2_prod/toolkit/docs/OpenCL_Programming_Guide.pdf
  2. http://www.nvidia.com/object/cuda_opencl_new.html
  3. http://developer.download.nvidia.com/compute/cuda/3_0/sdk/website/OpenCL/website/samples.html

あなたのコードのあまり意味がありませんGIDX、gidYとgidZを取得するためのサンプルとの計算インデックスも間違っています。計算は、3D行列の順序に依存します。

int index = x + y * sizeX + z * sizeX * sizeY; 

ただし、まずドキュメントを確認する必要があります。特に、ローカルIDの動作原理はすぐに説明されません。