Ответ 1
cl::Kernel simple_add(program, "simple_add");
simple_add.setArg(0, buffer_A);
simple_add.setArg(1, buffer_B);
simple_add.setArg(2, buffer_C);
queue.enqueueNDRangeKernel(simple_add,cl::NullRange,cl::NDRange(10),cl::NullRange);
Я следую некоторым учебникам по OpenCL, и они упоминают тип cl::KernelFunctor
. Однако этот тип не найден, и когда я посмотрел заголовки SDK AMD APP, я увидел, что объявление класса cl::KernelFunctor
закомментировано.
Что я должен использовать вместо этого кода для запуска ядра?
//run the kernel
cl::KernelFunctor simple_add(cl::Kernel(program, "simple_add"), queue, cl::NullRange, cl::NDRange(10), cl::NullRange);
simple_add(buffer_A, buffer_B, buffer_C);
cl::Kernel simple_add(program, "simple_add");
simple_add.setArg(0, buffer_A);
simple_add.setArg(1, buffer_B);
simple_add.setArg(2, buffer_C);
queue.enqueueNDRangeKernel(simple_add,cl::NullRange,cl::NDRange(10),cl::NullRange);
Как сказал @Michael Dorner, вы можете заменить код пошаговым подходом. Создайте ядро, задайте аргументы и оставьте его в очереди.
KernelFunctor должен использовать код ядра, чтобы вы могли назвать его функцией. Поскольку обычно это не так, редко используется в реальных приложениях, но может быть полезно в некоторых случаях.
С помощью этого кода вы говорите:
cl::KernelFunctor simple_add(cl::Kernel(program, "simple_add"), queue, cl::NullRange, cl::NDRange(10), cl::NullRange);
Затем, когда вы вызываете функтор, вы передаете только оставшиеся вещи, аргументы:
simple_add(buffer_A, buffer_B, buffer_C);
Хорошо, что вы можете позже запустить его с различными аргументами простым способом, просто:
simple_add(buffer_B, buffer_C, buffer_D);
Вы, вероятно, следуете этому уроку так же, как и я. Исходя из этого, я выяснил, что файлы CL/cl.hpp для OpenCL 1.1 и CL/cl.hpp для OpenCL 1.2 отличаются тем, что cl :: KernelFunctor удаляется позже.
Решение состоит в том, чтобы использовать функцию cl :: make_kernel, которая принимает в качестве шаблонных аргументов типы вашего функтора. Таким образом, в этом конкретном случае параметром шаблона является cl :: Buffer. Код, который компилируется для меня с использованием заголовка OpenCL 1.2:
cl::make_kernel<cl::Buffer, cl::Buffer, cl::Buffer> simple_add(cl::Kernel(program, "simple_add"));
cl::EnqueueArgs eargs(queue, cl::NullRange, cl::NDRange(10), cl::NullRange);
simple_add(eargs, buffer_A, buffer_B, buffer_C).wait();