Fortran プログラムの移植における問題点

English version is here.



前提条件

当然のことですが、FORTRAN プログラムを MkLinux に移植し始める前に、 FORTRAN コンパイラーをセットアップする必要があります。 以下では、GNU の FORTRAN コンパイラーである g77 を使用します。 MkLinux DR2.1update4(+shared library support) の gcc とコンパチな g77 は g77-0.5.19 です。

  1. Shared Library 環境のセットアップ
  2. DR2.1update4(+shared library support) 環境下で、 RPM パッケージ (gcc 版の C、C++、Objective C、FORTRAN の一そろい) を 用意しました。 従って、これを使うには DR2.1update4(+shared library support) をインストールする必要があります。
    Update4 のインストールに関しては ここ に私の場合の記録があります。

  3. コンパイラーのセットアップ
  4. ひとたび DR2.1update4+shared library がインストールできたならば、 後は比較的簡単です。 まず、次の RPM をローカルディスク上の <どこか> に用意して下さい。

    $ cd <どこか>
    $ ls
    gcc-2.7.2.fu.1-1C.ppc.rpm
    gcc-c++-2.7.2.fu.1-1C.ppc.rpm
    gcc-g77-2.7.2.fu.1-1C.ppc.rpm
    gcc-objc-2.7.2.fu.1-1C.ppc.rpm

    これらの RPM の作り方に興味のある方は、 ここ をご覧下さい。

    これらの RPM のインストールは

    $ su
    # rpm -U <somewhre>/gcc*-2.7.2.fu.1-1C.ppc.rpm

    で終わりです。
    注意:インストールは Update4 についてきた gcc の三組み (C, C++, and Objective C) を上書きする形になります。 結果として、標準コンパイラー環境を壊す危険があります。 インストールは自己責任でお願いします。 事前に これ をお読み下さい。

G77 事始め

  1. 簡単なテスト
  2. おめでとうございます。ここまでくればとりあえず g77 を試す環境が出来たはずです。 そもそも g77 が動くものか否かを確かめるために、簡単なものから始めましょう。

    $ cat simple.f
    	  real*4  a, b, c
    	  a = 1.
    	  b = 2.
    	  c = a + b
    	  print *, ' a, b, c = ', a, b, c
    	  end
    	
    $ g77 simple.f -o simpletest
    $ simpletest

  3. 何か問題があったら
  4. もし、このテストがうまくいかなかったらさっそく問題に出くわしてしまったわけです。 エラーメッセージが

    simpletest: error in loading shared libraries
    libf2c.so: cannot open shared object file: No such file or directory

    のようなものだったら、あわてずにまず /etc/ld.so.conf があるかどうか 確かめます。

    $ cat /etc/ld.so.conf
    /lib
    /usr/lib
    /usr/X11/lib
    /usr/local/lib

    なかったら、例えば次のようにして作ります。

    $ su
    # cat > /etc/ld.so.conf
    /lib
    /usr/lib
    /usr/X11/lib
    /usr/local/lib
    /usr/lib/gcc-lib/powerpc-unknown-linux/2.7.2.1-ppclinux
    ^D

    ここで "^D" は CTRL+d の事です。 ひとたび /etc/ld.so.conf ができたら

    # /sbin/ldconfig -v
    ......
    libf2c.so => libf2c.so
    ......

    として、システムに libf2c.so を認識させてあげればいいわけです。 本来は RPM に/usr/lib/libf2c.so へのシンボリックリンクを含めるべき だった(実は大阪大学の松村さんに指摘されるまで含めていたつもり だった)のですが、忘れました。すみません、今度のバージョンでは忘れずに 入れます(12/07/97: 2.7.2.fu.1-1C では入れました)。 libf2c.so を認識させることが出来たら、 ここでもう一度 simpletest を試して下さい。

    残念ながらこれが失敗したら、あるいは、そもそも最初のエラーメッセージが全然別の ものだったならば、深刻な問題です。
    この場合には、 とりあえず、もとの gcc 三組み (gcc-2.7.2.1-2J.ppc.rpm, gcc-c++-2.7.2.1-2J.ppc.rpm, gcc-objc-2.7.2.1-2J.ppc.rpm) を、DR2.1update4 の RPMS/ppc ディレクトリーから復旧します。 その上で、g77 を以下の手順で ソース(SRPM). から作りなおしてみて下さい。

    $ su
    # rpm --rebuild gcc-2.7.2.fu.1-1C.src.rpm

    こんなことしなくて良いことを、願っております。また、これには 相当時間がかかります。

    さて、この簡単なテストにパスした場合には、もっと複雑なプログラムに 挑戦できるわけです。 すると、私の場合そうであったように、色々問題もでてくると 思われます。

MkLinux での g77 の経験

私の場合、無謀にもいきなり CERNLIB という超大物に挑戦しました。というか、正確には、CERNLIB を移植するために g77 を入れました。 当然の事ながら、たくさんの問題に悩まされました。

  1. Linux 用のソースがある場合
  2. もし、誰かがあなたのひいきの FORTRAN プログラムをすでに Linux に移植している場合は、ラッキーです。 何故なら、そのソースは高い確率で g77 でコンパイル可能だからです。 しかしながら、ビットや、バイト、また I*4 に埋め込まれた I*2 を 扱う場合には特別の注意が必要です。 Intel のチップと PPC ではバイトオーダーが違うからです。 CERNLIB の場合でも、あちこちでこの問題がありました。 たとえ MkLinux にソフトを移植する際に必ず起こるいくつかの 比較的単純な問題を除き、g77 で素直にコンパイルできても バイトオーダーの問題があると移植は骨の折れるものになります。 ただし、難しいことではありません。ただバイトスワッピングを しているところや、I*2 と I*4 を equivalence しているような部分を 一つたりとも見逃さない忍耐と注意深さがいるだけです。

  3. そうでない場合
  4. あなたはパイオニアです。 この場合の移植における問題点には次のようなものがあるでしょう。

G77 の性能について

時間の都合で、私の MkLinux マシン(PowerMac 8115/110: ppc601)の上での MkLinux の系統的な性能のチェックはいっさいしておりません。 その代わりに、いくつかの物理のプログラムの実行速度を HP のワークステーション(C100: pa7200? + HP-UX10.10 + HP Fortran) と比較しました。

  1. サンプルプログラムの説明
  2. Results
  3. おそらくみなさんの興味のおありなのは、 結果のテーブルだけでしょう。

    C100 (HP-UX) 8115/100 (MkLinux)
    TTH_GEN:BASES 140.73 sec
    (2.94834 +/- 0.00927 fb)
    850.05 sec
    (2.94811 +/- 0.00927 fb)
    TTH_GEN:SPRING 402.19 sec
    (output data: 35MB)
    813.35 sec
    (output data: 35MB)
    TTH_ANL: 8J 218.53 sec 435.08 sec
    TTH_ANL: L+6J 166.2 sec 306.2 sec
    TT_GEN:BASES 410.27 sec
    (0.40153 +/- 0.00061 fb)
    2485.85 sec
    (0.40153 +/- 0.00061 fb)
    TT_GEN:SPRING 103.62 sec
    (output data: 5.6MB)
    244.45 sec
    (output data: 5.6MB)

    ここで、重心系のエネルギーは TTH(TT) に対して 700(340)GeVで、トップクォークの質量は 170GeVにしてあります。 SPRING のステップでは1000(200)イベント生成しました。 TT 生成は、しきい値補正の入った計算なので、しきい値でも 有限の断面積がある点に注意して下さい。

    コメント

    BASES のステップを除き、差は約2倍で、これはおそらく CPU の実力の差とコンシステントではないかと思います。 BASES のステップではこの差は6倍で、MkLinux の性能が 悪くなっています。これはおそらく、BASES では 大きなアレイにランダムにアクセスするので キャッシュの小さい 8115/100 では キャッシュミスが起きているのではないかと思います。 時間があったら、この点テストしてみたいと思います。

Back to Keisuke Fujii's MkLinux Page
fujiik@jlcuxf.kek.jp July 29, 1997