Как получить максимальный глобальный размер работы с привязками OpenCL C ++? - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу получить максимальный общий размер работы. Я не хочу, чтобы ядро ​​OpenCL попыталось выбрать лучшее для вас, которое МОЖЕТ или НЕ МОЖЕТ быть максимальным размером.

Для этого я хочу указать размер при вызове clEnqueueNDRangeKernel. например:

clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global_size, NULL, 0, NULL, NULL);

документация clGetKernelWorkGroupInfo , указывает:

CL_KERNEL_GLOBAL_WORK_SIZE: Это предоставляет механизму для запроса приложением максимальный глобальный размер, который может использоваться для выполнения ядра (то есть аргумента global_work_size для clEnqueueNDRangeKernel) на пользовательском устройстве, предоставляемом устройством или встроенным ядром на устройство OpenCL, предоставляемое устройством.

Как я могу получить CL_KERNEL_GLOBAL_WORK_SIZE с привязками OpenCL C ++?

Я делаю это

cl::array<size_t, 3> kernel_global_work_size = my_kernel.getWorkGroupInfo<CL_KERNEL_GLOBAL_WORK_SIZE>(my_device);

Но я получил ошибку:

cl2.hpp:5771:12: note: candidate: template<class T> cl_int cl::Kernel::getWorkGroupInfo(const cl::Device&, cl_kernel_work_group_info, T*) const
     cl_int getWorkGroupInfo(
            ^~~~~~~~~~~~~~~~
cl2.hpp:5771:12: note:   template argument deduction/substitution failed:
cl2.hpp:5782:9: note: candidate: template<int name> typename cl::detail::param_traits<cl::detail::cl_kernel_work_group_info, name>::param_type cl::Kernel::getWorkGroupInfo(const cl::Device&, cl_int*) const
         getWorkGroupInfo(const Device& device, cl_int* err = NULL) const

И с этим кодом

cl::array<size_t, 3> kernel_global_work_size;
my_kernel.getWorkGroupInfo<cl::array<size_t, 3>>(my_device, CL_KERNEL_GLOBAL_WORK_SIZE, &kernel_global_work_size);

Я получил ошибку OpenCL -30 (неверное значение)

my_kernel не является встроенным ядром например: cl::Kernel my_kernel = cl::Kernel(program, "my_kernel"); my_device не является пользовательским устройством. например: cl::Device device = myDevices[0];

1 Ответ

0 голосов
/ 26 апреля 2018

Да, так как ваш звонок совпадает с подписью:

https://github.khronos.org/OpenCL-CLHPP/classcl_1_1_kernel.html

template <cl_int name> typename
detail::param_traits<detail::cl_kernel_work_group_info, name>::param_type getWorkGroupInfo(const Device& device, cl_int* err = NULL) const;

Похоже, что param_traits, созданный с помощью макросов, не объявлен для CL_KERNEL_GLOBAL_WORK_SIZE. Это было бы ошибкой в ​​заголовках. ( Проблема GitHub, созданная OP )

Для некоторых записей здесь пропущены записи здесь .

Кроме того, вы можете использовать версию, возвращающую код ошибки, и информацию через выходной параметр, который должен обойти проблему:

template<typename T>
cl_int getWorkGroupInfo(const Device &device, cl_kernel_work_group_info name, T *param) const;

Звонок может выглядеть так:

cl::array<size_t, 3> result;
kernel.getWorkGroupInfo<decltype(result)>(device, CL_KERNEL_GLOBAL_WORK_SIZE, result);

Мой вопрос к вам будет: Вы сами пробовали? Результат не соответствует вашим ожиданиям?


Вы получили CL_INVALID_VALUE?

[...] на пользовательском устройстве, предоставленном устройством, или встроенное ядро ​​на устройстве OpenCL, предоставленном устройством.

Если устройство не является пользовательским устройством или ядро ​​не является встроенным ядром , clGetKernelArgInfo возвращает ошибку CL_INVALID_VALUE.

См. Спецификация OpenCL 1.2 , страницы 14 и 15:

Встроенное ядро: Встроенное ядро ​​- это ядро, которое выполняется на устройстве OpenCL или на другом устройстве. устройство с помощью аппаратного обеспечения с фиксированной функцией или встроенного программного обеспечения. Приложения могут запрашивать встроенные ядра поддерживается устройством или пользовательским устройством. Программный объект может содержать только ядра, написанные на OpenCL C или встроенные ядра, но не оба. Смотрите также Ядро и Программа.

Пользовательское устройство: Устройство OpenCL, которое полностью реализует среду выполнения OpenCL, но не программы поддержки, написанные на OpenCL C. Пользовательское устройство может быть специализированным программируемое оборудование, которое очень энергоэффективно и эффективно для направленных задач или аппаратные средства с ограниченными программируемыми возможностями, такие как специализированные DSP. Пользовательские устройства не соответствует OpenCL. Пользовательские устройства могут поддерживать онлайн-компилятор. Программы для пользовательские устройства могут быть созданы с помощью API-интерфейсов среды выполнения OpenCL, которые позволяют программам OpenCL создаваться из исходного кода (если поддерживается онлайн-компилятор) и / или двоичного файла, или из встроенных ядер поддерживается устройством. См. Также Устройство.

Для обычных ядер и устройств стандарт ограничивает размер рабочей группы (свойство устройства), в то время как глобальный размер ограничен только диапазоном используемых size_t. См. clEnqueueNDRangeKernel .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...