OpenCL中的3D数组

时间:2011-05-06 18:43:39

标签: opencl

我是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);

这是正确的方法吗?如何将本地线程ID与3d数组一起使用?我曾将它用于2d数组:

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

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

谢谢,
萨扬

2 个答案:

答案 0 :(得分: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
  4. 为获取gidX,gidY和gidZ而编写的代码样本没有多大意义,索引的计算也是错误的。计算取决于3D矩阵的顺序。它应该看起来像:

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

    但是你应该先检查一下文档。特别是当地ID的工作原理没有很快解释。

答案 1 :(得分: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);
}