相同的操作数在fortran90语言中使用REAL类型单精度产生不同的结果,并且看起来编译器选项会产生不同的结果。
real , dimension(n_pft) :: sapwood_ratio
real , dimension(n_pft) :: qsw
real , dimension(n_pft) :: SLA
!these 4 variables are also real type
sla_scale = 0.1 * C2B
sla_inter = 2.4
sla_slope = -0.46
leaf_turnover_rate(2) = 1.0
leaf_turnover_rate(3) = 0.5
leaf_turnover_rate(4) = 1./3.
leaf_turnover_rate(12) = 1.0
leaf_turnover_rate(13) = 0.5
leaf_turnover_rate(14) = 1./3.
sapwood_ratio(1:17) = 3900.0
SLA( 2) = 10.0**(sla_inter + sla_slope * log10(12.0/leaf_turnover_rate( 2))) * sla_scale
SLA( 3) = 10.0**(sla_inter + sla_slope * log10(12.0/leaf_turnover_rate( 3))) * sla_scale
SLA( 4) = 10.0**(sla_inter + sla_slope * log10(12.0/leaf_turnover_rate( 4))) * sla_scale
SLA(12) = 10.0**(sla_inter + sla_slope * log10(12.0/leaf_turnover_rate(12))) * sla_scale
SLA(13) = 10.0**(sla_inter + sla_slope * log10(12.0/leaf_turnover_rate(13))) * sla_scale
SLA(14) = 10.0**(sla_inter + sla_slope * log10(12.0/leaf_turnover_rate(14))) * sla_scale
到此为止的所有内容都完美匹配,但是当我计算
时qsw(1:4) = SLA(1:4) / sapwood_ratio(1:4)
qsw(5:13) = SLA(5:13) / sapwood_ratio(5:13)
qsw(14:15) = SLA(14:15) / sapwood_ratio(14:15)
当我在群集上运行时,我得到了
qsw(3) 0.0029858516063541173934937
qsw(13) 0.0029858518391847610473633
在我的本地机器
qsw(3) 0.0029858518391847610473633
qsw(13) 0.0029858518391847610473633
但它们应该具有相同的确切值,就像元素2/12和4/14一样。此外,其他类似的计算也应该匹配。相同的代码在另一台机器上运行得很好,并且使用相同的包装器mpif90,但是使用gfortran,作为加载器和稍微不同的编译选项,两者都有-O3。无论如何,为什么这个计算在同一台机器上没有产生相同的结果? 当我使用这些选项进行编译时,此结果可以正常工作,但它没有进行优化。
USE_INTERF=0
F_OPTS= -FR -O0 -recursive -check all -g -debug extended -debug-parameters used \
-fpe0 -no-ftz -traceback -ftrapuv -fp-stack-check -implicitnone \
-assume byterecl -warn unused -warn uncalled -warn usage -gen-interfaces
C_OPTS= -O0 -DLITTLE -g -traceback
LOADER_OPTS=$(F_OPTS)
这是产生此错误的另一个选项
USE_INTERF=1
F_OPTS= -FR -O3 -recursive -traceback -assume byterecl
C_OPTS= -O3 -DLITTLE -traceback
F_LOWO_OPTS=-FR -O2 -recursive -traceback -assume byterecl
LOADER_OPTS=$(F_OPTS)
答案 0 :(得分:0)
不一致是由编译选项引起的。除了-fp源之外,单独使用'O0'进行编译或使用'O2'或'O3'进行编译,可以解决问题。这是浮点数学的一个问题。