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生成)