我有一些简单的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内完成,绝对可以。
那么在GPU代码编译并随后使用GPU版本时,是否有办法切换到CPU版本?只是为了让我没有第一次“滞后”。
感谢提前提出建议!
答案 0 :(得分:0)
请参阅以上答案的评论。经过进一步的研究,看来我无法轻易避免开销,但是将其移到应用程序的开头并在此时使用虚拟调用来在视频流开始之前加载所有内容。
答案 1 :(得分:0)
如果您还没有这样做的话,另一个选择可能是缓存使用的任何OpenCL内核的二进制文件。 (我对OpenCV一无所知,因此该建议仅基于OpenCL。)您可以将clCreateProgramWithBinary()
与从clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, ...)
/ {{ 1}}。您仍然会在首次运行时或在更改OpenCL实施/设备甚至驱动程序更新后的第一次运行时支付编译费用,但后续运行应该更快。 (当然,有关尽早执行初始化并尽可能“隐藏”其运行时成本的建议仍然适用,并且可以与此结合使用。)