【问题标题】:OpenCV improve first GPU call and reduce time overheadOpenCV 改进了第一次 GPU 调用并减少了时间开销
【发布时间】:2019-04-19 11:15:10
【问题描述】:

我有一些类似这样的简单 OpenCV 代码:

        TIMING_START(T1);
        cv::cvtColor(fi.getUMat(cv::ACCESS_READ), fi_gray, CV_RGB2GRAY);
        TIMING_STOP(T1);
        TIMING_START(T2);
        cv::threshold(fi_gray, fi_gray, 70, 255, CV_THRESH_BINARY);
        TIMING_STOP(T2);
        TIMING_START(T3);
        cv::Canny(fi_gray, canny_output, 1, 255, 3);
        TIMING_STOP(T3);

我尝试完成的事情很好,所以代码的作用不是问题。问题是它需要的时间开销,因为我使用我的集成 GPU 和 OpenCV 3.3 支持 OpenCL 在 iGPU 上运行。这对于第一次之后的每个呼叫都非常有用。我知道初始化和编译 gpu 内核代码需要时间,但我在视频应用程序中使用这些代码,重点是实时性能。因此,第一次通话和图像总是需要 1.5 秒,并且显然会使视频断断续续。之后的调用在

那么有没有办法在 GPU 代码编译并在之后使用 GPU 版本时切换到 CPU 版本?只是这样我就没有第一次“滞后”了。

提前感谢您的建议!

【问题讨论】:

  • 有一个解决方案 - 如果可能,在实际运行之前对管道进行空运行。所以一切都准备好了。
  • 感谢您的建议。我添加了一个 Initialize() 方法,该方法在开始时执行一个虚拟调用。这对于我的应用程序来说应该足够了。

标签: c++ opencv video opencl


【解决方案1】:

请参阅对上述答案的评论。经过进一步研究,似乎我无法轻易避免开销,但将其移至我的应用程序的开头并在此时使用虚拟调用在视频流开始之前加载所有内容。

【讨论】:

    【解决方案2】:

    另一个选项可能是缓存任何使用的 OpenCL 内核的二进制文件,如果您还没有这样做的话。 (我对 OpenCV 一无所知,所以这个建议完全基于 OpenCL。)您可以使用 clCreateProgramWithBinary() 和从 clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, ...)/clGetProgramInfo(program, CL_PROGRAM_BINARIES, ...) 保存的二进制数据,而不是从源代码构建 OpenCL 程序。您仍然会在第一次运行时支付编译费用,或者更确切地说是在更改 OpenCL 实现/设备甚至驱动程序更新后的第一次运行时,但后续运行应该更快。 (当然,关于尽早执行初始化并尽可能“隐藏”其运行时成本的建议仍然适用,并且可以与此结合使用。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 2010-11-20
      • 2021-11-12
      相关资源
      最近更新 更多