[英]OpenCL instantiating local memory array: invalid pointer error in kernel
我正在尝试创建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的行大小为* 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相同。 如果是这样, 我为什么会收到这个奇怪的错误? 为什么这是无效的指针?
问题是您只为本地缓冲区分配sizeof(cl_mem)
。 cl_mem
只是某种指针类型的typedef(因此,取决于您的系统为4到8个字节)。
然后,内核中发生的事情是,您访问的内存超出了分配的本地缓冲区的大小,并且GPU启动了内存故障。
clSetKernelArg(kernel, 3, myInputVector.size(), NULL);
clSetKernelArg(kernel, 4, myInputVector.size(), NULL);
应该解决您的问题。 还要注意,您提供的大小是以字节为单位的大小,因此您需要乘以向量元素类型的sizeof
(从代码中尚不清楚)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.