4

Microsoft Compaq Visual Fortran 6.6 を使用してコンパイルされていた Fortran プログラムで作業する必要があります。gfortran を使用したいのですが、多くの問題に遭遇しました。主な問題は、生成されたバイナリの動作が異なることです。私のプログラムは入力ファイルを受け取り、出力ファイルを生成する必要があります。しかし、gfortran でコンパイルされたバイナリを使用すると、終了前にクラッシュしたり、異なる数値結果が得られることがあります。これは、浮動小数点数を多く使用する研究者によって作成されたプログラムです。

私の質問は、この種の問題につながる可能性のあるこれら 2 つのコンパイラの違いは何ですか?

編集:私のプログラムはいくつかのパラメータの値を計算し、多数の反復があります。最初は、すべてがうまくいきます。数回繰り返した後、いくつかの NaN 値が表示されます (gfortran でコンパイルした場合のみ)。

編集:皆さんの答えを考えてください。そこで、有用なエラー メッセージを表示してくれるインテル コンパイラを使用しました。私の問題の原因は、一部の変数が正しく初期化されていないことです。Compaq Visual Fortran でコンパイルすると、これらの変数は値として自動的に 0 を取るように見えますが、gfortran (および intel) ではランダムな値を取るため、次の反復で加算されるいくつかの数値の違いが説明されます。したがって、解決策は、プログラムをよりよく理解して、これらの不足している初期化を修正することです。

4

4 に答える 4

3

異なるコンパイラは、同じソース コードに対して異なる命令を発行できます。数値計算が限界に達している場合、ある命令セットは機能し、別の命令セットは機能しない可能性があります。ほとんどのコンパイラには、速度の最適化ではなく、より保守的な浮動小数点演算を使用するオプションがあります。使用可能なオプションについては、使用しているコンパイラ オプションを確認することをお勧めします。より根本的には、この問題 (特に、コンパイラーが数回の反復で同意するが、その後発散する) は、プログラムの数値的アプローチが限界に達していることを示している可能性があります。単純な解決策は、計算の精度を上げることです。たとえば、single から double にします。おそらく、ステップ サイズや同様のパラメーターなどのパラメーターも微調整します。

于 2011-02-11T00:18:47.270 に答える
2

このような動作にはいくつかの理由が考えられます。私がすることは次のとおりです。

  1. 最適化を無効にする

  2. すべてのデバッグ オプションをオンにします。インテル コンパイラなどにアクセスできる場合は、 を使用しますifort -CB -CU -debug -traceback。gfortran に固執する必要がある場合は、 を使用してくださいvalgrind。その出力は、人間が判読できるものではありませんが、多くの場合、何もないよりはましです。

  3. 暗黙の型付き変数がないことを確認しimplicit none、すべてのモジュールとすべてのコード ブロックで使用してください。

  4. 一貫した浮動小数点型を使用してください。私は常にreal*8自分のコードで唯一の float 型として使用しています。外部ライブラリを使用している場合、一部のルーチンの呼び出しシグネチャを変更する必要がある場合があります (たとえば、BLAS では単精度変数と倍精度変数のルーチン名が異なります)。

運が良ければ、変数が正しく初期化されていないだけで、これらの手法のいずれかでそれをキャッチできます。それ以外の場合は、MSB が示唆していたように、プログラムが実際に何を行っているかをより深く理解する必要があります。そして、はい、「いくつかの NaNs 値が表示される」と言うところから始めて、アルゴリズムを手動でチェックする必要があるかもしれません。

于 2011-02-11T01:10:35.563 に答える
2

クラッシュについてはわかりませんが、Intel マシンでの数値コードの結果のいくつかの違いは、変数ではなくおそらく一時的な値であっても、1 つのコンパイラが 80 ビット倍精度を使用し、他の 64 ビット倍精度を使用していることが原因である可能性があります。さらに、浮動小数点計算は、基本操作が実行される順序に影響されます。異なるコンパイラは、異なる一連の操作を生成する場合があります。

于 2011-02-10T20:58:12.263 に答える
1

さまざまなタイプの実装の違い、さまざまな非標準ベンダーの拡張機能の違いなど、多くのことが考えられます。

以下は、異なる言語機能のほんの一部です( gfortranintelを見てください)。Fortran標準で書かれたプログラムはどのコンパイラでも同じように動作しますが、多くの人は標準言語機能とは何か、言語拡張とは何かを知らないので、それらを使用しています...異なるコンパイラでコンパイルすると問題が発生します.

コードをどこかに投稿していただければ、簡単に確認できます。そうでなければ、このように、確実に言うのは難しい.

于 2011-02-10T22:52:11.220 に答える