3

IARコンパイラを最高の最適化レベルで使用して、MSP430用の組み込みコードを書いています(速度やサイズは何も変わりません)。

関数を静的として定義し、同じファイル内で一度だけ参照します。関数には内部リンケージがあり、一度だけ使用されるため、オプティマイザーがインライン展開を実行することを期待していました。そうしない理由はありません。

関数は短く、16 ワードのマシン コードになります。ISR から呼び出されます。inline キーワードを追加すると関数がインラインになりますが、オプティマイザにはヒントが必要なようです。インラインにすると、 / が 1と 1の 2 つのpush/popがスタックに保存されます。callareta

(キーワードがなくても)インライン展開が実行されると期待するのは正しいinlineですか、それとも何か不足していますか?


編集:さらにいくつかのテストでは、インライン展開が関数のサイズに依存し、しきい値が非常に低いことが示されました。15 ワードか 16 ワードのマシン コードのようです。それ以上では、キーワードが指定されていない場合、オプティマイザーは展開しません。

なぜそうしないのかはまだわかりません (読みやすさはオプティマイザーの関心事ではないはずですよね?) が、IAR だけがこれに答えることができることは理解しています。

4

3 に答える 3

2

コンパイラーはコードをインライン化する必要はなく(明示的にマークされている場合でもinline)、オプティマイザーは洗練度と戦略が異なります。したがって、これは実際にはコンパイラベンダーにとっての質問です(ドキュメントを参照することも役立つ場合があります)。

関数が特に大きい場合、コンパイラーは、関数呼び出しのオーバーヘッドの回避はスキーム全体では重要ではないと判断した可能性があります。

コンパイラには、_force_inlineキーワードなどが含まれている場合があります。これは、提案ではなくディレクティブと見なされます(inline通常、ほとんどのコンパイラにあります)。

インライン化しないことについて考えられる議論の1つは、保守の下で決定論的なパフォーマンスを維持することです。後の2番目の参照によってインライン化されなくなった場合、コードの実行速度がアプリケーションのパフォーマンス要件に悪影響を与えるように変化する可能性がありますが、インライン化されたままになるとコードサイズに大きな影響を与える可能性があります。

[編集]ドキュメントを読むと、コンパイラ#pragma inline=forcedで関数定義の直前にディレクティブが必要です。そうでない場合、インライン化はオプティマイザのヒューリスティックに依存します。強制された場合でも、最適化が低いか、最適化されていない場合、インライン化は発生しません。

于 2011-02-19T08:42:23.963 に答える
2

数年前の IAR ARM コンパイラ バージョン (v5.2) を使用しています。これが MSP430 コンパイラにどの程度当てはまるかはわかりません。

inlineIAR ARM コンパイラは、「高」最適化設定-Oh(バランス)、-Ohs(速度)、または(サイズ) のいずれかを使用して明示的にマークされていない静的関数をインライン化します。これには-Ohz、ある程度複雑な静的関数 (ループなど) が含まれます。 )。

もちろん、インライン化されていない静的関数がいくつかあると思いますが、簡単なチェックで、IAR コンパイラが一般的にこの最適化を実行していることがわかります。

したがって、コンパイラが静的関数をインライン化することを期待していますが、これらの最適化に依存したい場合は、出力を調べる必要があると思います(あなたがしたように)。もちろん、どの最適化がどのように適用されるかは完全にコンパイラに依存するため、IAR だけが最適化を「行うべき」かどうか (または、そうすべきではないと判断した理由を弁護する) の質問に答えることができます。IAR がこの最適化を適切に実行していないと思われる場合は、IAR に相談してください。この特定のケースでなぜそれが起こらないのかについて、彼らはあなたに指針を与えることができるかもしれません.

于 2011-02-18T19:36:06.267 に答える
0

このスレッドの IAR 従業員によると、IAR サイズの最適化とインライン関数:

正式には、コンパイラがヘッダー ファイルまたは同じソース ファイルで定義を確認した場合にのみサポートされます。ただし、実験として、「マルチファイル コンパイル」と呼ばれるものを試しました。この方法では、複数の C ファイルを同時にコンパイラにフィードして、コンパイル ユニット間でインライン化できます。これは純粋に実験的なものであり、IDE ではサポートされていないことに注意してください。

...

個人的には、今日アプリケーションを作成する場合、 --mfc オプションは使用しません。代わりに、インライン化したい関数をヘッダー ファイルに配置します。これは、インライン化されたメソッドを使用して C++ クラス定義を記述するときに行う必要があります。

于 2012-02-20T17:18:06.243 に答える