使用其他几个非OpenMP源文件编译和运行单个OpenMP源文件

时间:2014-06-22 06:31:50

标签: fortran openmp fortran90

我正在尝试编译多个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为所有文件进行编译时,模拟运行,但会获得浮点异常,这在串行代码中不会发生。

1 个答案:

答案 0 :(得分:4)

可能会出现几个问题。不幸的是,您的描述不够详细。我通常建议对所有文件使用-openmp,我没有看到进行区分的理由。默认情况下,英特尔Fortran不会使代码重入,如果您调用未使用-openmp从并行区域编译的子例程,则可能会出现竞争条件。特别是在I / O操作期间,问题很可能发生。如果您有一些奇怪的理由要避免-openmp,可以尝试-reentrancy threaded

如果没有从并行部分调用其他代码,并且它不与非并行部分同时运行,则不应该存在问题。

您的OpenMP代码中很可能存在竞争条件或其他线程问题。使用编译器集合中包含的工具来调试它们。 Intel Inspector XE是解决这些问题的好工具。使用-warn -check -g -traceback等选项进行一些有用的检查。 Valgrind也很有用。