我是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卷?
谢谢,
萨扬
答案 0 :(得分:3)
您似乎需要的是有关OpenCL的功能和工作原理的一些基本信息。请查看以下链接:
为获取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);
}