2012-07-19 67 views
1

我有一些代碼,其中有兩個或三個分支,你不知道他們將以什麼方式去,但在第一次被擊中後,它或者100%確定,或者接近於,相同路徑將再次發生。我已經注意到__builtin_likely的使用在避免分支遺漏方面沒有多大作用。儘管當我的函數在短時間內被重複調用時,分支預測做得很好。只要在函數調用之間還有其他事情發生,性能就會大大降低。有什麼辦法解決這個問題或者我可以研究一些技巧?任何方式來「標記」這些分支,當他們在流浪之後再次到達時?任何方式來更快地處理「可預測分支」?

+0

這通常是[PGO](http://en.wikipedia.org/wiki/Profile-guided_optimization)用於,如果您的編譯器支持它的話。 – ildjarn 2012-07-19 21:41:42

+0

當「有其他事情正在進行」時,性能總是會下降。使用一個好的分析器,所以你不會猜測這個。 – 2012-07-19 21:54:14

+0

我在過去看到過相同的函數實現了兩次,內置提示顛倒過來,並且有一個調度指針可以在錯誤預測的分支上重置......我不確定我會在非常緊的循環之外這麼做,並且你應該像Hans Passant所說的那樣:** profile **並確定分支預測錯誤是否真的是問題(如果其他事情在兩者之間執行,錯誤預測的成本可能不是真正重要的一塊) – 2012-07-19 22:06:01

回答

2

您可以使用模板爲每個代碼路徑生成不同版本的函數,然後使用函數指針在運行時選擇一個,以查找條件如何。

+0

我可能會玩這個。 – 2012-07-19 23:08:26

0

分支預測器和編譯器內在函數是你所擁有的。充其量,你可以看看程序集並嘗試自己手動進行一些優化,但是你不會找到太多東西。

+0

你是不是指__builtin_expect? – PlasmaHH 2012-07-19 21:43:18

+0

無論如何。點是一樣的。 – Puppy 2012-07-19 21:50:13

相關問題