繁体   English   中英

OpenCL实例化本地内存数组:内核中的无效指针错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM