2017-01-07 6 views
1

呼び出しルーチンでサブルーチンをインライン化したい場合は、どこに置いておきますか?それは同じモジュールまたはファイルにある必要がありますか?異なるオブジェクトファイルのサブルーチンでインライン展開できますか?答えはコンパイラに依存することがありますか?サブルーチン/関数をインラインに置く場合

+1

コンパイラの独立した結果が多かれ少なかれ、内部プロシージャ(CONTAINS)を使用します。デフォルトの設定のifort - 単一のコンパイルコマンドで指定されたすべてのソースファイルから自動的にインラインリミットの設定に従って(部分的に)Qipインライン化されます。 – tim18

+0

@ tim18これをcontainsステートメントに入れることは、再利用や名前空間の重複のために不便です。小さなルーチンを持つモジュールを呼び出し側と同じコンパイルステートメントに置くと、きれいに見えます。その後、モジュールを再利用することができ、呼び出し元が呼び出しに時間がかかる場合は、呼び出し元と同じ行にmakeファイル内に置くことができます。私はgfortranのためにこれが機能するのだろうか?私は通常それを使用するコンパイラですか? –

答えて

2

これはFortran標準によって制御されていません。プロセッサは、それが適切と考えるように行うことができます。

これは間違いなくコンパイラの設定に依存します。

一般に、内部関数はインライン化されます。しかし、他の多くの関数は、少なくとも同じソースファイルまたはモジュール内に存在する場合にも、しばしばインライン展開されます。

しかし、他のソースファイル/コンパイル済みオブジェクトファイルからのインライン化も問題ではありません。それはしばしばリンク時の最適化時に行われます(https://gcc.gnu.org/wiki/LinkTimeOptimization)。これらの最適化は、特定のコンパイラフラグ(-fastなど)に含まれるか、別途有効にすることができます(-flto-ipo)。

+0

内部関数では、呼び出し側の 'contains'ステートメントにあるものを意味しますか?クロス積、ドットプロダクト、いくつかの基本的な関数など、一般的に使用される小さなルーチンを持つ別々のファイルにモジュールを持ち、それらがインライン化されると想定できるのはいいことです。 'gfortran $(flags)caller.f90 utils.f90'のように、そのモジュールがルーチンを使用するルーチンと同じステートメントでコンパイルされた場合、おそらく役立ちます。ここで、utils.f90には小さなルーチンを含むモジュールが含まれていますか? –

+0

*内部手順*は正確に定義された用語です。それらは、メインプログラムのcontainsセクションまたは別のプロシージャ(通常は呼び出し元)にあります。あなたのフラグについては、 '-flto'を使ってみて、コンパイラがインラインで管理しているものを見てください。結果は、インライン化される関数のサイズに依存します。 –

+0

インライン展開が成功したかどうかをどのように判断しますか?私はgfortranとUbuntuにいる。私は 'gprof'や' perf'をプロファイリングに使っています。 –

関連する問題