呼び出しルーチンでサブルーチンをインライン化したい場合は、どこに置いておきますか?それは同じモジュールまたはファイルにある必要がありますか?異なるオブジェクトファイルのサブルーチンでインライン展開できますか?答えはコンパイラに依存することがありますか?サブルーチン/関数をインラインに置く場合
答えて
これはFortran標準によって制御されていません。プロセッサは、それが適切と考えるように行うことができます。
これは間違いなくコンパイラの設定に依存します。
一般に、内部関数はインライン化されます。しかし、他の多くの関数は、少なくとも同じソースファイルまたはモジュール内に存在する場合にも、しばしばインライン展開されます。
しかし、他のソースファイル/コンパイル済みオブジェクトファイルからのインライン化も問題ではありません。それはしばしばリンク時の最適化時に行われます(https://gcc.gnu.org/wiki/LinkTimeOptimization)。これらの最適化は、特定のコンパイラフラグ(-fast
など)に含まれるか、別途有効にすることができます(-flto
、-ipo
)。
内部関数では、呼び出し側の 'contains'ステートメントにあるものを意味しますか?クロス積、ドットプロダクト、いくつかの基本的な関数など、一般的に使用される小さなルーチンを持つ別々のファイルにモジュールを持ち、それらがインライン化されると想定できるのはいいことです。 'gfortran $(flags)caller.f90 utils.f90'のように、そのモジュールがルーチンを使用するルーチンと同じステートメントでコンパイルされた場合、おそらく役立ちます。ここで、utils.f90には小さなルーチンを含むモジュールが含まれていますか? –
*内部手順*は正確に定義された用語です。それらは、メインプログラムのcontainsセクションまたは別のプロシージャ(通常は呼び出し元)にあります。あなたのフラグについては、 '-flto'を使ってみて、コンパイラがインラインで管理しているものを見てください。結果は、インライン化される関数のサイズに依存します。 –
インライン展開が成功したかどうかをどのように判断しますか?私はgfortranとUbuntuにいる。私は 'gprof'や' perf'をプロファイリングに使っています。 –
- 1. ユーザー関連の取得関数を置く場所
- 2. イメージと段落をインラインに置く
- 3. Linqコーディングスタイル:インラインの場合
- 4. 行 - インライン関数
- 5. インライン関数/メソッド
- 6. インライン関数コールエラー
- 7. インライン関数リンカエラー
- 8. フェニックスプロジェクトにヘルパー関数を置く場所は?
- 9. BLEリンク関数を置くのに理想的な場所
- 10. インライン匿名関数を使用する場合のイベントリスナーの削除
- 11. デバッグビルドのインライン関数
- 12. Callgrindのインライン関数
- 13. インライン関数のリンクエラー
- 14. fortranのサブルーチンと関数を含むモジュール
- 15. インライン関数と静的インライン関数の違い
- 16. マスターページにない場合はナビゲーションメニューを置く場所 - asp mvc
- 17. インラインでulongを返す場合
- 18. find関数を置く場所はどこですか?
- 19. array_mapをインライン無名関数
- 20. Fortran関数、モジュール、サブルーチンの自動ドキュメント
- 21. Fortran要素関数と要素サブルーチン
- 22. sqldfをr関数の中に置く
- 23. ヘッダファイルに関数定義を置く
- 24. ポリマー2.0 dom-関数出力に基づく場合
- 25. スパーク放送変数関数に置くことができない、そうでない場合NullPointerException
- 26. SQL関数の場合
- 27. 場合msdeploy runCommand関数Priviliges
- 28. インライン関数と外部リンケージ
- 29. 角度module.runは、インライン関数
- 30. インライン関数のMXML構文
コンパイラの独立した結果が多かれ少なかれ、内部プロシージャ(CONTAINS)を使用します。デフォルトの設定のifort - 単一のコンパイルコマンドで指定されたすべてのソースファイルから自動的にインラインリミットの設定に従って(部分的に)Qipインライン化されます。 – tim18
@ tim18これをcontainsステートメントに入れることは、再利用や名前空間の重複のために不便です。小さなルーチンを持つモジュールを呼び出し側と同じコンパイルステートメントに置くと、きれいに見えます。その後、モジュールを再利用することができ、呼び出し元が呼び出しに時間がかかる場合は、呼び出し元と同じ行にmakeファイル内に置くことができます。私はgfortranのためにこれが機能するのだろうか?私は通常それを使用するコンパイラですか? –