2016-09-09 26 views
0

同じオペランドは、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) 
+1

"同じマシン"というタイトルは間違っています...あなたは異なるマシン(ローカルマシンとクラスタ)で異なる結果を持っています。やや異なるコンパイラオプション。どちらも浮動小数点計算に影響を与え、異なる内部表現、異なる演算順序など異なる結果につながる可能性があります。 –

+0

浮動小数点の移植性を向上させるには、「kind」パラメータを使用します。 – jlokimlin

+0

@ M.S.B。同じマシンについての良い点ですが、同じマシンでは、オーダーに依存しない計算で同じ結果が得られるはずです。 –

答えて

0

このエラーが発生し、他のオプションです。単独でコンパイルするか、-fpソースに加えて 'O2'や 'O3'でコンパイルして問題を解決してください。浮動小数点数学の問題でした。

関連する問題