Download - Yaminabe fortran

Transcript
Page 1: Yaminabe fortran

温故知新・Fortran / @n_scattering 1

温故知新・FORTRAN田名部 誠一

@n_scattering2012/9/15

Page 2: Yaminabe fortran

自己紹介2

� 田名部 誠一

� [Twitter] @n_scattering

� [facebook]http://www.facebook.com/seiichi.tanabetanabu

�東北人と関東人のハーフ

博士課程の研究テーマ、中性子散乱が由来です。

た な べ(ぶ) せいいち

2012/9/15温故知新・Fortran / @n_scattering

�東北人と関東人のハーフ

�日本の産業界・研究開発の黒子としてHPC (High-Performance Computing) などの技術者として従事

�非研究者博士(役に立っていない)

Page 3: Yaminabe fortran

Agenda3

1. はじめに

2. Fortranとは

3. Fortranの歴史

4. 現在使用できるFortran処理系

2012/9/15温故知新・Fortran / @n_scattering

4. 現在使用できるFortran処理系

5. Fortran入門

6. 大規模科学技術計算への道

Page 4: Yaminabe fortran

はじめに

� 3/31に開催された、第

1回闇鍋プログラミング勉強会に参加。(@東京工科大学)工科大学)

� 今まで親しみのなかった言語について、数多くのトピック提供で、刺激を受けた。

2012/9/15温故知新・Fortran /

@n_scattering4

Page 5: Yaminabe fortran

はじめに5

� 学生だった頃、原子分子物理学(化学?)をテーマに研究を行いました。

�ちなみに、twitter nameは、「中性子散乱」をテーマにしていたことに由来します。

2012/9/15温故知新・Fortran / @n_scattering

� (実験ではなく)理論的研究でしたので、もっぱら計算機を回していました。

� そのときに使用していた言語がFortran (フォートラン)です。

Page 6: Yaminabe fortran

はじめに6

� 今は、研究とかプログラミングから離れて久しいですが、HPC業界として、計算機を取り扱う仕事柄、たまにFortranを思い出す機会があります。

2012/9/15温故知新・Fortran / @n_scattering

を思い出す機会があります。

� そんなわけで、今回、Fortranの歴史を振り返りつつ、話をしていこうと思います。

Page 7: Yaminabe fortran

計算科学とは7

� 自然界や人工の系についてのモデルを詳しく研究して、深く理解しようとする分野。

�解析的には答えられない(答えが数式では表現できない)

2012/9/15温故知新・Fortran / @n_scattering

(答えが数式では表現できない)

�人間が解くには複雑すぎてどうしようもない

�こういった課題をコンピュータを使って解決する

� 更に進展し、CAEなどに応用される

θL

m

Page 8: Yaminabe fortran

計算科学とは8

� コンピュータは

�高機能な電卓

�複雑なシステムを数値的にシミュレートする実験室

2012/9/15温故知新・Fortran / @n_scattering

�人間の知能を拡大してくれる道具

� 最大の力を発揮:3役割を同時に機能するとき

� 計算科学で最も使われている言語がFortran

Page 9: Yaminabe fortran

Fortranとは

� 1954年にIBMのジョン・

バッカスのチームによって考案されたコンピュータにおける史上初の高水準記述言語高水準記述言語

� 「FORTRAN」 の由来は「数式翻訳」→「formula translation」

2012/9/15温故知新・Fortran /

@n_scattering9

Page 10: Yaminabe fortran

Fortranとは10

� FORTRAN/Fortranは科学技術計算に特化した手続き型プログラミング言語

� 長い歴史に支えられ、多くの数学関数やサブルーチンをライブラリで持つ

2012/9/15温故知新・Fortran / @n_scattering

チンをライブラリで持つ

� 他の言語より高速 (←最適化しやすい)

� 古くから、複素数も取り扱えた(複素数を当たり前のように使う、電気関係や量子力学関係のファンが多い)

Page 11: Yaminabe fortran

Fortranとは11

� 広く使われていたFORTRAN77では・・・

� 数式を簡便に書ける� ほぼ数学の数式通りに計算式を記述できる。もっともこの特徴は他に計算向きの高級言語がなかった時代の話であり、現代の水準では「プログラミング言語における標準数式表現の始

2012/9/15温故知新・Fortran / @n_scattering

の水準では「プログラミング言語における標準数式表現の始祖」といった方が当たっている。

� 出力が容易� 簡単に出力形式を定義できるFORMAT文や、実際の出力デバイスを意識しないで済む入出力文がある(C言語の標準入出力と似た概念である)。

Page 12: Yaminabe fortran

Fortranとは12

� スタック指向/構造化指向の言語ではない

� COMMON文、BLOCK DATA文やSAVE文など、データを固定的に割り当てることを前提としている。

� 固定形式の書式である

2012/9/15温故知新・Fortran / @n_scattering

� 固定形式の書式である

�記述方法がカラム位置で決まっている(一部の実装では拡張されている)

�かつて、穿孔カードを用いていた由来

�古くさい

Page 13: Yaminabe fortran

Fortranとは13

� Fortran 90/95・・・では

�数値計算プログラムを簡単かつ簡潔に記述できる。

�プログラムの誤りを犯しにくい言語である。

�数値計算のための便利な道具があらかじめ用意され

2012/9/15温故知新・Fortran / @n_scattering

�数値計算のための便利な道具があらかじめ用意されている。 (言語仕様・ライブラリ)

�作成したプログラムを大規模高速演算に使用

�無料のコンパイラが公開されている。gFortran, g95, Intel Fortran Composer 等

Page 14: Yaminabe fortran

Fortranの歴史

� IBMのジョン・ワーナー・バッカス (John Warner Backus,

1924年12月3日 - 2007年3月17日)のチームにより

14

により

� IBM 704 メインフレームのためのFORTRANの設計と開発(1954~)

�目的はミサイルの軌道計算のプログラムの簡略化

2012/9/15温故知新・Fortran / @n_scattering

Page 15: Yaminabe fortran

Fortranの歴史15

� 1957 IBM704用FORTRAN

� 1966 American Standards Association

(現ANSI)による規格制定

FORTRAN66

2012/9/15温故知新・Fortran / @n_scattering

� 1978 FORTRAN77

� 1991 Fortran90

� 95, 2003, 2008・・・今に至る

世代間の断絶(やや大げさ)

Page 16: Yaminabe fortran

Fortranの歴史16

� FORTRAN77が利用されてきた期間が長かった。(今もこよなく愛する人もいるくらい)

� Fortran90/95で大きく仕様が変更された。

2012/9/15温故知新・Fortran / @n_scattering

� Fortran90/95で大きく仕様が変更された。

� 今現在も、メジャー/マイナーな仕様変更が地味に行われ、現実の処理系に反映されつつある。

Page 17: Yaminabe fortran

Fortranの歴史17

� FORTRAN77とFortran90との比較

�フリーフォームソース入力と小文字のFortranキーワード。プログラム本文を7桁目から書かなくても良く、80桁の制限も無い。

2012/9/15温故知新・Fortran / @n_scattering

�変数の長さも32文字までOK

�配列演算(配列ごとにまとめて計算できる)

� Do While文の実装

� FORTRANからFortranへ

Page 18: Yaminabe fortran

現在使用できるFortran処理系18

� 今も生き続けるFortranの世界

� 現在利用できる処理系

�無償

�Gfortran、G95

自宅でもFortran焼肉が楽しめる

2012/9/15温故知新・Fortran / @n_scattering

�Gfortran、G95

� Intel Fortran Composer (非商用利用に限り)

�有償

� Intel Visual Fortran

� PGI Fortran

� NAG Fortran ・・・etc.

Linux版に限る

Page 19: Yaminabe fortran

Fortran入門19

� 近代的な高級言語は論理構造ブロックを持っている

�書いてある順(linear)に実行する(上から下)

� N回の繰り返し(do~enddo)

2012/9/15温故知新・Fortran / @n_scattering

� N回の繰り返し(do~enddo)

� If-Then-Else

� (回数未定の繰り返し) (While)

� ただし、古くさい仕様もある。GOTOなど。

Page 20: Yaminabe fortran

Fortran入門20

� 逐次実行の例

� 半径rを持つ円

の面積を求める

Program area

c

c area of circle, input r

implicit none

REAL*8 pi ,r, a

c calculate pi

pi=3.1415926535d0

2012/9/15温故知新・Fortran / @n_scattering

る pi=3.1415926535d0

c read r from standard input (terminal)

write(*,*) 'Input Radius'

read(*,*) r

c calculate area

a = pi * r**2

c write area onto terminal screen

write (*,10) 'radius r=',r, 'a =',a

10 Format (a10, e20.10, a5, e22.12)

Stop 'area'

End

Page 21: Yaminabe fortran

Fortran入門21

� N回の繰り返し

do i = i1, i2

2012/9/15温故知新・Fortran / @n_scattering

do i = i1, i2

(処理)end do

Page 22: Yaminabe fortran

Fortran入門22

� 繰り返し実行の例Program diff

Implicit None

c Declarations

c h stepsize for approximation, xrange and xstepsize

c

2012/9/15温故知新・Fortran / @n_scattering

c

Real*8 f, h, result(3), x, xmin, xmax, xstep

Open(6, File='diff.dat', Status='Unknown')

h = 1.e-3

xmin = 0.0

xmax = 7.0

xstep = 0.01

Do 10 x=xmin, xmax, xstep

result(1) = (f(x+h) - f(x))/h

result(2) = (f(x+h/2) - f(x-h/2))/h

result(3) = (8*(f(x+h/4)-f(x-h/4)) - (f(x+h/2)-f(x-h/2)))/(3*h)

Write (6, 20) x, result(1), result(2), result(3)

10 Continue

Page 23: Yaminabe fortran

Fortran入門23

� 関数f(x)の数値微分(3パターン実施)

・・・続く

2012/9/15温故知新・Fortran / @n_scattering

10 Format(F5.3, TR4, F10.8, TR4, F10.8, TR4, F10.8)

Close(6)

Stop 'data saved in diff.dat'

End

c

c the function we want to integrate

Function f(x)

Implicit none

Real*8 f, x

f = cos(x)

Return

End

微分する関数の定義

Page 24: Yaminabe fortran

Fortran入門24

� result(1) = (f(x+h) - f(x))/h

� result(2) = (f(x+h/2) - f(x-h/2))/h

2012/9/15温故知新・Fortran / @n_scattering

� result(3) = (8*(f(x+h/4)-f(x-h/4)) -

(f(x+h/2)-f(x-h/2)))/(3*h)

Page 25: Yaminabe fortran

Fortran入門25

� If-Then-Else

if (条件1) then(処理1)

elseif (条件2) then

2012/9/15温故知新・Fortran / @n_scattering

elseif (条件2) then

(処理2)

else

(処理3)

endif

Page 26: Yaminabe fortran

Fortran入門26

� 条件分岐の例

� いわゆる「Fizz-Buzz」の簡単な例

Program fizzbuzz

C

implicit none

integer i,fb

do i=1,30

fb=0

if(mod(i,3).eq.0) then

write(*,*) 'fizz'

fb=1

2012/9/15温故知新・Fortran / @n_scattering

例 fb=1

endif

if(mod(i,5).eq.0) then

write(*,*) 'buzz'

fb=1

endif

if (fb.eq.0) then

write(*,*) i

endif

enddo

Stop 'fizzbuzz'

End

Page 27: Yaminabe fortran

Fortran入門27

� 回数未定の繰り返し

do while (条件1)

(処理1)

2012/9/15温故知新・Fortran / @n_scattering

� Fortran90で標準で実装されたので、FORTRAN77では実装されていない処理系がある。

( 1)

end do

Page 28: Yaminabe fortran

Fortran入門28

� よく使われる数値演算ライブラリ

� BLAS (ベクトルと行列に関する基本線型代数操作)

� LAPACK (線型計算のための数値解析ソフトウェアライブラリ)

� FFTW (高速フーリエ変換のためのライブラリ)

2012/9/15温故知新・Fortran / @n_scattering

� FFTW (高速フーリエ変換のためのライブラリ)

� AMD ACML

� 市販などのライブラリ

� Intel MKL

�などなど

Page 29: Yaminabe fortran

大規模科学技術計算への道29

� 最近のマシン(単体ワークステーションなど)では、1台の計算機に複数のコア、複数のCPUが利用可能な場合が増えています。

� このような環境の場合には、OpenMPを使って、複

2012/9/15温故知新・Fortran / @n_scattering

� このような環境の場合には、OpenMPを使って、複

数のコアを有効活用して並列処理することが可能です。

� OpenMPは、Fortran処理系に実装されています。

Page 30: Yaminabe fortran

大規模科学技術計算への道30

2012/9/15温故知新・Fortran / @n_scattering

Page 31: Yaminabe fortran

大規模科学技術計算への道31

� CPUの各コアに、ジョブを分け与えて、「分担作業」で全体の計算時間を短縮する。

� 計算時間が1/N(コア数)となってくれるのが理想だが、一人でやる作業:各コアに平等にジョブを分ける作業

2012/9/15温故知新・Fortran / @n_scattering

�各コアに平等にジョブを分ける作業

�各コアの作業が終わって、結果をまとめる作業

があるため、単純には1/Nとはなってくれない。

� 一人でやる作業をできるだけ少なくする匠の技

Page 32: Yaminabe fortran

大規模科学技術計算への道32

� PCサーバなどをネットワークなどで相互に接続し、PCクラスタを構築する場合もあります。

� 複数の計算機を協調して動かすために、互いの計算機同士と通信しあう必要性があり、

2012/9/15温故知新・Fortran / @n_scattering

計算機同士と通信しあう必要性があり、そのため、MPI (Message Passing Interface)が必要になります。

� MPIはMPICH2、OpenMPIなどがあり、処理系に応じて構築する必要があります。

Page 33: Yaminabe fortran

大規模科学技術計算への道33

2012/9/15温故知新・Fortran / @n_scattering

Page 34: Yaminabe fortran

大規模科学技術計算への道34

� ネットワークに接続されている全マシンにあるCPUの各コアに、ジョブを分け与えて、「分担作業」で全体の計算時間を短縮する。

� 計算時間が1/N(コア数)となってくれるのが理想だが

2012/9/15温故知新・Fortran / @n_scattering

が�各コアに平等にジョブを分ける作業

�各コアの作業が終わって、結果をまとめる作業

�ノードをまたぐ際に、通信で時間が掛かる

があるため、単純には1/Nとはなってくれない。

Page 35: Yaminabe fortran

まとめ35

1. はじめに

2. Fortranとは

3. Fortranの歴史

4. 現在使用できるFortran処理系

2012/9/15温故知新・Fortran / @n_scattering

4. 現在使用できるFortran処理系

5. Fortran入門

6. 大規模科学技術計算への道

Page 36: Yaminabe fortran

最後に (フォートランの歌)36

おおブレネリ あなたの言語はなに?私の言語はフォートランよ 数値計算が得意なのよヤーーッフォー フォートランランラン

ヤッフォー フォートランランランヤッフォー フォートランランランヤッフォー フォートランランラン

2012/9/15温故知新・Fortran / @n_scattering

ヤッフォー フォートランランランヤーーッフォー フォートランランラン

ヤッフォー フォートランランランヤッフォー フォートランランランヤッフォーフォー

(いろいろなところで語り継がれています。)

Page 37: Yaminabe fortran

参考文献37

� Wikipedia 「FORTRAN」の項目

� 小柳義夫監訳 「計算物理学」(基礎編・応用編)朝倉書店(2001)

� 原田賢一著 「Fortran77 プログラミング」

2012/9/15温故知新・Fortran / @n_scattering

� 原田賢一著 「Fortran77 プログラミング」サイエンス社(1986)

� 理化学研究所 「スカラー・チューニング講習会」、「並列プログラミング(MPI)講習会」テキストhttp://accc.riken.jp/HPC/training/


Top Related