0

Fortran の内部関数が外部関数よりも優れていると信じる理由はありますか?

例えば

subroutine foo(x,y)
   real :: x
   x = bar(y)
   return
   contains
   real function bar(x)
      real :: x
      bar = x*x
      return
   end function bar
end subroutine foo

subroutine foo(x,y)
   real :: x
   real :: bar
   x = bar(y)
   return
end subroutine foo

real function bar(x)
   real :: x
   bar = x*x
   return
end function bar

たとえば、内部ユニットにより、コンパイラはそのコードをある種のマクロのようにインライン化できますか?

4

2 に答える 2

2

Fortran の内部関数が外部関数よりも優れたパフォーマンスを発揮すると信じる一般的な理由があるとは思えません。一般的な理由とは、すべてのプラットフォーム上のすべての Fortran 標準準拠のコンパイラに適用されるものを意味します。したがって、パフォーマンス上の理由から、外部機能よりも内部機能の一般的な (同じ意味での) 好みを明確に述べることができるとは思いません。

さらに先に進みますが、同じ機能を実装するためのさまざまなアプローチの相対的なパフォーマンスに関する議論を適切にサポートする言語の標準 (それらのいずれか) には、それほど多くはないと思います。doしたがって、別の例を挙げると、標準では、明示的なループが同等の配列構文ベースの式よりも優れていると主張することはできないと思います。または、反対に主張することもできます。

しかし、コンパイラのバージョンやプラットフォームに固有の、パフォーマンス上の理由から、あるアプローチを別のアプローチより優先する理由があるかもしれないと私は信じています。たとえば、前回 Intel プロセッサ上の MS Windows で Intel Fortran コンパイラ (おそらく v11.something) をテストしたとき、明示的なdoループは通常、同等の配列構文式よりも優れていると結論付けました。

パフォーマンスは Fortran プログラマーの重要な関心事であることが多いため、コンパイラーが開発されるにつれてさまざまなアプローチのパフォーマンスを監視し、時代遅れのパフォーマンスに関するアイデアにとらわれないようにする必要があります。

このゲームではいつものように、ハード データが議論に勝ります。プログラムのパフォーマンスは実験科学です。

于 2013-01-18T19:14:47.560 に答える
1

論争の的となる可能性のあるスピンについては...標準では、内部手順が外部手順よりも「パフォーマンス」が高いという意味がありますが、(おそらく)意図した意味ではありません。

内部プロシージャとモジュール プロシージャは、自動明示的インターフェイスを取得します。これには、コンパイラーが各プロシージャー参照のいくつかの側面をチェックする必要があり、ほとんどの半適切なコンパイラーが他の多くの側面をチェックできるようにします。外部プロシージャーで同じレベルのチェックを行うには、インターフェースを手動で準備する必要があり、エラーが発生しやすくなります。

一般的なケースでは、自動明示的インターフェースから生じるプログラムの堅牢性の利点 (非常にパフォーマンスの一形態) は、「実行速度」のパフォーマンスに関する考慮事項をすべて消し去ります。適切なコンパイラについては、"/"おそらく違いはない" ことを確認するために測定する必要があります。

この場合、モジュール プロシージャとして bar (および foo) を使用すると、変数と foo との意図しないホストの関連付けが排除され、bar の独立したテストが可能になるという点で、さらに効果的です。

プロシージャの種類の選択は、ソース コードの技術的要件に基づいて行う必要があります (外部プロシージャを作成する正当な理由は、現在の Fortran コード ベースでも残っていますが、それらは非典型的です)。モジュール対内部プロシージャによって提供される可能性のある結果のソースコード。この決定で実行速度のパフォーマンスを考慮する必要がある場合は、コンパイラが壊れています。

于 2013-01-18T20:15:53.730 に答える