【问题标题】:How do I pass an array to an OpenCL kernel?如何将数组传递给 OpenCL 内核?
【发布时间】:2026-02-23 16:40:02
【问题描述】:

我有一个想要传递给 OpenCL 内核的数组。我的部分代码是

cl_mem arr_cl;
unsigned int arr[4] = { 0 };

arr_cl = clCreateBuffer(ocl.context, CL_MEM_ALLOC_HOST_PTR, 4*sizeof(unsigned int), NULL, &status);

arr = (unsigned int*)clEnqueueMapBuffer(ocl.command_queue, arr_cl, CL_TRUE, CL_MAP_READ | CL_MAP_WRITE, 0, 4*sizeof(unsigned int), 0, NULL, NULL, NULL);

status |= clSetKernelArg(ocl.kernel, 0, sizeof(cl_mem), &(arr_cl));

上面的代码编译但在运行时崩溃。请让我知道我在这里做错了什么。

我正在使用 OpenCL 2.0。

【问题讨论】:

  • 内核参数的索引=1。如果你只有一个内核参数,不应该是0吗?您也可以尝试使用至少 64 个元素的数组吗?

标签: opencl opencl-c


【解决方案1】:

来源:https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/clEnqueueMapBuffer.html

CL_MAP_READ 或 CL_MAP_WRITE 和 CL_MAP_WRITE_INVALIDATE_REGION 是 互斥。

如果 opencl 版本 >=1.2,您应该只在映射中读取或写入。

另外,当将 alloc_host_ptr 更改为 use_host_ptr 时,数组应与CL_DEVICE_MEM_BASE_ADDR_ALIGN value/query 对齐。

【讨论】: