發表文章

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

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: 插入人類語言解釋 ...

I see it, but I don't believe it

有考過資工研究所的人, 唸書時應該都有學過一題"證明 0 ~ 1 之間有無限多個不可數實數"的證明 (*), 但是一般上課應該沒有人會講這個證明的由來, 今天我在看講解 Turing Machine 的書上看到它的由來. 這是一個叫 Cantor 的人在 1891 年發表的論文, 用了一個超級簡單的方法, 叫做"對角線法", 簡單到只要有國小六年級的數學程度就可以看得懂, 可是情感上很難讓人接受這樣的結果. 他更早的證明, 自己的 comment 是"我看到了, 可是我難以相信 (I see it, but I don't believe it)". 這句話真是相當貼切. 這樣回頭看來, 研究所考這樣的題目真是非常殘忍. 其實這些問題都非常的困難, 也困擾了一堆數學家很多年, 卻要在考題上出現讓我們這些二流學生去解, 不靠先看過或背過, 現場我看是沒解出來的機會吧. 最後這傢伙是在精神病院過世的, 唉, 數學家, 歹路不可行... *  http://www.matrix67.com/blog/archives/4812