0

みなさん、こんにちは。ubuntuで実行されているクラスターから、同じハードウェアを備えたクラスターにコードをデプロイしていますが、Red Hatを使用しており、古いgfortranコンパイラーのようです。ソースは実際にはifortによってコンパイルされていますが、red hadクラスターにインストールされていないため、gfortranに切り替える必要がある場合があります。

ここで問題となるのは、コードがコンパイルされないことです。コードの私の部分で修正できるタイプの中に「割り当て可能」なものがありますが、コードを古い標準に適応させる準備ができていない他の人々による他の貢献もあります。

私の質問 :

  1. それでも、できればあまり変更せずに、他のシステムにデプロイするにはどうすればよいですか?
  2. 同じバージョンからのコンパイルを使用しているときに、他にどのような驚きがありますか?
  3. このようなことが二度と起こらないようにするにはどうすればよいですか?コードは、暴力に訴えることなく、さまざまなシステムに展開できる必要があります。

あなたのアドバイスと歓声をありがとう

4

2 に答える 2

1

gfortranはバージョン4.0から始まりました。バージョン4.1および4.2は古く、多くの機能が不足しており、バグがある可能性があります。コードで使用されている追加の不足している機能に遭遇する可能性があります。可能であれば、コンパイラを現在の安定バージョンである4.5にアップグレードすることをお勧めします。

gfortranのすべてのバージョンをサポートすると、コードに多くの制限が生じます。動作する最も古いバージョンを特定し、その情報をドキュメントに追加する方がよい場合があります。私のコードでは、ISO Cバインディングを多用しているため、そのバージョンは4.3です。

gfortran wiki(http://gcc.gnu.org/wiki/GFortran)には、バージョンごとの変更ログがあり、必要なバージョンを特定するのに役立つ場合があります。唯一確実な方法はテストすることです。

バージョン要件を適用する場合は、Fortran内からテストできます。makeプロセスの一部として小さなテストプログラムを実行し、gfortranのバージョンが早すぎる場合は中止することができます。

次のコードフラグメントは、Fortranプログラムからgfortranバージョン番号を出力する2つの方法を示しています。gfortranがプリプロセッサを呼び出すように、ファイルタイプ「.F90」でプログラムに名前を付けます。

#ifdef __GFORTRAN__ 
    write (*, '( "gfortran" )' )
    write (*, '( I0, ".", I0 )' )  __GNUC__, __GNUC_MINOR__

! Merged version number:
#define GCC_VERSION (__GNUC__ * 10000  + __GNUC_MINOR__ * 100  + __GNUC_PATCHLEVEL__)
    write (*, '( I0 )' )  GCC_VERSION

#endif
于 2010-09-28T17:24:39.963 に答える
1

私はあなたが3つの選択肢があると思います:

  1. クロスコンパイル:つまり、展開マシンで実行するために開発マシンでコンパイルします。これがセットアップで可能かどうかはわかりませんが、まだ行っていない場合は調査する価値があります。
  2. すべてのコンパイラーに実装されているFortran機能のセットにプログラムします。つまり、コードを書き直して、4.2.3が実装している機能と4.1.2が実装していない機能をすべて削除します。
  3. デプロイメントマシンのコンパイラをアップグレードして、開発マシンのコンパイラと一致させます。

これらのうち、(1)難しいかもしれないと思います。もしそうなら、私は(3)に行きます。それが不可能な場合は、(2)である必要があります-他のオプションは表示されません。

今あなたの質問に答えるために:

  1. 上記の回答。
  2. 確かではありませんが、Gfortranのリリースノートには、4.1.2が実装しているFortran言語機能と4.1.2が実装していないFortran言語機能が記載されているはずです。
  3. ターゲットプラットフォームでコンパイルできるバージョンのFortranのみを使用するプログラム。
于 2010-09-28T17:08:03.643 に答える