【问题标题】:OpenCL instantiating local memory array: invalid pointer error in kernelOpenCL 实例化本地内存数组:内核中的无效指针错误
【发布时间】: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

标签: c++ opencl


【解决方案1】:

问题是您只为本地缓冲区分配sizeof(cl_mem)cl_mem 只是某种指针类型的 typedef(因此 4 到 8 个字节,具体取决于您的系统)。

然后在您的内核中发生的情况是您正在访问超出您分配的本地缓冲区的大小,并且 GPU 启动了内存故障。

clSetKernelArg(kernel, 3, myInputVector.size(), NULL);
clSetKernelArg(kernel, 4, myInputVector.size(), NULL);

应该可以解决您的问题。另请注意,您提供的大小是以字节为单位的大小,因此您需要乘以向量元素类型的sizeof(从代码中不清楚)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2012-07-25
    • 2015-01-16
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多