OpenCL: CL_INVALID_ARG_SIZE в clSetKernelArg - PullRequest
       56

OpenCL: CL_INVALID_ARG_SIZE в clSetKernelArg

1 голос
/ 20 апреля 2020

В настоящее время я изучаю, как использовать OpenCL, но у меня возникла проблема с попыткой поставить ядро ​​в очередь в мою очередь.

Предполагается, что ядро ​​получит float и 2 буфера типа unsigned char и unsigned int -

__kernel void task2(float value,
                    __global unsigned char *chars,
                    __global unsigned int *ints) 

Моя программа выглядит следующим образом -

bufferA = cl::Buffer(context, CL_MEM_WRITE_ONLY, sizeof(cl_uchar) * alphabets.size());
bufferB = cl::Buffer(context, CL_MEM_READ_WRITE, sizeof(cl_uint) * numbers.size());

kernel = cl::Kernel(prog, "kernelTest");
kernel.setArg(0, 2.55);
kernel.setArg(1, bufferA);
kernel.setArg(2, bufferB);

queue.enqueueTask(kernel);

, где буквы и цифры являются векторами. Программа построена успешно, но исключена, так как я думаю, что это не имеет отношения к этому вопросу.

При достижении части enqueueTask в программе я получаю сообщение об ошибке -

Error in: clSetKernelArg
Error code: -51 (CL_INVALID_ARG_SIZE)

Если я не полностью ошибаюсь, ядро ​​принимает 3 аргумента, а я передаю три аргумента float, беззнаковый буфер Buffer и беззнаковый буфер Int соответственно. Я что-то не так делаю?

1 Ответ

2 голосов
/ 20 апреля 2020

Вы не говорите, какой из ваших вызовов 3 setArg() дает сбой, но я подозреваю, что проблема может заключаться в том, что литерал 2.55 имеет тип double, а ваше ядро ​​ожидает float. Вы можете попробовать 2.55f или, если это не сработает, использовать временную переменную типа float вместо литерала.

Обратите внимание, что clSetKernelArg() (серверная часть для cl::Kernel::setArg()) не работает проверить размер буферных объектов. Таким образом, CL_INVALID_ARG_SIZE относится только к несоответствию размера скалярных аргументов, а для global аргументов ядра указателя clSetKernelArg() проверяет, что переданный аргумент действительно является действительным дескриптором cl_mem (а указанный arg_size равен sizeof(cl_mem)) .

...