甚至在 opencv 中创建命令队列



我是opencv和opencl的新手。在 opencl 中,它们为 opencl 实用程序函数调用提供了一个包装器。我不需要做太多。ocl::Context::getContext() 将获取上下文,我可以将其传递给所有与 opencl 相关的执行。我在这里不需要命令 quee。但是我想知道使用 opencl 的分析事件的内核的性能。为此,我需要创建一个自定义命令队列。如何使用与执行内核相同的上下文创建命令队列。请我使用 opencv 的函数 ocl::Context::getContext() 创建了这个上下文。

我不想从头开始创建命令队列(通过逐个获取平台 ID、设备 ID、上下文)。这意味着要改变很多地方。我想重用 opencv 的上下文并重用它来创建具有事件功能的命令队列。

您处于一个棘手的境地,因为 OpenCV 代码缺少底层 OpenCL 选项的功能接口:

  804 void CommandQueue::create(ContextImpl* context)
  805 {
  806     release();
  807     cl_int status = 0;
  808     // TODO add CL_QUEUE_PROFILING_ENABLE
  809     cl_command_queue clCmdQueue = clCreateCommandQueue(context->clContext, context->clDeviceID, 0, &status);
  810     openCLVerifyCall(status);
  811     context_ = context;
  812     clQueue_ = clCmdQueue;
  813 }

我认为您应该通过以下方式发布并重新创建内部队列:

 cl_command_queue Queue = clCreateCommandQueue(ocl::Context::getOpenCLContextPtr(), ocl::Context::getOpenCLDeviceIDPtr(), CL_QUEUE_PROFILING_ENABLE); //Create a new queue with same parameters
 ocl::CommandQueue::Release(); //To release the old queue
 ocl::CommandQueue::clQueue_ = Queue ; //To overwrite it internally with the new one

或者自己做所有事情(创建所有设备并手动使用它们)但要小心!这是不安全的!(并且未经测试)。但是,DOC 表示这些类具有公共属性,可以从外部编写。

相关内容

  • 没有找到相关文章

最新更新