OpenCV改善了第一个GPU调用并减少了时间开销

问题描述 投票:0回答:2

我有一些简单的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和支持OpenCL的OpenCV 3.3在iGPU上运行。这适用于第一次之后的每次通话。我知道初始化和编译gpu内核代码需要时间,但我在视频应用程序中使用代码,重点是实时性能。所以第一次调用和Image总是需要1.5秒,显然会使视频断断续续。之后的呼叫在<10ms内完成,这绝对没问题。

那么有什么方法可以切换到CPU变体,而GPU代码在之后编译和使用GPU版本或其他东西?所以我没有第一次“滞后”。

提前感谢您的建议!

c++ opencv video opencl
2个回答
0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.