読者です 読者をやめる 読者になる 読者になる

fortran66のブログ

fortran について書きます。

Fortran 歴史的遺物

Fortran は1950年代から過去との互換性を重視して、あまり機能を削らずに進化を続けたために、進化の過程で取り残された意味不明な命令がたくさんあります。メモ帳代わりに書いておきます。

DIM 関数 (DIMINISHING function)

DIM 関数とは、DIM(x, y) x - y >= 0.0 の時 DIM(x, y) = x - y; x - y < 0.0 の時 DIM(x, y) = 0.0 という謎な定義で、教科書の例題以外で使われているのも見たことがない関数です。 自分で使ったこともありません。

そもそも DIM が何の略号なのかすら忘れ去られていて、IBMFORTRAN IV のマニュアルにすら POSITIVE DIFFERENCE と書いているくらいです。最近、computer history museum のサイトの FORTRAN ARCHIVE COLLECTION にある IBM FORTRAN II マニュアルの初期の版(FORTRAN II for the IBM 704 Data Processing System : Reference Manual)に、DIM 関数の type of function を DIMINISHING としているのを見つけました。

同じ FORTRAN II のマニュアルでも後期の版では DIM 関数は positive difference と書いてあるので、なかなか見つけづらいものがあります。なお DIM 関数は FORTRAN I に存在しておらず、FORTRAN II で導入されてあっという間に名前の由来を忘れられてしまった関数のようです。。

CHAR ICHAR / ACHAR IACHAR EBCDIC と ASCII

文字の内部コードがらみ関数には機能がほとんど同じ二つの関数があります。CHAR(n) は、内部コード n の文字を返し、ACHAR は ASCII コード n の文字を返します。ICHAR、IACHARはそれぞれその逆関数になっています。

Fortran は作られたのが ASCII コードよりも古いので、元々文字コードはベンダー依存だったのですが、その後互換性問題から ASCII コード版の関数も用意されました。かつては IBM 社の EBCDIC が主要な文字コードだったものですが、今では ASCII コードが普遍的になったので、大抵の場合同じ挙動をするので、機能の重複する冗長な関数があるように見えています。

CSHIFT, EOSHIFT 関数   並列化(HPF) 機能としての配列シフト関数

配列シフト関数が並列化や HPF と関係して導入されたと言われると不思議な気がします。しかし、Fortran90の規格が80年代に形づくられたことを思い出して、70~80年代の並列計算機のアーキテクチャを考えるとこれが自然なものだと分かります。

例として以下に illiac のプロセッサのトポロジーを示します。プロセッサが二次元トーラス状のメッシュを形成していることが見て取れます。各プロセッサは二次元配列の1要素を受け持って計算を並列に行います。この場合には前後左右のプロセッサ間でメモリー内容を授受し合うと最も並列性良く動きます。80年代に一世を風靡したコネクション・マシンも似たようなアーキテクチャを取っていました。
f:id:fortran66:20130109014809p:plain
B. Svensson SIMD architectures http://www.hh.se/download/18.70cf2e49129168da0158000103477/1232956956122/SIMD+Architectures.pdf