120 likes | 235 Views
プログラミング環境. 推奨するコンパイルオプション 移植のためのコンパイルオプション 自動並列化オプション 科学技術計算ライブラリ. Makefile の例. SHELL= /bin/csh BIN = a.out FFLAGS = -c –64 –O3 –IEEE:arithmetic=3 CFLAGS = -c –64 –O3 –IEEE:arithmetic=3 LFLAGS = -64 LIB = -lmpi -lscs F90 = f90 CC = cc SRC=
E N D
プログラミング環境 推奨するコンパイルオプション 移植のためのコンパイルオプション 自動並列化オプション 科学技術計算ライブラリ
Makefileの例 SHELL= /bin/csh BIN = a.out FFLAGS = -c –64 –O3 –IEEE:arithmetic=3 CFLAGS = -c –64 –O3 –IEEE:arithmetic=3 LFLAGS = -64 LIB = -lmpi -lscs F90 = f90 CC = cc SRC= \ main.f routine1.f routine2.f prog.c OBJ= \ main.o routine1.o routine2.o prog.o $(BIN): $(OBJ) $(F90) $(LFLAGS) -o $(BIN) $(OBJ) $(LIB) .f.o: $(F90) $(FFLAGS) $*.f .c.o: $(CC) $(CFLAGS) $*.c clean: -rm -f core • コンパイラ • f90 [options] .... prog.f ... • cc [options] .... prog.c ... • CC [options] .... prog.cc ...
推奨するコンパイルオプション • % f90 -64 -O3 -OPT:IEEE_arithmetic=3 program.f
32bit/64bitアドレッシングモード • -64 64 bitアドレッシング(2GBの制限なし) • -n32 32 bitアドレッシング(2GBの制限あり) Cデータ型 –n32 –64 Fortranデータ型 [bit] [bit] char 8 8 CHARACTER short 16 16 INTEGER*2 int 32 32 INTEGER long int 32 64 - pointer 32 64 POINTERfloat 32 32 REAL double 64 64 REAL*8 long double 128 128 REAL*16
最適化レベル • -O0全ての最適化を行なわない • -O1 局所的な最適化を実施 • -O2 or –O 広範囲な最適化を実施(保守的) • -O3積極的な最適化を実施
do i = 1, n B(i) = A(i) / C enddo tmp = 1.0/C do i = 1, n B(i) = tmp * A(i) enddo 浮動小数点演算の最適化レベル(1) • IEEE754規格外の最適化: • -OPT:IEEE_arithmetic=1 IEEE754 規格に完全に準拠 • -OPT:IEEE_arithmetic=2 0*X を0 に置き換えたり、X/X を1 に置き換えるといった変換を行ないます。 • -OPT:IEEE_arithmetic=3 積極的に式の変換を行ないます。例えば、X/Y を X*recip(Y)に置き換えます。
浮動小数点演算の最適化レベル(2) 等価な演算への変換: 演算順序変更 (A+B)+(C+D) (A+D)+(B+C) • -OPT:roundoff =0 • コーディングされた演算の順序に従います。浮動小数点演算の結果に影響を与える最適化はほとんど行なわれません。 • -OPT:roundoff =1 • ある限られた範囲で、丸め誤差を増大させるような演算の順序の変更を行ないます。 • -OPT:roundoff =2 • リダクション・ループの演算順序の変更など、より広範囲な変換を行ないます。最適化レベル –O3のデフォルトです。 • -OPT:roundoff =3 • 数学的に等価なあらゆる変換を行ないます。
等価な演算への変換(例) INTEGER i, n COMPLEX c(n) REAL r do i=1, n r = 0.1 * i c(i) = CABS(CMPLX(r,r)) enddo roundoff=3であれば... r = r + 0.1 roundoff=3であれば... c(i) = SQRT(r*r+r*r)
プログラムの移植 • -static • データを静的に割り当て、未定義データはゼロで初期化します。古いFortranプログラムの移植の初期段階に有効です。 • -DEBUG:subscript_check • 配列の領域外参照があった場合、メッセージを出力します。 • 以下の環境変数を設定すると、領域外参照を検出した時点でエラー終了します。 % setenv F90_BOUNDS_CHECK_ABORT YES • -r8 • REAL 変数をREAL*8 へ、COMPLEX 変数をCOMPLEX*16 へ変換する(1) • -i8 • INTEGER を INTEGER*8 へ、 LOGICAL を 8 バイトサイズへ変換する (1) • (1) 注:real*4, complex*8とサイズが明示されている宣言はこの型変換は行なわれません。
自動並列化オプション • -apo • 自動並列化の指定です。OpenMP並列化指示行も有効にします。 • -apokeep • 自動並列化を行うと共にリストを出力します。 • プログラム名.list 診断メッセージ • プログラム名.m OpenMP中間ソースコード • -mp • OpenMP並列化指示行を有効にします。自動並列化は行ないません。 • 並列プログラムのリンク • -apo、または-mpオプションをつけてコンパイルした .oモジュールをリンクするときには、必ず –mpをリンク時に指定してください。
自動並列化オプション ― リスト出力例 .list ファイル ソースコード 1. program ex6 2. parameter(n=10000) 3. real a(n,n), b(n,n), c(n,n) 4. do j=1,n 5. do i=1,n 6. a(i,j)=1. 7. b(i,j)=1. 8. c(i,j)=1. 9. enddo 10. enddo 11. do k=1,n 12. do j=1,n 13. do i=1,n 14. c(j,k) = c(j,k) + a(k,i) + b(i,j) 15. enddo 16. enddo 17. enddo 18. print *,c(1,1) 19. end Parallelization Log for Subprogram MAIN__ 4: PARALLEL (Auto) __mpdo_MAIN__1 5: Not Parallel Loop is contained within a parallel construct. 11: PARALLEL (Auto) __mpdo_MAIN__2 12: Not Parallel Loop is contained within a parallel construct. 13: Not Parallel Loop is contained within a parallel construct.
科学技術計算ライブラリ • ライブラリの内容: • 基本的な線形計算と行列計算パッケージ: • BLAS1, BLAS2, BLAS3 (man intro_blas1,_blas2,_blas3) • LAPACK (man intro_lapack) • 高速フーリエ変換(FFT): • 1次元、2次元、3次元のFFT (man intro_fft) • スパースソルバー(man intro_solvers) • 指定方法: • -lscs 1CPU実行 % f90 test.f -lscs • –mp-lscs_mp並列実行 % f90 -mp test.f -lscs_mp (man intro_libscsl ) 必ずコマンド行の最後に指定