我的代码中有一个非常奇怪的错误,当它在Intel XE分析器中运行时,它会在OpenMP部分之前崩溃。
如果我运行命令:
./sphere_benchmark -i ../sphere_team6_dealmesh.prm -m 2 -h 1 -p 3
top显示小型串行部分的100%CPU使用率,当它进入OpenMP块时旋转高达1200%。
但是如果我运行命令:
amplxe-cl -collect concurrency -- ./sphere_benchmark -i ../sphere_team6_dealmesh.prm -m 2 -h 1 -p 3
我看到相同的100%连续部分,但随后停止,并声称没有配置文件区域,因为它正在寻找配置文件并发。如果我将指标更改为' advanced-hotspots',它会对代码进行分析,但只会对OpenMP部分之前的行进行分析! (注意 - 我在现实中使用绝对路径,为简洁起见,此处省略。)
然而,如果我的应用程序在OpenMP部分之前崩溃,我认为它是一个非常干净的崩溃,因为我没有错误,没有警告,即使指定-vv到amplxe-cl
也没有任何不好的事情发生。并且在没有被描述时它运行良好。
我正在使用的程序依赖于dealii库,它是使用icc 16.0.1从源代码构建的,并且具有从源代码构建的所有依赖项的所有依赖项。
我的编译命令看起来有点像:
mpiicpc -DDEBUG -DTBB_DO_ASSERT=1 -DTBB_IMPLEMENT_CPP0X=1 -DTBB_USE_DEBUG -qopenmp -I<incs> -fpic -ansi -w2 -wd68 -wd135 -wd175 -wd177 -wd191 -wd193 -wd279 -wd327 -wd383 -wd981 -wd1418 -wd1478 -wd1572 -wd2259 -wd21 -wd2536 -wd15531 -wd111 -wd128 -wd185 -wd280 -qopenmp-simd -std=c++11 -Wno-return-type -Wno-parentheses -O0 -g -gdwarf-2 -grecord-gcc-switches -o src/curlfunction.cc.o -c src/curlfunction.cc
和我的链接:
mpiicpc -qopenmp -shared-intel -rdynamic -qopenmp <objs> -o sphere_benchmark -rdynamic <libs> -lmkl_intel_lp64 -lmkl_core -lmkl_sequential -lmpifort -lmpi -Wl,-Bstatic -lmpigi -Wl,-Bdynamic -ldl -lrt -lpthread <libs> -Wl,-<libs>
我试图修剪它们以使它们仍然可以读取,同时还包括所有内容。
有英特尔XE经验的人有什么建议吗?我已将我的沮丧-openmp
标记更改为-qopenmp
,根据documentation,它确实不应该这么难。