Opencv icpc比gcc慢? 我试图用英特尔C++编译器来优化优化版本,

Opencv icpc比gcc慢? 我试图用英特尔C++编译器来优化优化版本,,opencv,gcc,parallel-processing,icc,intel-parallel-studio,Opencv,Gcc,Parallel Processing,Icc,Intel Parallel Studio,我正在使用“英特尔顾问”查找效率低下且未分区的循环。特别是,它建议使用icpc编译器(而不是gcc)重建代码,然后使用xCORE-AVX2标志,因为它可用于我的硬件 因此,我最初使用g++构建opencv的cmake是: cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D CMAKE_INSTALL_PREFIX=... -D OPENCV_EXTRA_MODULES_PATH=... -DWITH_TBB=OFF -DWITH_OPENMP=ON 并用g+

我正在使用“英特尔顾问”查找效率低下且未分区的循环。特别是,它建议使用
icpc
编译器(而不是
gcc
)重建代码,然后使用
xCORE-AVX2
标志,因为它可用于我的硬件

因此,我最初使用
g++
构建opencv的
cmake
是:

cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D CMAKE_INSTALL_PREFIX=... -D OPENCV_EXTRA_MODULES_PATH=... -DWITH_TBB=OFF -DWITH_OPENMP=ON
并用
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\u C\u编译器-DCMAKE\u CXX\u编译器-DCMAKE\u CXX\u标志

并使用:
-g-O3-ipo-parallel-qopenmp-xCORE-AVX2
-shared intel-parallel
编译了SURF应用程序,用于链接

我原以为
icpc
解决方案会比
g++
解决方案快,但事实并非如此:
icpc
需要0.15秒,而
g++
需要
0.12
秒(我做了几次实验,这些数字是可靠的)

为什么会发生这种情况?我的
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 
-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 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 
-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\u CXX\u flags
中包含的优化标志出现在
C++(调试/发布)
中,但当我运行
make VERBOSE=1
时,它们不会出现,我不知道为什么


顺便说一句,据我所知,
icpc
应该总是比
g++
生成更快的代码(如果它们使用相同的选项,就像在本例中一样)。为什么会发生这种情况?

您能发布两行内容吗:1)g++的所有编译选项2)g++的所有编译选项icpc@Arseniy我更新了,这是你想要的吗?:)请同时添加g++选项SEHM我在g++OpenCV编译选项(部分由cmake生成)中添加了它们。请发布两行内容:1)g++的所有编译选项2)的所有编译选项icpc@Arseniy我更新了,这是你想要的吗?:)请同时添加g++选项我在g++OpenCV编译选项中添加了它们(部分由cmake生成)