【问题标题】:Create OpenCL Context from cl_context without taking ownership从 cl_context 创建 OpenCL 上下文而不取得所有权
【发布时间】:2017-10-18 15:30:09
【问题描述】:

我正在创建一个 OpenFX 插件来为 VR 系统进行一些图像处理。

由于我们现有的处理代码和该插件所针对的主机均基于 OpenCL,主机开发人员为我提供了 OFX 的扩展以共享 OpenCL 环境。

但是 - 我们的代码使用 C++ API (cl::Context),并且他们提供的扩展为我提供了指向 C cl_context 的指针。

有什么方法可以让我从 cl_context 创建一个 cl::Context,而不获取后者的所有权? (对于来自 cl_command_queue 的 cl::CommandQueue 也是如此)。在线 API 文档建议复制构造函数和赋值运算符都拥有所有权。

【问题讨论】:

  • cl::Context 实例有一个.getInfo(),这对于获取必要的信息(可能是CL_CONTEXT_DEVICES)来重建克隆很有用。
  • 你有办法解决这个问题吗?保留功能受到保护,所以我不能使用下面的方法
  • 是的 - 正如@Dithermaster 在他的评论中所说,您需要使用 clRetainContext()

标签: c++ c plugins opencl openfx


【解决方案1】:

幸运的是,您可以检查 OpenCL C++ 标头以确切了解它的作用(在底部它只是进行 C API 调用),并且您可以单步执行代码来验证它。在同时使用 C 和 C++ API 时,您必须注意 OpenCL 对象的保留/释放计数,特别是如果 C++ 构造函数不保留但析构函数确实释放,那么您就会遇到问题(因为您会释放主机的上下文从他们下面)。但是,它很容易修复,因为您可以在构造后调用在对象上保留自己以平衡事情。我在 OpenCL 中混合了 C API 和 C++ API,C++ 标头的保留/发布理念也让我感到很痛苦,所以我感到很痛苦。好奇,OpenFX 主机是 Resolve、Vegas、Catalyst 还是其他? OpenFX 即将推出统一的 OpenCL 扩展。

【讨论】:

  • 嘿,你没有回答这个问题。那我到底该怎么做,做不到呢?例如,Caffe 使用旧的 API,但是如果我们想从 caffe 获取一个 cl_context 并在使用 cl::Context 的 API 中使用它,这是不可能的?保留受到保护
  • 您可以从您的cl_context 句柄创建一个上下文对象(有一个构造函数,由__CL_EXPLICIT_CONSTRUCTORS 启用),或者您可以使用赋值运算符将您的cl_context 句柄分配给上下文对象. Context 对象现在“拥有”该上下文,并在超出范围时释放它。如果您仍想使用您的 cl_context 句柄,那么在创建或分配 Context 对象之后,还要在句柄上调用 clRetainContext(这会抵消在对象的析构函数中完成的释放)。不管是 C 还是 C++ API,都是一样的 cl_content
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2016-10-03
  • 2015-07-19
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多