Контекст OpenCL для нескольких устройств - PullRequest
0 голосов
/ 27 октября 2019

Я начинал с OpenCL и хотел создать cl::Context с несколькими устройствами. Изучая спецификации OpenCL 1.2 C ++ Wrapper Api, я нашел этот конструктор для cl::Context:

Конструктор

cl::Context::Context(VECTOR_CLASS<Device>& devices, cl_context_properties * properties = NULL, void (CL_CALLBACK * pfn_notify)( const char * errorinfo, const void * private_info, ::size_t cb, void * user_data) = NULL, void * user_data = NULL, cl_int * err = NULL)

создает контекст OpenCL.

devices - указатель на вектор уникальных устройств, возвращаемых cl :: Platform :: getDevices. Если указано более одного устройства, критерии выбора могут применяться, чтобы определить, можно ли использовать указанный список устройств для создания контекста.

...

Myвопросы: каковы «критерии», применяемые реализацией OpenCL? Как я могу гарантировать, что список устройств, которые я передаю, совместим? Какие устройства совместимы (т. Е. Должны ли они быть одним и тем же типом устройства или чем-то еще?) И должны ли они быть от одной и той же платформы / поставщика (это подразумевается «уникальными устройствами, возвращаемыми cl :: Platform :: getDevices»")?

Конструктор установит код ошибки на CL_INVALID_DEVICE, если devices содержит недопустимое устройство.

1 Ответ

1 голос
/ 28 октября 2019

Каковы «критерии», применяемые реализацией OpenCL? Как я могу гарантировать, что список устройств, которые я передаю, совместим? Какие устройства совместимы (т. Е. Должны ли они быть одного типа устройства или что-то в этом роде?)

Ответы на все эти вопросы зависят от реализации. Вы должны гарантировать, что список устройств исходит от одной Платформы, но реализация может применять некоторые «критерии» выбора, если не все поддерживаемые устройства могут работать вместе в одном контексте, что опять-таки зависит от конкретной реализации. Вы можете использовать cl::Context::getInfo, чтобы увидеть, какие устройства связаны с созданным вами контекстом.

И должны ли они быть с одной и той же платформы / поставщика (это как бы подразумевается) возвращаемых уникальных устройствby cl :: Platform :: getDevices ")?

Документация гласит:

devices - указатель на вектор уникальногоустройства, возвращаемые cl :: Platform :: getDevices

Вектор здесь возвращается с определенной платформы, поэтому для создания контекста может использоваться только одна платформа.

Существует еще однаconstructor:

cl::Context::Context(cl_device_type type, ... )

создает контекст OpenCL из типа устройства, который идентифицирует конкретные устройства для использования. Конструктор пытается использовать первую платформу, на которой установлено устройство указанного типа.

Так что и в этом случае всегда существует одна Платформа на Контекст. Платформа в основном представляет собой конкретную реализацию OpenCL от какого-либо поставщика. Как правило, они не взаимодействуют друг с другом.

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