UMat медленнее, чем Mat (TAPI на OpenCV 3.2, графический процессор Intel Ivybridge)

Я хочу ускорить свои программы с помощью прозрачного API. Чтобы проверить, есть ли улучшение скорости, я попытался использовать UMat вместо Mat. Однако делать это намного медленнее, чем использовать Mat на моем ноутбуке. Я использую Ubuntu 16.04. Мой графический процессор - Intel Ivybridge [8086: 0166] ( http://www.thinkwiki.org/wiki/Intel_HD_Graphics). Процессор: Intel® Core™ i5-3320M CPU @ 2.60GHz × 4. Я использую OpenCV 3.2.0 (на Qt 5.9.1) и установил его:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_IPP=ON -D WITH_OPENCL=ON -D WITH_OPENGL=ON .. make -j $(nproc) sudo make install sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf' sudo ldconfig

Я следовал этому руководству, чтобы установить OpenCL на мою машину: https://askubuntu.com/questions/850281/opencl-on-ubuntu-16-04-intel-sandy-bridge-cpu. Я смог запустить тестовый код OpenCL с веб-сайта и "clinfo" в терминале тоже работает.

Я также включил IPP, как описано здесь: https://software.intel.com/en-us/articles/enabling-ipp-on-opencv-windows-and-linux-ubintu

Более того, я попробовал это без IPP и поэкспериментировал с конфигурацией cmake, которая ничего не изменила.

Я использовал следующий код для определения скорости:

#include "opencv2/opencv.hpp"
#include <iostream>
#include <chrono>

using namespace cv;
using namespace std;
using namespace std::chrono;

int main(int argc, char** argv)
{

    UMat img, gray;
    imread("/home/robin/Pictures/Lenna.png", 1).copyTo(img);
    //img = imread("/home/robin/Pictures/Lenna.png", 1);

    high_resolution_clock::time_point t1 = high_resolution_clock::now();

    for(int i = 0; i < 1000; i++) {
        cvtColor(img, gray, COLOR_BGR2GRAY);
        GaussianBlur(gray, gray,Size(7, 7), 1.5);
        Canny(gray, gray, 0, 50);
    }

    high_resolution_clock::time_point t2 = high_resolution_clock::now();
    auto duration = duration_cast<microseconds>( t2 - t1 ).count();
    cout << duration << endl;

    return 0;
}

Выход 4442085 (4,4 секунды). Используя Mat (изменив UMat на Mat и используя img = imread("/home/robin/Pictures/Lenna.png", 1);) время равно 2628712.

Я действительно понятия не имею, что я делаю не так здесь. Я очень благодарен за любую помощь. Спасибо!

0 ответов

Другие вопросы по тегам