2014-09-04 25 views
7

gcc(最新版本:4.8,4.9)是否具有類似於由icc支持的__assume()內置的「假定」子句? 例如,__assume(n % 8 == 0);gcc中的「假設」子句

+3

請參閱:'__builtin_expect'? https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html – 2014-09-04 14:29:55

+0

看起來像是分支預測,我需要提示向量化程序,循環計數是一個很好的數字。 – user2052436 2014-09-04 14:36:56

+0

我無法訪問icc,它是否與Visual C __assume()相同? (http://msdn.microsoft.com/en-us/library/1b3fsfxw.aspx) – 2014-09-04 15:06:01

回答

9

從gcc 4.8.2開始,在gcc中沒有__assume()的等價物。我不知道爲什麼 - 這將是非常有用的。 mafso建議:

#define __assume(cond) do { if (!(cond)) __builtin_unreachable(); } while (0) 

這是一個古老的把戲,至少早在2010年就已知,可能更長。編譯器通常優化'cond'的評估,因爲任何對cond爲false的評估都是不確定的。然而,如果它包含對不透明(非內聯)函數的調用,它似乎並沒有優化'cond'。編譯器必須假定不透明的調用可能有副作用(例如,改變全局),並且不能優化掉呼叫,儘管它可以優化結果上的任何計算和分支。出於這個原因,宏觀方法充其量只是一個部分解決方案。

+1

在gcc 5.2和6.1中也遇到了這個問題。當基礎表達式不透明時,cond沒有被優化。即使cond被包裝在純函數中,你會認爲編譯器可以自由優化。 另外我還沒有找到一種方法來檢測編譯器是否優化了cond。這意味着使用這個宏可能會讓編譯器無聲地添加不必要的代碼,從而損害性能。 雖然透明的表達,但宏工作得很好。 – user377178 2016-08-03 20:25:00