icpc比gcc慢吗?

时间:2017-02-14 23:18:08

标签: opencv gcc parallel-processing icc intel-parallel-studio

我尝试使用英特尔C ++编译器制作opencv SURF的优化并行版本,特别是surf.cpp

我正在使用英特尔顾问找到效率低下和未实现的循环。特别是,它建议使用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

使用-g -O3 -ipo -parallel -qopenmp -xCORE-AVX2-shared-intel -parallel编译SURF应用程序以进行链接

我认为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++更快的代码(如果他们使用相同的选项,就像在这种情况下一样)。为什么会这样?

0 个答案:

没有答案