OpenCV улучшает первый вызов графического процессора и сокращает время - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть некоторый простой код 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);

То, что я пытаюсь выполнить, работает отлично, поэтому код не является проблемой.Проблема в том, что мне нужно время, потому что я использую свой интегрированный графический процессор и OpenCV 3.3 с поддержкой OpenCL для запуска на iGPU.Это прекрасно работает для каждого звонка после первого.Я знаю, что для инициализации и компиляции кода ядра GPU требуется время, но я использую этот код в видеоприложении с акцентом на производительность в реальном времени.Таким образом, первый вызов и Имидж всегда занимают 1,5 с и явно заикают видео.Вызовы после выполняются в течение <10 мс, что совершенно нормально. </p>

Так есть ли способ переключиться на вариант с ЦП, пока код GPU компилируется, и использовать версию GPU после этого или что-то еще?Просто так у меня нет этого первого "лага".

Спасибо за предложения заранее!

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Другим вариантом может быть кэширование двоичных файлов любых используемых ядер OpenCL, если вы этого еще не сделали. (Я ничего не знаю об OpenCV, поэтому этот совет основан исключительно на OpenCL.) Вместо того, чтобы создавать программы OpenCL из исходного кода, вы можете использовать clCreateProgramWithBinary() с двоичными данными, сохраненными из clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, ...) / clGetProgramInfo(program, CL_PROGRAM_BINARIES, ...). Вы все равно заплатите за компиляцию при первом запуске, а точнее при первом запуске после изменения реализации OpenCL / устройства или даже обновлений драйверов, но последующие запуски должны быть быстрее. (Конечно, совет о том, как выполнить инициализацию как можно раньше и «максимально скрыть» его стоимость выполнения, по-прежнему применим и может сочетаться с этим.)

0 голосов
/ 16 ноября 2018

См. Комментарий к ответу выше.После дальнейших исследований кажется, что я не могу легко избежать издержек, но перенесу их в начало моего приложения и использую в этот момент фиктивный вызов, чтобы загрузить все до того, как запустится видеопоток.

...