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)
在我看來,標題「相同的機器」是錯誤的......你在不同的機器上(本地機器vs集羣)有不同的結果。編譯器選項也略有不同。兩者都可能影響浮點計算並導致不同的結果,例如,不同的內部表示,不同的操作順序...... –
您可以通過使用'kind'參數來提高浮點可移植性。 – jlokimlin
@ M.S.B。關於同一臺機器的好處,但是在同一臺機器上,確實與計算順序無關的結果應該是相同的。 –