Могу ли я использовать cl_context для сравнения контекстов OpenCL? - PullRequest
0 голосов
/ 08 ноября 2018

Если у меня есть два cl_context s c1 и c2, могу ли я сравнить их равенства (c1 == c2), чтобы выяснить, представляют ли они различные контексты? В частности:

  • Гарантируется ли, что если c1 == c2, они представляют один и тот же контекст?
  • Гарантируется ли, что если c1 != c2, они представляют разные контексты?

Любые ссылки на соответствующую документацию приветствуются.

1 Ответ

0 голосов
/ 08 ноября 2018

Спецификация явно не заявляет об этом, но я не вижу, как ваш первый тест мог быть ложным. Как среда выполнения узнает, какой из 2 контекстов имеется в виду, если они имеют одинаковое значение дескриптора / указателя? Система типов C не допускает сопоставления типов, ==, но на самом деле они не равны, если == имеет значение true. (В C ++ перегрузка операторов, конечно, сделала бы это возможным.)

Для второго теста мне было бы интересно узнать, откуда вы ожидаете получить разные cl_context дескрипторы в одном и том же контексте? Для таких функций, как clGetCommandQueueInfo(queue, CL_QUEUE_CONTEXT, …), спецификация, вероятно, достаточно ясна: «Вернуть контекст, указанный при создании очереди команд». Я не думаю, что это можно интерпретировать как «Может возвращать дескриптор, отличный от того же контекста, который был указан при создании очереди команд». Так что я не вижу, при каких обстоятельствах вы можете получить 2 разных дескриптора в одном и том же контексте.

Вы не спрашиваете, "могли ли 2 вызова к clCreateContext() с одинаковыми аргументами вернуть один и тот же контекст?" - Это связано с вашим первым вопросом, но немного по-другому. Насколько мне известно, контексты не сохраняют состояния с точки зрения API (кроме подсчета ссылок, который непрозрачен - вы должны балансировать выпуски с сохранениями или поведение не определено), а в спецификации не утверждается, что контекст будет уникальным так что я полагаю, что в некоторых случаях некоторые реализации могут возвращать один и тот же контекст дважды. (Хотя это кажется маловероятным, поскольку вопрос будет: почему?) Если это вызывает озабоченность, обязательно передайте уникальные user_data указатели на каждый из ваших clCreateContext() вызовов.

Наконец, я фактически не вижу нигде в спецификации, которая определяет, будет ли cl_context сопоставим с == в первую очередь. Однако семейство функций clCreateContext может возвращать NULL в случае ошибки, которая подразумевает, что cl_context не может быть ничем иным, как typedef для типа указателя. Кроме того, официальная оболочка C ++, cl2.hpp, определяет операторы == и != в классах оболочек, которые сравнивают базовые дескрипторы C для объектов OpenCL с == и !=.

.

Так что я думаю, что можно с уверенностью сказать, что оба условия выполняются.

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