我是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 表示这些类具有公共属性,可以从外部编写。