arrays - 二维数组作为 OpenCL 内核参数

标签 arrays multidimensional-array opencl

非常简单的问题:如何使用 2D 数组作为 OpenCL 内核参数?

常识建议使用

__kernel void main(__global <datatype> **<name>) ,

但是编译器似乎对这个想法不太感兴趣:

kernel parameter cannot be declared as a pointer to a pointer .

我是否在监督显而易见的事情,或者到底是什么,我在这里做错了?

编辑:

主机(c++)数据结构如下所示:

vector<vector<Element>> ,

其中 Element 是一个结构体,包含同一数组内子节点的索引。基本上是指针。

最佳答案

您需要将二维数组缩减为一维数组。

主持人:

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

设备:

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.
    /*...*/
}

如果您的 2D 数组没有像我的示例所暗示的那样连续存储在内存中,您需要滚动自己的函数以确保整个内存连续存储在单个堆分配的对象中。

关于arrays - 二维数组作为 OpenCL 内核参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35442327/

相关文章:

c# - 序列化锯齿状数组与多维数组

python - 如何在 NumPy 中连接两个一维数组?

c - Opencl - 减少工作项数量的比率

opencl - Snapdragon 820 Adreno 530 没有返回正确的设备信息

javascript - Eloquent Javascript 正则表达式示例 : Why Is Exec Returning A Two-Item Array?

python - Python 中 Numpy 和 MpMath 之间的互操作性

java - Android - 计算两个数字出现在单元格编号中的时间

opencv - OpenCL atom_inc 分离有什么好主意吗?

javascript - 在javascript中按值作为键创建新对象

javascript - 将数组动态映射到嵌套对象