我正在尝试使用英特尔 C++ 编译器制作优化的opencv SURF并行版本,特别是surf.cpp 。
我正在使用 Intel Advisor 来定位低效且未矢量化的循环。特别是,它建议使用icpc
编译器(而不是gcc
)重建代码,然后使用该xCORE-AVX2
标志,因为它可用于我的硬件。
所以我最初cmake
用于构建 opencv 的方法g++
是:
cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D CMAKE_INSTALL_PREFIX=... -D OPENCV_EXTRA_MODULES_PATH=... -DWITH_TBB=OFF -DWITH_OPENMP=ON
并构建了使用 SURF 的应用程序g++ ... -O3 -g -fopenmp
改为使用icpc
的是:
cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D CMAKE_INSTALL_PREFIX=... -D OPENCV_EXTRA_MODULES_PATH=... -DWITH_TBB=OFF -DWITH_OPENMP=ON -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc -DCMAKE_CXX_FLAGS="-debug inline-debug-info -parallel-source-info=2 -ipo -parallel -xCORE-AVX2 -Bdynamic"
(特别注意-DCMAKE_C_COMPILER -DCMAKE_CXX_COMPILER -DCMAKE_CXX_FLAGS
)
并编译了 SURF 应用程序:-g -O3 -ipo -parallel -qopenmp -xCORE-AVX2
和-shared-intel -parallel
用于链接
我认为该icpc
解决方案会比那个更快g++
,但事实并非如此:icpc
需要 0.15 秒,而g++
需要0.12
s (我进行了几次实验,这些数字是可靠的)。
为什么会发生这种情况?我做错了icpc
什么吗?
g++ OpenCV 编译选项(部分由 cmake 生成):
-fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wstrict-prototypes -Winit-self -Wpointer-arith -Wno-narrowing -Wno-comment -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -msse -msse2 -mno-avx -msse3 -mno-ssse3 -mno-sse4.1 -mno-sse4.2 -ffunction-sections -fvisibility=hidden -Wno-unused-but-set-variable -Wno-missing-prototypes -Wno-missing-declarations -Wno-undef -Wno-unused -Wno-sign-compare -Wno-cast-align -Wno-shadow -Wno-maybe-uninitialized -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -Wno-unused-parameter -fPIC -O2 -g -DNDEBUG
icpc OpenCV 编译选项(部分由 cmake 生成):
-fsigned-char -fp-model precise -Wno-implicit-function-declaration -Wno-uninitialized -Wno-missing-prototypes -Wno-unused-but-set-parameter -Wno-missing-declarations -Wno-unused -Wno-shadow -Wno-sign-compare -Wno-unused-parameter -fPIC -O2 -g -DNDEBUG
我注意到一件事:icpc
我指定的标志不包括在内。理论上以下命令在cmake
:
-DCMAKE_CXX_FLAGS="-debug inline-debug-info -parallel-source-info=2 -ipo -parallel -xCORE-AVX2 -Bdynamic"
应该在运行期间添加所有这些标志,make
但运行VERBOSE=1
它只显示我在icpc OpenCV 编译选项中发布的标志(部分由 cmake 生成)。这也很奇怪,因为cmake
执行已完成,这是报告的其中一行:
-- C++ Compiler: /opt/intel/compilers_and_libraries_2017.1.132/linux/bin/intel64/icpc (ver 17.0.1.20161005)
-- C++ flags (Release): -debug inline-debug-info -parallel-source-info=2 -ipo -parallel -xCORE-AVX2 -Bdynamic -fsigned-char -fp-model precise -qopenmp -O3 -DNDEBUG
-- C++ flags (Debug): -debug inline-debug-info -parallel-source-info=2 -ipo -parallel -xCORE-AVX2 -Bdynamic -fsigned-char -fp-model precise -qopenmp -g
-- C Compiler: /opt/intel/compilers_and_libraries_2017.1.132/linux/bin/intel64/icc
-- C flags (Release): -fsigned-char -fp-model precise -qopenmp -O3 -DNDEBUG
-- C flags (Debug): -fsigned-char -fp-model precise -qopenmp -g
正如你所看到的,我包含的优化标志DCMAKE_CXX_FLAGS
出现了,C++ (Debug/Release)
但是当我运行时它们没有出现make VERBOSE=1
,我不知道为什么。
顺便说一句,据我所知,icpc
生成的代码应该总是比g++
(如果他们使用相同的选项,就像在这种情况下)。为什么会发生这种情况?