컴파일러 옵션의 양 극단 by 바죠

컴파일러 옵션, 극과 극

과학기술용 계산의 경우, 프로그램 최적화를 위해서 많은 노력을 기울인다.  하지만, 개발 단계에서는 실행 속도 보다 가능한 프로그래밍 실수들을 빨리 잡아내야 한다. 그렇기 때문에, 컴파일러 옵션에서 이 양극단을 함께 고려해야 한다. 알고리듬을 정확하게 이해하고 있다고 해도, 프로그래밍 실수는 상존한다.

사실 컴파일러가 프로그래밍 실수를 찾아 주기 위해서 태어난 것은 아니다. 하지만, 가끔씩은 프로그램에게 많은 정보를 제공한다.
이러한 정보들이 프로그램에게 많은 도움이 된다.
프로그래머는 실수를 할 수 있다. 아무리 유능한 프로그래머라도 마찬가지다.
문제는 자신의 빨리 실수를 빨리 알아차리는 것이 핵심이다. 프로그래머의 능력을 결정하는 지수는 바로 여기에서 출발한다. 

모든것을 체크하면서 천천히 프로그램을 실행, 개발 단계에 한 번씩 사용하면 아주 좋다.
-C

빨리가기위해서 한 번은 느리게 갈 필요가 있다. 가능한한 빠른 계산 위주로 프로그램 실행, 실행 속도 향상을 위해서 반드시 실행해 본다.
-fast


pgf90  -C
pgf90 -fast

ifort -fast
ifort -CB
ifort -check all
ifort -check all -warn interface
ifort -c -check all -warn interface
ifort -c -CB -check all -warn unused
ifort -CB -check all -warn interface -assume realloc_lhs

개발 단계에서 컴파일러 버전을 바꾸어 가면서 테스트를 수행해야 한다.  필요하면 다른 머신으로 가서 테스트를 해 볼 필요가 있다.  병렬 프로그래밍에서도 마찬가지이다. 꼭 C, CB옵션으로 프로그램을 테스트해 볼 필요가 있다. 마치 fortran 프로그램에서 implicit none을 사용하는 것과 마찬가지이다. 단순한 실수를 방지하고 보다 구조적으로 프로그래밍 에러를 잡아내어야 한다.

프로그램 실행 에러는 소스자체의 에러를 넘어서 입력에서의 에러가 있을 수 있음을 의미하기도 한다. 아무튼 실제 상황에서 에러가 발생했다면, -CB 옵션으로 그 원인을 찾아 내어야만 한다.  실제 응용을 위해서는 반드시 필요한 작업이다.

-fast로 컴파일한 프로그램이 에러를 발생할 때, -CB로 다시 컴파일해서 런을 체크해야한다. 실제로 무슨 문제가 있는지 체크해 볼 필요가 있다.

a.out &> output
또는
a.out >& output


http://incredible.egloos.com/4925004



----------------------------------------------------------------------------------------------------------------
프로그램을 완벽하게 만들기 위해서 프로그램 출력은 매우 중요하다.

http://incredible.egloos.com/4223942


사용하지 않는 변수들 잡아 낼 때:
OPT = -CB -check all -warn unused

OPT = -CB -check all -warn interface -assume realloc_lhs

if (.false.) unused=1

gfortran
-Wunused
-Wunused-parameter

– bash: ulimit -c unlimited
– csh: limit coredumpsize unlimited

  • sh, ksh, bash: ulimit Example:
    ulimit -s unlimited # no limit on stack
    ulimit -a # display current settings
    ulimit -aH # display maxima
  • csh: limit and unlimit
    Example:
    unlimit stacksize # no limit on stack
    limit # display current settings
    limit -h # display maxima
    ----------------------------------------------------------------------------------------------------------------

  • Checks during the compilation:
    ifort -warn all
    gfortran -Wall
    ifort -warn all -diag-disable

    Run-time checks:
    ifort -g -traceback -O0 -check all
    gfortran -g -fbacktrace -O0 -fcheck=all

    Floating point exceptions:
    ifort -g -traceback -fpe0
    gfortran -g -fbacktrace -ffpe-trap=invalid,zero,overflow

    ----------------------------------------------------------------------------------------------------------------
    Debugging: compiler options


    Array bound checking (C)
    • Array bound checking is less elaborate than Fortran.
    • PGI:  -Mbounds
    • GNU:  -Warray-bounds (checks static arrays, e.g. strings, at compile-time, included in -Wall)
    • IBM:  -qcheck=bounds (runtime checks, but only static arrays)

    Uninitialized variables
    • If arrays or variables are not initialized, starting conditions might be random, which is usually undesirable.
    • Most compilers can automatically initialize arrays with NaNs.
    • In combination with floating-point exception trapping, your program will fail if a variable is not initialized correctly.
    • IBM C/Fortran:  -qinitauto=FF
    • GNU Fortran:  -finit-real=inf
    • GNU C/PathScale:  -Wuninitialized (automatic variables, compile-time)
    • PathScale:  -trapuv (initialize local vars to NaN, trap floating-point exceptions)
    • valgrind also detects the use of uninitialized variables.
    • The output can be overwhelming if used for the first time.
    • A warning is given at the point where output is generated that ultimately depends on uninitialized values.
    • The option --track-origins=yes shows the line where the uninitialized values originate.

    Check for null pointers
    • An application will fail anyway when using a null pointer. A stacktrace or core dump will quickly reveal the bug.
    • PGI: -Mchkptr
    • IBM: -qcheck=nullptr

    Source code conformance checking (Fortran)
    • IBM: xlf_r -qlanglvl=f95pure
    • GNU: gfortran -pedantic -std=f95 (not fully functional)
    • PGI: -Mstandard

    Source code conformance checking (C)
    • IBM: xlc_r -qlanglvl=stdc89
    • GNU: gcc -pedantic -std=c90 (not fully functional)
    • PGI: -Mstandard
    • PathScale: -std=c89 -pedantic-errors

    Argument checking (Fortran)
    • Fortran 77 does no argument checking, not even the nr. of arguments. Less arguments could easily create segmentation faults.
    • Fortran 90 modules check the nr. and type of arguments at compile-time.
    • Example: libfgz..

    Argument checking (C)
    • use of header files to define functions.
    • Danger of mismatch between include-file and sourcefile.
    • IBM: -qextchk (compile-time option to check arguments at link-time)
    • GNU: -Wstrict-prototypes (warning if argument type is not specified)

    Strict typing (Fortran)
    • “God is real, unless declared integer”
    • If variables are not declared, by default they get a type depending on their name: variables that start with the letter I-N are integers, otherwise reals.
    • IMPLICIT NONE forces you to type all variables.
    • GNU: -fimplicit-none

    Warnings about questionable constructs
    • E.g. implicit variables, wrong return type, unused functions or variables.
    • GNU C/Fortran: -Wall -Wextra
    • GNU C/Fortran: -Wformat (check argument types against format string)

    Auto-deallocation
    • Fortran 95 defines that ALLOCATABLE arrays are automatically deallocated when they go out of scope, whereas Fortran 90 does not require this.
    • IBM XL Fortran (xlf) only automatically deallocates when specifically asked for Fortran 95 conformance, or when using -qxlf90=autodealloc
    • Intel Fortran (ifort) uses the Fortran 95 behaviour by default.

    Aliasing
    • In C two pointers can point to the same data.
    • When changing data at one pointer, the data at the other changes as well.
    • GNU C: -fstrict-aliasing -Wstrict-aliasing=
    • The Fortran standard forbids the use of aliasing, and this makes Fortran often faster than C. Since this can't be enforced, it could cause bugs. However, the absence of pointers in Fortran makes it less likely to occur.

    Floating-point exceptions
    • are usually not trapped for performance reasons.
    • But you might want to check if your program produces division-by-zeros, overflow, invalid operations or underflow.
    • Don't check for 'imprecise' operations, since virtually all operations are imprecise.

    Floating point exceptions (Fortran)
    • IBM: -qflttrap=en:zerodivide
    • GNU: -ffpe-trap=zero,precision,invalid,overflow,underflow
    • PGI: -Ktrap=

    Floating point exceptions (C)
    • or on linux or glibc-based systems, use the feenableexce call
    • IBM: -qflttrap=en:zerodivide, -qcheck=divzero
    • GNU: -ftrapping-math (default)
    • PGI: -Ktrap=

    Large summations
    • The partial sum could get much larger than the individual terms.
    • Round-off error adds up
    • Using higher-precision: be sure that the compiler does not implicitly lower the precision!
    • Kahan-summation formula (no optimization!)

    Using floating-point in equality comparisons
    Fortran: if (a.eq.b) .. do some calculation ..
    C: if (a==b) { .. do some calculation .. }
    • floating-point numbers are only approximations of real numbers, so there is always an error.
    • to compare two floating-points you should estimate the likely maximum error and compare that to the difference.
    • GNU C: -Wfloat-equal (warns when floating-point equality)

    Using floating-point in equality comparisons
    Fortran: if (a.eq.b) .. do some calculation ..
    C: if (a==b) { .. do some calculation .. }
    • floating-point numbers are only approximations of real numbers, so there is always an error.
    • to compare two floating-points you should estimate the likely maximum error and compare that to the difference.
    • GNU C: -Wfloat-equal (warns when floating-point equality)



    ----------------------------------------------------------------------------------------------------------------

    a2ps:
            a2ps --prologue=color -o action_multi.ps action_multi.f90 ; a2ps --prologue=color -o action_lbfgs.ps action_lbfgs.f90 ; a2ps --prologue=color -o multivasp.ps multivasp.f90 ; a2ps --prologue=color -o multi_arc_length.ps multi_arc_length.f90 ; a2ps --prologue=color -o multi_eql_arc.ps multi_eql_arc.f90 ; a2ps --prologue=color -o multi_app_eql_arc.ps multi_app_eql_arc.f90 ; a2ps --prologue=color -o app_real_equal.ps app_real_equal.f90 ; a2ps --prologue=color -o opt_equal_dist.ps opt_equal_dist.f90 ; a2ps --prologue=color -o rand_path.ps rand_path.f90 ; a2ps --prologue=color -o qst_lst_path.ps qst_lst_path.f90 ; a2ps --prologue=color -o xyz2ak0.ps xyz2ak0.f90
    a2psblack:
            a2ps --medium=A4 --line-numbers=1 -o action_multi.ps action_multi.f90 ; a2ps --medium=A4 --line-numbers=1 -o action_lbfgs.ps action_lbfgs.f90 ; a2ps --medium=A4 --line-numbers=1 -o multivasp.ps multivasp.f90 ; a2ps --medium=A4 --line-numbers=1 -o multi_arc_length.ps multi_arc_length.f90 ; a2ps --medium=A4 --line-numbers=1 -o multi_eql_arc.ps multi_eql_arc.f90 ; a2ps --medium=A4 --line-numbers=1 -o multi_app_eql_arc.ps multi_app_eql_arc.f90 ; a2ps --medium=A4 --line-numbers=1 -o app_real_equal.ps app_real_equal.f90 ; a2ps --medium=A4 --line-numbers=1 -o opt_equal_dist.ps opt_equal_dist.f90 ; a2ps --medium=A4 --line-numbers=1 -o rand_path.ps rand_path.f90 ; a2ps --medium=A4 --line-numbers=1 -o qst_lst_path.ps qst_lst_path.f90 ; a2ps --medium=A4 --line-numbers=1 -o xyz2ak0.ps xyz2ak0.f90
    ps2pdf:
            ps2pdf -sPAPERSIZE=a4 action_multi.ps ; ps2pdf -sPAPERSIZE=a4 action_lbfgs.ps  ; ps2pdf -sPAPERSIZE=a4 multivasp.ps ; ps2pdf -sPAPERSIZE=a4 multi_arc_length.ps ; ps2pdf -sPAPERSIZE=a4 multi_eql_arc.ps ; ps2pdf -sPAPERSIZE=a4 multi_app_eql_arc.ps ; ps2pdf -sPAPERSIZE=a4 app_real_equal.ps ; ps2pdf -sPAPERSIZE=a4 opt_equal_dist.ps ; ps2pdf -sPAPERSIZE=a4 rand_path.ps ; ps2pdf -sPAPERSIZE=a4 qst_lst_path.ps ; ps2pdf -sPAPERSIZE=a4 xyz2ak0.ps

    ----------------------------------------------------------------------------------------------------------------
    cmpl=ifort
    segl=ifort
    #OPT = -fast
    #OPT = -check all
    OPT = 
    OPT =  -O2
    OPT = -CB -check all -warn interface -assume realloc_lhs
    FFLAGS = -c ${OPT}
    FFLAGSc = -c

    FILES= csa_admd.o aandb0.o frechet.o xmassft.o u3b.o onedprint10.o init_seed.o strings.o timestamp.o sortnr.o numeral.o sint.o rmarin.o

    /home/ihlee/csa_admd/csa_admd.x: $(FILES)       
            $(segl) -o /home/ihlee/csa_admd/csa_admd.x $(FILES)
    csa_admd.o:csa_admd.f90 frechet.o strings.o
            $(cmpl) $(FFLAGS) csa_admd.f90
    aandb0.o:aandb0.f90
            $(cmpl) $(FFLAGS) aandb0.f90
    frechet.o:frechet.f90
            $(cmpl) $(FFLAGS) frechet.f90
    xmassft.o:xmassft.f90
            $(cmpl) $(FFLAGS) xmassft.f90
    timestamp.o:timestamp.f90
            $(cmpl) $(FFLAGS) timestamp.f90
    strings.o:strings.f90
            $(cmpl) $(FFLAGS) strings.f90
    sortnr.o:sortnr.f90
            $(cmpl) $(FFLAGS) sortnr.f90
    init_seed.o:init_seed.f90
            $(cmpl) $(FFLAGS) init_seed.f90
    rmarin.o:rmarin.f90
            $(cmpl) $(FFLAGS) rmarin.f90
    onedprint10.o:onedprint10.f90
            $(cmpl) $(FFLAGS) onedprint10.f90
    numeral.o:numeral.f
            $(cmpl) $(FFLAGS) numeral.f
    sint.o:sint.f
            $(cmpl) $(FFLAGSc) sint.f
    u3b.o:u3b.f
            $(cmpl) $(FFLAGS) u3b.f

    clean:
            rm -f *.x *.o *.mod *.M core*  *.ps  *.ps~  *__genmod.f90  *~
    touch:
            touch *.f90 *.i makefile ; chmod 600 *.f90 *.i makefile ; ls -l *.f90 *.i makefile
    rmo:
            rm -f *.o *.mod *.M core*  *.ps~  *__genmod.f90   *.ps  *.pdf *.pdf~
    wc:
            wc csa_admd.f90 aandb0.f90 frechet.f90 xmassft.f90 u3b.f onedprint10.f90 init_seed.f90 timestamp.f90 sortnr.f90 strings.f90 rmarin.f90 numeral.f sint.f
    lsl:
            ls -l *.f90 makefile *.i
    a2ps:
            a2ps -o csa_admd.ps csa_admd.f90 --prologue=color ; a2ps -o aandb0.ps aandb0.f90 --prologue=color ; a2ps -o frechet.ps  frechet.f90 --prologue=color
    a2psblack:
            a2ps -o csa_admd.ps csa_admd.f90 --medium=A4 --line-numbers=1 ; a2ps -o aandb0.ps aandb0.f90 --medium=A4 --line-numbers=1 ; a2ps -o frechet.ps  frechet.f90 --medium=A4 --line-numbers=1
    ps2pdf:
            ps2pdf -sPAPERSIZE=a4 csa_admd.ps ; ps2pdf -sPAPERSIZE=a4 aandb0.ps ; ps2pdf -sPAPERSIZE=a4 frechet.ps

    ----------------------------------------------------------------------------------------------------------------

    핑백

    덧글

    • 2013/07/04 12:13 # 답글 비공개

      비공개 덧글입니다.
    • 2013/07/04 17:45 # 비공개

      비공개 답글입니다.
    • 바죠 2015/07/09 10:00 # 삭제 답글

      -CB -check all -warn interface -assume realloc_lhs
      -CB
      -check all

      -C
    댓글 입력 영역

    최근 포토로그