如何在OpenCL内核中使用三维数组?

5

我是OpenCL的新手。我已经使用1-D数据处理过OpenCL内核。但是当我尝试传递一个3-D指针时,它无法构建内核。具体来说,我遇到了CL_BUILD_PROGRAM_FAILURE错误。以下是我正在尝试构建的内核的伪代码 -

__kernel void 3D_Test(__global float ***array)
{

x = get_global_id(0);
y = get_global_id(1);
z = get_global_id(2);

array[x][y][z] = 10.0;

}

有人能告诉我代码出了什么问题吗?提前感谢!


你应该检查构建日志,可以使用clGetProgramBuildInfo获取。 - Dr. Snoopy
你也可以看一下在OpenCL 1.1中支持的Image3D类型,它可以让你轻松地存储和传递3D数组。 - 3Dave
2个回答

6

这不是有效的OpenCL C代码(所以它不能编译),对于一个3D数组,你必须使用该数组的线性版本,只需创建一个适当大小的普通数组(sizeX * sizeY * sizeZ),并按如下方式进行索引:

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

另一种选择是使用clCreateImage3D创建一个三维图像。


0

在任何层面上,您首先需要确保数组有足够的空间...

您的数组如何声明或分配空间?


当我收到回复后,我会编辑答案,这样它就是一个“真实”的答案... :) - Macmade
@Macmade..我已经在主机代码中分配了它们。但我想知道在内核中使用3-D数组是否有问题。因为当我传递'*array'并使用'array[x] = 10'时,编译没有问题。语法有什么问题吗?我在OpenCL中找不到3-D数组的示例。 - andromida
具体来说,我遇到了“CL_BUILD_PROGRAM_FAILURE”错误 :( - andromida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接