Add*_*ddi 5 arrays opencl multidimensional-array
非常直截了当的问题:如何使用2D数组作为OpenCL内核参数?
常识建议使用
__kernel void main(__global <datatype> **<name>),
然而编译器似乎并没有被这个想法所逗乐:
kernel parameter cannot be declared as a pointer to a pointer.
我是在监督明显的,或者究竟是什么,我在这里做错了什么?
编辑:
hosts(c ++)数据结构如下所示:
vector<vector<Element>>,
其中Element是一个结构,包含同一个数组中子节点的索引.基本指针.
您需要将2D阵列缩小为一维阵列.
主办:
int array[50][50];
int * ptr_to_array_data = array[0];
int width = 50, height = 50;
cl_mem device_array = clCreateBuffer(/*context*/, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, 50 * 50 * sizeof(int), ptr_to_array_data, /*&err*/);
clSetKernelArg(/*kernel*/, 0, sizeof(cl_mem), &device_array);
clSetKernelArg(/*kernel*/, 1, sizeof(cl_int), &width);
clSetKernelArg(/*kernel*/, 2, sizeof(cl_int), &height);
Run Code Online (Sandbox Code Playgroud)
设备:
kernel function(global int * array, int width, int height) {
int id = get_global_id(0);
int our_value = array[id];
int x = id % width; //This will depend on how the memory is laid out in the 2d array.
int y = id / width; //If it's not row-major, then you'll need to flip these two statements.
/*...*/
}
Run Code Online (Sandbox Code Playgroud)
如果像我举的例子意味着你的二维数组不连续存储在内存中,你需要推出自己的功能,以确保整个内存被连续存储在一个单一的堆分配对象.