1

GaussianBlur在windows和ubuntu上使用,ubuntu的release模式的时间和windows的debug模式差不多?

在 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= OFF -D WITH_CSTRIPES=ON -D WITH_OPENCL=ON CMAKE_INSTALL_PREFIX=/usr/local/ ..

生成文件:

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();

视窗:

调试耗时:0.02s

发布耗时:0.005s

Ubuntu:

发布成本时间:0.02s

4

1 回答 1

3

在我看来,您的优化标志不能进行公平比较。这可能不是根本原因,但这里有一些想法:

  • 请检查实际的 gcc 标志 ( make clean; make VERBOSE=1) 而不仅仅是 cmake 调用。
  • /fp:fast在 MSVC 中允许但-ffast-math在 gcc 中不允许?还是你?请显示实际的标志。
  • 您允许编译器在 Windows 上使用 AVX2,而不是在 Linux 上?(如果没有看到 gcc 行就很难确定。)我不确定默认值是什么,但通常它们会尝试最大限度地提高兼容性。尝试用编译-march=native代替。
  • 大部分工作可能会或可能不会发生在 opencv 库中,具体取决于您的方法是内联的(来自头文件)还是作为对库本身的调用来实现的。
  • 检查-fopenmp标志是否真的存在。请注意,openmp 性能也可能受到环境变量的影响,例如OMP_NUM_THREADS.
  • 您确定您使用的是自己的 opencv 库而不是发行版中的那个吗?用来ldd检查。
于 2019-04-28T07:09:53.460 回答