【问题标题】:Creating command queue with even in opencv即使在opencv中创建命令队列
【发布时间】:2014-04-09 03:42:54
【问题描述】:

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

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

【问题讨论】:

    标签: opencv kernel opencl


    【解决方案1】:

    您的处境很棘手,因为 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 说这些类具有公共属性,并且可以从外部编写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-31
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 2018-07-27
      • 2020-10-15
      相关资源
      最近更新 更多