我正在尝试编译多个FORTRAN源文件,其中我将一些OpenMP指令应用于其中一个源文件。例如:
COMPILE00='ifort -O3 -openmp -openmp_report -fpconstant -fp-model precise -fpe0 -traceback -ftrapuv'
COMPILE0='ifort -O3 -fpconstant -fp-model precise -fpe0 -traceback -ftrapuv'
$COMPILE0 -c microprm.F90 modules.F90
$COMPILE0 -c jernewf3p_A.F90 SMAX.F90 DE_MOTT.F90 twoinitm.F90 helek03.F90
$COMPILE00 -c helek04.F90
$COMPILE0 -c jernewf3p_melt.F90 dmin_G.F90
$COMPILE0 -c submelt_condevap.F90
$COMPILE00 -o TKE.x *.o -lm
因此源代码helek04.F90
有一些OpenMP指令。它是从submelt_condevap.F90
调用的,但没有。
这是正确的编译实践吗?我应该如何使用use omp_lib
模块进行编译?使用OpenMP只编译一个文件并用OpenMP链接所有其他文件是否代码安全?
汇编已中止。当使用$ COMPILE00为所有文件进行编译时,模拟运行,但会获得浮点异常,这在串行代码中不会发生。
答案 0 :(得分:4)
可能会出现几个问题。不幸的是,您的描述不够详细。我通常建议对所有文件使用-openmp
,我没有看到进行区分的理由。默认情况下,英特尔Fortran不会使代码重入,如果您调用未使用-openmp
从并行区域编译的子例程,则可能会出现竞争条件。特别是在I / O操作期间,问题很可能发生。如果您有一些奇怪的理由要避免-openmp
,可以尝试-reentrancy threaded
。
如果没有从并行部分调用其他代码,并且它不与非并行部分同时运行,则不应该存在问题。
您的OpenMP代码中很可能存在竞争条件或其他线程问题。使用编译器集合中包含的工具来调试它们。 Intel Inspector XE是解决这些问题的好工具。使用-warn -check -g -traceback
等选项进行一些有用的检查。 Valgrind也很有用。