2011-05-06 53 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?我用它与二维阵列作为:

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

而且,有没有办法,我可以使用image3d_t类型为我的3D卷?

感谢,
萨扬

回答

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的工作原理不能很快解释。