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

English version is here.



前提条件

当然のことですが、FORTRAN プログラムを MkLinux に移植し始める前に、 FORTRAN コンパイラーをセットアップする必要があります。 以下では、GNU の FORTRAN コンパイラーである g77 を使用します。 MkLinux DR3 では、標準コンパイラーのセット(egcs)の一部として g77-0.5.22 ベースの g77 がついてきます。
  1. コンパイラーのセットアップ

    Egcs のコンパイラーセットは C、C++、Objective C、FORTRAN をサポートします。 これらの内、"C" と "FORTRAN" は DR3 のインストールの際に "C Development" を選択すると自動的にインストールされます。 "C++" と "Objective C" に関しては、さらに "C++ Development" の選択でインストールされます。 これらを DR3 インストール時に選択しなかった場合には、 自分でインストールしなくてはなりません。 まず、次の RPM をローカルディスク上の <どこか> に用意して下さい。

    $ cd <どこか>
    $ ls
    egcs-1.0-2e.ppc.rpm
    egcs-as-gcc-1.0-2e.ppc.rpm
    egcs-c++-1.0-2e.ppc.rpm
    egcs-g77-1.0-2e.ppc.rpm
    egcs-objc-1.0-2e.ppc.rpm

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

    $ su
    # rpm -Uvh <somewhre>/egcs*-1.0-2e.ppc.rpm

    で終わりです。

G77 事始め

  1. 簡単なテスト

    おめでとうございます。ここまでくればとりあえず 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

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

MkLinux での g77 の経験

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

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

  2. そうでない場合

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

G77 の性能について

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

  2. Results

    おそらくみなさんの興味のおありなのは、 結果のテーブルだけでしょう。

    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 Aug. 1, 1998