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

제목이 "같은 기계"가 잘못되었습니다 ... 다른 기계 (로컬 시스템 대 클러스터)에서 다른 결과가 있습니다. 또한 약간 다른 컴파일러 옵션. 둘 다 부동 소수점 계산에 영향을 미치고 서로 다른 결과, 예를 들어 내부 표현이 다르거 나 다른 순서의 연산으로 이어질 수 있습니다. –

+0

'kind' 매개 변수를 사용하여 부동 소수점 이식성을 향상시킬 수 있습니다. – jlokimlin

+0

@ M.S.B. 같은 기계에 대해 좋은 점이 있지만, 동일한 기계에서 순서와 관계없는 계산은 동일한 결과를 가져야한다는 것은 사실입니다. –

답변

0

일관되지는 컴파일 옵션에 의해 발생 된이 오류를 생성 한 다른 옵션입니다. 혼자서 'O0'로 컴파일하거나 -fp 소스 외에 'O2'또는 'O3'로 컴파일하여 문제를 해결하십시오. 부동 소수점 수학에 문제가있었습니다.

관련 문제