GaussianBlur в windows10 vs2017 и ubuntu g ++ имеет разную скорость? - PullRequest
1 голос
/ 28 апреля 2019

Я использую GaussianBlur в Windows и Ubuntu, время выпуска версии в Ubuntu почти равно режиму отладки в Windows?

в Vs2017 Режим выпуска и отладки я открываю / openmp / fp: fast /sdl- / permissive- / Gy / Oi / arch: AVX2 / O2 / Ot /MD.

И opencv3.4.0 встроить в Ubuntu 16.04:

cmake -D WITH_TBB = ON -D WITH_OPENMP= ON -D WITH_IPP = ON -D CMAKE_BUILD_TYPE = RELEASE -D BUILD_EXAMPLES = OFF -D WITH_NVCUVID = ON -D WITH_CUDA = ON -D BUILD_DOCS = OFF -D BUILD_PERF_TESTS = OFF -D BUILD_TESTS = OFFD-WITH = WITH_D= ON CMAKE_INSTALL_PREFIX = / usr / local / ..

makefile:

CC = g++
OPENCV_INC_PATH := ./opencv-3.4.0/include
OPENCV_LIB_PATH := ./opencv-3.4.0/build/lib
OBJS = edgeBlend.o
LIBS = edgeBlend.so
INCLUDE_PATH := -I ${OPENCV_INC_PATH}
LIB_PATH := -L ${OPENCV_LIB_PATH}

CXXFLAGS := ${INCLUDE_PATH} ${LIB_PATH} -Wall -O2 -std=c++11 -fPIC -march=native -ffast-math -fopenmp
LD_FLAGS := -lopencv_core -lz -lrt -ldl -lm -lpthread -ljpeg -ltiff -lpng -lopnecv_imgproc

all : $(LIB)
%.o : %.cpp
        $(CC) $(CXXFLAGS) -c $< -o $(@)
$(LIB) : $(OBJS)
        rm -f $(@)
        $(CC) $^ -shared -o $(@) ${LIB_PATH} ${LD_FLAGS}
        rm -f $(OBJS)
clean:
        rm -f $(OBJS) $(LIB) 

Ниже приведен мой код, размер изображения 640 * 480 * 3:

double start = cv::getTickCount();

cv::GaussianBlur(img_cont, edge_gau, Size(3, 3), 0.8);

cv::GaussianBlur(img_back, img_gau, Size(3, 3), 0.8);

double end = cv::getTickCount();

double time = (end - start) / cv::getTickFrequency();

windows:

время отладки: 0,02 с

время выпуска: 0,005 с

Ubuntu:

время выпуска: 0,02 с

1 Ответ

3 голосов
/ 28 апреля 2019

Мне кажется, что ваши флаги оптимизации не позволяют провести справедливое сравнение.Возможно, это не основная причина, но вот несколько идей:

  • Пожалуйста, проверьте фактические флаги gcc (make clean; make VERBOSE=1), а не только вызов cmake.
  • Вы разрешаете/fp:fast в MSVC, но не -ffast-math на gcc?Или вы?Пожалуйста, покажите действительные флаги.
  • Вы разрешаете компилятору использовать AVX2 в Windows, но не в Linux?(Трудно быть уверенным, не увидев строку gcc.) Я не уверен, каковы значения по умолчанию, но обычно они пытаются максимизировать совместимость.Попробуйте вместо этого скомпилировать с помощью -march=native.
  • Большая часть работы может происходить или не выполняться в библиотеке opencv, в зависимости от того, являются ли ваши методы встроенными (из заголовочных файлов) или реализованы как вызов в самой библиотеке..
  • Проверьте, присутствует ли флаг -fopenmp.Обратите внимание, что на производительность openmp также могут влиять переменные окружения, такие как OMP_NUM_THREADS.
  • Вы уверены, что используете свою собственную библиотеку opencv, а не ту из дистрибутива?Используйте ldd для проверки.
...