Спецификация явно не заявляет об этом, но я не вижу, как ваш первый тест мог быть ложным. Как среда выполнения узнает, какой из 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 с ==
и !=
.
.
Так что я думаю, что можно с уверенностью сказать, что оба условия выполняются.