Я пытаюсь изучить OpenCL с помощью привязок C++. Единственное, что я до сих пор не понял, - это следующий синтаксис. Попытка создать контекст, основанный на типе устройства:Синтаксис свойств контекста OpenCL C++
cl::Context context(CL_DEVICE_TYPE_CPU, properties);
Я использую ICD NVidia, которая, как я понимаю, не позволит вам создать контекст без определения платформы, поэтому мне нужен второй аргумент. Из стандарта cl_context_properties
должен быть список имен свойств, за которыми следуют соответствующие значения, заканчивающиеся на 0. В стандарте есть только один cl_context_properties
(таблица 4.4), который является свойством CL_CONTEXT_PLATFORM
и имеет значение свойства cl_platform_id
. Основываясь на том, что я думал, что таким образом, что это должно быть в порядке:
cl_context_properties properties[] =
{ CL_CONTEXT_PLATFORM, platforms[0], 0};
где platforms
мой вектор платформ. Но это не будет компилироваться, если вместо platforms[0]
я ставлю:
(cl_context_properties)(platforms[0])()
Это из примера кода в файле cl.hpp
заголовка.
1) Похоже, что platforms
ливается до типа cl_context_properties
. Почему это необходимо?
2) Почему в конце имеется дополнительный набор кронштейнов ()
?
Предположим, что я не эксперт на C++ (определенно верно). Я знаю, что это всего лишь небольшая вещь, но мне не нравится писать код, который я не понимаю полностью.
1) Хорошо, я думаю, я понимаю необходимость бросить сейчас - я думаю, вы не можете иметь массив, содержащий различные типы, после все. 2) Если я скомпилирую без дополнительных скобок, вы получите: 'error: invalid cast from type 'cl :: Platform' для ввода 'cl_context_properties {aka long int}'' – badger5000
Скобка на C++-оболочке должна получить собственный Объект OpenCL. Оператор() определен для этого. Я бы подумал, что это может быть «(cl_context_properties) (platform [0]())» хотя (возьмите первую cl :: Platform из вектора, получите дескриптор OpenCL, отбросите его в cl_context_properties, чтобы поместить его в массив). – Dithermaster
@ Dithermaster, спасибо! Оба '(platform [0]())' и '(platform [0])()' работают, хотя – badger5000