• 締切済み

Fortranのバージョンアップと古いソースコード

Fortranは科学技術計算の古い資産が使えるということでまだ使われていると思います。 しかも、コンパイラ・リンカは製品としてバージョンアップしているわけですが、新しくなっても古いコードはコンパイル・リンク・実行できると思っていました。最近、intel fortranの更新をしたのですが、動作がかなり違ってきました。F77,F90,F95などの更新ではなく、intel社の製品としての最新版への更新です。コンパイル・リンクまでは行くのですが、実行させたとたん、ゼロ割のようなメッセージが出て、実行が打ち切られてしまいます。1時間ぐらい走るプログラムなのですが、1秒で打ち切りでした。必ずそうなるということではありません。特定のライブラリで生じます。そのライブラリは古い(言語としてはF77)ので当然ながら新しいコンパイラで動くなどと書いていません。ただソースコードの塊であり、古いコンパイラでは動いていたのです。古いと行っても2009年ぐらいに買ったintel visual fortran ver.11ぐらいのもので2016年のコンパイラと大幅な変更はないはずなのですが。例えば最新版(2016年2月時点)の方は並列関係の設定の方がデフォルトで並列計算しない設定をコンパイラオプションで指定しないとおかしくなるということでしょうか(たぶんGPUには対応していないと思いますが)。どっかに書いてあるかなと思案していますが。 何か心当たりがあればよろしくお願いします。

みんなの回答

  • colder
  • ベストアンサー率43% (30/69)
回答No.2

初期化していない変数を使っているとか save属性を付けていない変数をsave属性が付いてるかのように扱っている可能性が高いと思う。

skmsk1941093
質問者

お礼

回答ありがとうございます。ずいぶん前ですが、学校でFortranは処理系が勝手にゼロにしてくれると聞いたような気がしています。Gnuのコンパイラはそうなっていないということがありました。 また、サブルーチン側で定義された変数をsave属性を指定していないと、再度呼び出したとき、変数が初期化されてしまっているということですね。自分は気を付けていますが、他の人が昔作ったソースなのでそういうこともあるかもしれません。

  • f272
  • ベストアンサー率46% (8467/18126)
回答No.1

昔のコードはそのままコンパイルしてもコンパイルエラーになったり,ランライムエラーになることはよくありますよ。しかし,そんな場合でもコンパイラのスイッチを適切に選べばうまくいくことがほとんどです。どのようにすればうまくいくのかは,どのようなエラーになっているかによって異なります。 > 古いと行っても2009年ぐらいに買ったintel visual fortran ver.11ぐらいのもので2016年のコンパイラと大幅な変更はないはずなのですが 大幅な違いでなくてもエラーになるときはなります。リリースノートで何が変わったのかを確認してください。

skmsk1941093
質問者

お礼

ありがとうございます。今一度地道に調査してみます。C言語だったらそういうことがありそうですが、Fortranもですか。リリースノートを調べたり、販売元にちょっと聞いてみたりしてみます。