【发布时间】:2016-04-30 23:59:06
【问题描述】:
我正在尝试创建 2 个本地数组供内核使用。我的目标是将全局输入缓冲区复制到第一个数组 (arr1) 中,并实例化第二个数组 (arr2),以便以后可以访问和设置其元素。
我的内核是这样的:
__kernel void do_things (__global uchar* in, __global uchar* out,
uint numIterations, __local uchar* arr1, __local uchar* arr2)
{
size_t work_size = get_global_size(0) * get_global_size(1);
event_t event;
async_work_group_copy(arr1, in, work_size, event);
wait_group_events(1, &event);
int cIndex = (get_global_id(0) * get_global_size(1)) + get_global_id(1);
arr2[cIndex] = 0;
//Do other stuff later
}
在我调用它的 C++ 代码中,我将内核参数设置如下:
//Create input and output buffers
cl_mem inputBuffer = clCreateBuffer(context, CL_MEM_READ_ONLY |
CL_MEM_COPY_HOST_PTR, myInputVector.size(), (void*)
myInputVector.data(), NULL);
cl_mem outputBuffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY,
myInputVector.size(), NULL, NULL);
//Set kernel arguments.
clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&inputBuffer));
clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&outputBuffer));
clSetKernelArg(kernel, 2, sizeof(cl_uint), &iterations));
clSetKernelArg(kernel, 3, sizeof(inputBuffer), NULL));
clSetKernelArg(kernel, 4, sizeof(inputBuffer), NULL));
其中 myInputVector 是一个充满 uchar 的向量。
然后,我使用 2D 工作大小将其排入队列,行 * 列大。 myInputVector 的大小为 rows * cols。
//Execute the kernel
size_t global_work_size[2] = { rows, cols }; //2d work size
status = clEnqueueNDRangeKernel(commandQueue, kernel, 2, NULL,
global_work_size, NULL, 0, NULL, NULL);
问题是,我在运行内核时遇到了崩溃。具体来说,内核中的这一行:
arr2[cIndex] = 0;
对崩溃负责(省略它会使其不再崩溃)。错误如下:
*** glibc detected *** ./MyProgram: free(): invalid pointer: 0x0000000001a28fb0 ***
我想要的只是能够访问 arr2 和 arr1。 arr2 的大小应与 arr1 相同。如果是这样,为什么会出现这个奇怪的错误?为什么这是一个无效的指针?
【问题讨论】:
-
inputBuffer是如何定义的? -
它是在上面创建的:cl_mem inputBuffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, myInputVector.size(), (void*) myInputVector.data(), NULL);
-
对不起,我的意思是
myInputVector。