2011-10-17 3 views
3

私はgccに再帰をアンロールさせたいが、再帰的ではあるが尾部の再帰的なインライン関数は持っていない。はい、私はもちろんg++ -O3 -funroll-loopsを使用しています。再帰インライン関数のアンロールでg ++/gccの効果はどれくらいですか?

inline void recurse_fun(..., unsigned depth = 0, unsigned max_depth = 40) { 
    if (++depth > max_depth) return; 
    for (auto i = ..., iend = ...; i != iend; i++) { 
     if (...) continue; 
     ... 
     recurse_fun(...,depth,max_depth); 
    } 
} 

私は簡単にgccが適切にアンロールべき、手動stack<...>オブジェクトを処理することによって、これを置き換えることができますが、それは非常にエレガントや保守性などではないでしょう。

私は実際に両方のバージョンのプロファイリングを試みるべきですが、誰かが最近のgccのバージョンがこれを正しく処理するかどうか、自信を持って言うことができるかどうか不思議です。

+1

関連:http://ridiculousfish.com/blog/posts/will-it-optimize.html –

+0

あなたは生成されたアセンブリ言語を見ることができますか?さらに、1)これを行う関数はインライン化されても些細な利点があり、2)コンパイラはインライン再帰関数をインライン化するのでしょうか?それは私を驚かせるだろう。 3)内部ループをアンロールすることを意味する場合、その内部に関数呼び出しがある場合、それはあまり節約されません。 –

+0

Nice find、Josh Lee! :)はい、プロファイラMike Dunlaveyと一緒に演奏するのではなく、アセンブラを読むほうがずっと簡単です。 –

答えて

1

GCC(4.5または4.6のような少なくとも最近のバージョンでは)いくつかのテール再帰呼び出しを展開します。 もちろん、最適化を依頼する必要があります(-O2または-O3が必要です)。それはあなたがやっているかを理解するには

  • gcc -O3 -fverbose-asm -S yoursource.c
  • ようなものでアセンブリ出力を求めることができます
gcc -c -fdump-tree-all -fdump-ipa-all -O3 yoursource.cのように、様々な dump filesを求める(および他のダンプ・ファイルがあります)

GCCはたくさんのダンプファイルを印刷することに注意してください。また、ダンプファイルは、GCC開発者やGCCプラグイン開発者(またはGCC MELT開発者)に役立つだけです。彼らがGCCのあるリリースから次のリリースに同じフォーマットで留まることを期待しないでください。

ダンプファイルの番号付けは無用です。時間的または論理的ではありません。

そして、ダンプ・オプションは、(おそらく2012年に4.7、)次のGCCのリリースで変更する可能性がある