Ошибка CL_INVALID_MEM_OBJECT при вызове clSetKernelArg в JOCL - PullRequest
0 голосов
/ 01 мая 2019

РЕДАКТИРОВАТЬ: Понял, что я повторяю 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 второй раз без сбоев программы?

Спасибо

...