發表文章

目前顯示的是有「kernel」標籤的文章

likely and unlikely in linux

Linux kernel source code 裡面常看到在 if 的條件裡加上 likely / unlikely 來暗示電腦 true or false 發生, 到底它是怎樣讓效率比較好的? 如果有人說這個是在"暗示處理器的 branch prediction", 這是錯的, 因為處理器的 branch predictor 是硬體機制, 我不確定有沒有辦法去修改, 但至少 likely / unlikely 完全不是這麼回事. 追了一下 kernel 的 source code 看到它是由 macro 定義的:  #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0)  透過反組譯就可以查出 __builtin_expect 到底在做什麼 (*), 簡單說就是把 被暗示較有可能會執行到的 code 放在下面靠近的幾行 (pipeline 後續會抓進來) 被暗示較不會被行到的 code 放遠一點, 不幸發生再 jump 過去" 這麼做的好處是可以保持 pipeline 是滿的, 因為 jump 到遠一點的地方後, 該處的"後續指令"要重新抓, 那就得把目前 pipeline 裡的東西 flush 掉重抓, 自然效率是前者比較好了. 所以總結, 這只是 compiler 幫你排一下 (暗示 compiler 可能還貼切點), 看哪一個排法比較不會影響 pipeline 的效率, 和影響 branch predictor 是二回事. * http://my.oschina.net/moooofly/blog/175019 (注意 code 當中 je 和 jne 跳到哪裡去了) ** http://stackoverflow.com/questions/248693/double-negation-in-c-code/249305#249305 ( __built_expect 二個驚嘆號算是一個小 trick, 叫做 double negation, 目的是快速的把 x 變 boolean 值) /* Update: 插入人類語言解釋 ...