在JOCL中调用clSetKernelArg时出现CL_INVALID_MEM_OBJECT错误

时间:2019-05-01 03:14:54

标签: java opencl jocl

编辑:意识到我在每次迭代时都重新实例化了cl_context。现在可以使用了。

尽管这是一个JOCL特定的问题,但我认为它通常适用于OpenCL。

我有一个程序,它将int数组发送到OpenCL内核以在GPU上进行处理,然后将结果返回给Java。该程序在第一次迭代中运行良好,但是第二次调用clSetKernelArg(使用新数组)时,它将引发CL_INVALID_MEM_OBJECT错误。

我不明白为什么设置内核参数只会在第二次迭代时使程序崩溃。

这是Java代码的简化版本:

... bunch of kernel initialization code that works correctly ...

void doSingleIteration() {
    int[] array = new int[length];
    fillArrayWithData(array);

    cl_mem buf = CL.clCreateBuffer(context, CL.CL_MEM_READ_ONLY,
              length * Sizeof.cl_float, null, null);
    CL.clEnqueueWriteBuffer(commandQueue, buf, true, 0,
              array.length * Sizeof.cl_float, Pointer.to(array), 0, null, null);

    CL.clSetKernelArg(kernel, 0, Sizeof.cl_mem, Pointer.to(buf)); // This crashes on the second iteration ONLY??

    CL.clEnqueueNDRangeKernel(... this works fine ...)

    ... some other unrelated code ...
}

doSingleIteration(); // This one is ok
doSingleIteration(); // This one crashes

这是OpenCL中相应内核的标头:

kernel void myKernel(global const int* myArray) {
    ...
}

使它起作用的唯一方法是在每次迭代中重新实例化命令队列。但这是非常低效的。如何再次调用clSetKernelArg而又不会使程序崩溃?

谢谢

0 个答案:

没有答案