同じオペランドは、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
しかし、同じeを持つ必要がありますxact値は、要素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)
"同じマシン"というタイトルは間違っています...あなたは異なるマシン(ローカルマシンとクラスタ)で異なる結果を持っています。やや異なるコンパイラオプション。どちらも浮動小数点計算に影響を与え、異なる内部表現、異なる演算順序など異なる結果につながる可能性があります。 –
浮動小数点の移植性を向上させるには、「kind」パラメータを使用します。 – jlokimlin
@ M.S.B。同じマシンについての良い点ですが、同じマシンでは、オーダーに依存しない計算で同じ結果が得られるはずです。 –