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.
Я действительно понятия не имею, что я делаю не так здесь. Я очень благодарен за любую помощь. Спасибо!