Что следует использовать вместо cl :: KernelFunctor?

Я следую некоторым учебникам по 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);

Ответ 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);

Ответ 2

Как сказал @Michael Dorner, вы можете заменить код пошаговым подходом. Создайте ядро, задайте аргументы и оставьте его в очереди.


KernelFunctor должен использовать код ядра, чтобы вы могли назвать его функцией. Поскольку обычно это не так, редко используется в реальных приложениях, но может быть полезно в некоторых случаях.

С помощью этого кода вы говорите:

cl::KernelFunctor simple_add(cl::Kernel(program, "simple_add"), queue, cl::NullRange, cl::NDRange(10), cl::NullRange);
  • Создайте функтор ядра "simple_add".
  • Запуск в очереди "очереди"
  • С этими NDR.

Затем, когда вы вызываете функтор, вы передаете только оставшиеся вещи, аргументы:

simple_add(buffer_A, buffer_B, buffer_C);

Хорошо, что вы можете позже запустить его с различными аргументами простым способом, просто:

simple_add(buffer_B, buffer_C, buffer_D);

Ответ 3

Вы, вероятно, следуете этому уроку так же, как и я. Исходя из этого, я выяснил, что файлы 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();