web-dev-qa-db-ja.com

gccに関数をインライン化させるにはどうすればよいですか?

__attribute__((always_inline))はgccによって関数を強制的にインライン化しますか?

53
HaltingState

はい。

ドキュメント から

always_inline

一般に、最適化が指定されない限り、関数はインライン化されません。インラインで宣言された関数の場合、最適化レベルが指定されていなくても、この属性は関数をインライン化します。

42
RCE

そうすべき。私は、手動インライン化の大ファンです。確かに、過剰に使用されるのは悪いことです。しかし、多くの場合、コードを最適化するときに、インライン化する必要のある1つまたは2つの関数があるか、パフォーマンスが低下します。そして率直に言って、私の経験では、Cコンパイラは通常、inlineキーワードを使用するときにnotこれらの関数をインライン化します。

コンパイラーにコードの大部分をインライン化させてくれます。私が本当に気にしているのは、これらの半ダースほどの絶対に不可欠なケースだけです。 「コンパイラーはこれで良い仕事をする」と人々は言います。その証拠を見せてください。これまでのところ、私はnever Cコンパイラが、強制的なインライン構文(__forceinline on msvc __attribute__((always_inline)) gccで)。

29
Joe

はい、そうです。それはそれが良いアイデアだという意味ではありません。

24
jmkeyes

gcc最適化オプション ドキュメントによると、パラメーターを使用してインライン化を調整できます。

-finline-limit=n
By default, GCC limits the size of functions that can be inlined. This flag 
allows coarse control of this limit. n is the size of functions that can be 
inlined in number of  pseudo instructions.

Inlining is actually controlled by a number of parameters, which may be specified
individually by using --param name=value. The -finline-limit=n option sets some 
of these parameters as follows:

    max-inline-insns-single is set to n/2. 
    max-inline-insns-auto is set to n/2.

インライン化のすべてのパラメーターについて詳細に読んで、適切に設定することをお勧めします。

11

はい。他のオプションセットに関係なく、関数をインライン化します。 here を参照してください。

3
Matt Joiner

ここで、インライン化がパフォーマンスにとって絶対に重要なSIMD数学ライブラリがあることを付け加えます。最初はすべての関数をインラインに設定しましたが、逆アセンブリにより、最も些細な演算子であっても、実際に関数を呼び出すことになります。 MSVCとClangの両方がこれを示し、すべての最適化フラグがオンになっています。

SO)の他の投稿で示唆されているように、MSVCには___forceinline_を、他のすべてのコンパイラには__attribute__((always_inline))を追加しました。基本的な乗算から正弦波に至るまでの操作を伴うさまざまなタイトループでのパフォーマンス。

なぜインライン化がそんなに苦労したのかわかりませんでした(おそらくテンプレート化されたコードの方が難しいのでしょうか?)が、結論は次のとおりです。

好奇心が強い場合は、ここで実装します。 https://github.com/redorav/hlslpp

1
RedOrav

__always_inlineも使用できます。 GCC 4.8.1のC++メンバー関数にそれを使用しています。しかし、GCC docには適切な説明が見つかりませんでした。

0
Jie Xu