我可以使用cl_context比较OpenCL上下文吗?

时间:2018-11-08 12:19:37

标签: opencl

如果我有两个cl_contextc1,可以平等比较它们(c2)以确定它们是否表示不同的上下文吗?特别是:

  • 是否可以保证c1 == c2表示相同的上下文?
  • 是否可以保证c1 == c2代表不同的上下文?

任何对相关文档的引用都将受到赞赏。

1 个答案:

答案 0 :(得分:3)

规范没有明确说明这一点,但是我看不出您的第一个测试可能是错误的。如果两个上下文具有相同的句柄/指针值,那么运行时将如何知道这两个上下文中的哪个上下文? C类型系统不允许与==比较的类型,但是如果==的值为true,则实际上不是相等的类型。 (在C ++中,运算符重载当然可以做到这一点。)

对于第二个测试,我很想知道您希望从哪里获得针对同一上下文的不同cl_context句柄?对于诸如clGetCommandQueueInfo(queue, CL_QUEUE_CONTEXT, …)之类的函数,规范可能已经足够清楚:“返回创建命令队列时指定的上下文。”我认为这不能解释为“可以将与创建命令队列时指定的句柄不同的句柄返回到同一上下文。”因此,我看不到在什么情况下您可能会在相同的上下文中遇到两种不同的句柄。

不要问,“具有相同参数的两次对clCreateContext()的调用能否返回相同的上下文?” -这与您的第一个问题有关,但略有不同。据我所知,从API角度来看,上下文是无状态的(除了引用计数之外,它是不透明的-您必须在发布与保留之间进行平衡,或者行为是未定义的),并且规范并未声明上下文将是唯一的,因此我想某些实现可能会在这种情况下选择两次返回相同的上下文。 (但是,似乎不太可能,因为问题可能是:为什么?)。如果这是一个问题,请确保将唯一的user_data指针传递给每个clCreateContext()调用。

最后,我实际上没有在规范中的任何地方定义cl_context首先与==是否可比。但是,clCreateContext函数家族在发生错误的情况下可能会返回NULL,这意味着对于指针类型,cl_context除了typedef之外不能是其他任何东西。此外,官方的C ++包装器cl2.hpp在包装器类上定义了==!=运算符,这些运算符将OpenCL对象的基础C句柄与==和{{1 }}。

所以我认为可以肯定地说两个条件都成立。