2016-09-09 151 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 

但他們應該有相同的電子商務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

在我看來,標題「相同的機器」是錯誤的......你在不同的機器上(本地機器vs集羣)有不同的結果。編譯器選項也略有不同。兩者都可能影響浮點計算並導致不同的結果,例如,不同的內部表示,不同的操作順序...... –

+0

您可以通過使用'kind'參數來提高浮點可移植性。 – jlokimlin

+0

@ M.S.B。關於同一臺機器的好處,但是在同一臺機器上,確實與計算順序無關的結果應該是相同的。 –

回答

0

不一致是由編譯選項引起了其他選項。除了-fp源代碼之外,還可以單獨編譯'O0'或編譯'O2'或'O3'來解決問題。這是浮點數學問題。

相關問題