동일한 피연산자는 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)
제목이 "같은 기계"가 잘못되었습니다 ... 다른 기계 (로컬 시스템 대 클러스터)에서 다른 결과가 있습니다. 또한 약간 다른 컴파일러 옵션. 둘 다 부동 소수점 계산에 영향을 미치고 서로 다른 결과, 예를 들어 내부 표현이 다르거 나 다른 순서의 연산으로 이어질 수 있습니다. –
'kind' 매개 변수를 사용하여 부동 소수점 이식성을 향상시킬 수 있습니다. – jlokimlin
@ M.S.B. 같은 기계에 대해 좋은 점이 있지만, 동일한 기계에서 순서와 관계없는 계산은 동일한 결과를 가져야한다는 것은 사실입니다. –