opencv - 即使在opencv中创建命令队列

标签 opencv kernel opencl

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

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

最佳答案

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

  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 说这些类具有公共(public)属性,并且可以从外部编写。

关于opencv - 即使在opencv中创建命令队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22944136/

相关文章:

c - "do { ... } while (0)"在内核代码中到底做了什么?

c - OpenCL 程序使用太多内存

c++ - 使用 OpenCV 移动图像内容

linux - 有谁知道 fifo.c linux fifo 调度程序的文件位置?

linux - 使用 Linux Kernel 会支持当前的程序吗?

c++ - 使用 C++ 在 Xcode 6.1.1 下编译简单的 OpenCL 示例代码时出现问题

android - 如何防止我的 android jni 调用中的代码停滞?

windows - 如何在 Windows 上使用 MinGW 构建 OpenCV 3.2.0

c++ - OpenCV卡尔曼滤波器错误

python - 如何在 Python OpenCV 中增加图像的对比度