呼び出しルーチンでサブルーチンをインライン化したい場合は、どこに置いておきますか?それは同じモジュールまたはファイルにある必要がありますか?異なるオブジェクトファイルのサブルーチンでインライン展開できますか?答えはコンパイラに依存することがありますか?サブルーチン/関数をインラインに置く場合
答えて
これは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. Linqコーディングスタイル:インラインの場合
- 3. イメージと段落をインラインに置く
- 4. インライン関数コールエラー
- 5. インライン関数/メソッド
- 6. インライン関数リンカエラー
- 7. 行 - インライン関数
- 8. BLEリンク関数を置くのに理想的な場所
- 9. フェニックスプロジェクトにヘルパー関数を置く場所は?
- 10. インライン関数のリンクエラー
- 11. デバッグビルドのインライン関数
- 12. Callgrindのインライン関数
- 13. インライン関数と静的インライン関数の違い
- 14. マスターページにない場合はナビゲーションメニューを置く場所 - asp mvc
- 15. インラインでulongを返す場合
- 16. array_mapをインライン無名関数
- 17. スパーク放送変数関数に置くことができない、そうでない場合NullPointerException
- 18. Fortran関数、モジュール、サブルーチンの自動ドキュメント
- 19. Fortran要素関数と要素サブルーチン
- 20. ヘッダファイルに関数定義を置く
- 21. SQL関数の場合
- 22. 場合msdeploy runCommand関数Priviliges
- 23. インライン関数のMXML構文
- 24. インライン関数と型エクステンション
- 25. インライン関数と外部リンケージ
- 26. Codeigniter:URLから変数を置く場所
- 27. インライン関数でMACRO __FUNCTION__を使用してください
- 28. サブルーチンv/sに多くの変数を渡すサブルーチン内の変数を宣言する
- 29. 関数がtrueを返した場合は、条件の場合にコマンドを実行してください。
- 30. ランダム変数が関数の場合
コンパイラの独立した結果が多かれ少なかれ、内部プロシージャ(CONTAINS)を使用します。デフォルトの設定のifort - 単一のコンパイルコマンドで指定されたすべてのソースファイルから自動的にインラインリミットの設定に従って(部分的に)Qipインライン化されます。 – tim18
@ tim18これをcontainsステートメントに入れることは、再利用や名前空間の重複のために不便です。小さなルーチンを持つモジュールを呼び出し側と同じコンパイルステートメントに置くと、きれいに見えます。その後、モジュールを再利用することができ、呼び出し元が呼び出しに時間がかかる場合は、呼び出し元と同じ行にmakeファイル内に置くことができます。私はgfortranのためにこれが機能するのだろうか?私は通常それを使用するコンパイラですか? –