超線程(hyperthreading)是Intel推的一種并發(fā)線程技術(shù),在Intel的Atom,Core i3, Core I5, 安騰等主流芯片上都已經(jīng)實(shí)現(xiàn)。你可以把它看成一種虛擬化,即把一個(gè)物理CPU,虛擬成兩個(gè)邏輯CPU,這兩個(gè)邏輯CPU共用相同的運(yùn)算核心,比如寄存器堆,加法器,浮點(diǎn)運(yùn)算,向量運(yùn)算部件之類的都共用。
既然要模擬兩個(gè)邏輯CPU,那肯定有不公用的,就是存儲(chǔ)狀態(tài)的所有邏輯寄存器。這樣,一個(gè)物理寄存器就可以通過(guò)片內(nèi)保存和恢復(fù)所有寄存器的方式來(lái)實(shí)現(xiàn)兩個(gè)虛擬CPU之間的切換。這個(gè)切換過(guò)程對(duì)軟件和操作系統(tǒng)透明,所以在操作系統(tǒng)中,若有超線程,我們能看到兩倍的處理器核數(shù)。
于是,問(wèn)題來(lái)了,cache呢?分支預(yù)測(cè)還做嗎?寄存器中的數(shù)據(jù)依賴呢?流水線上未完成的指令也保存嗎?最簡(jiǎn)單的方式,全都得刷新,但明顯,刷新性能會(huì)變差很多,不可行,但可以在每個(gè)cache,流水線隊(duì)列,這些需要切換并存儲(chǔ)狀態(tài)的位置,先增加1倍的容積,再添加一個(gè)標(biāo)志位,這樣應(yīng)該可以避免刷cache之類的。當(dāng)然,具體細(xì)節(jié)肯定沒(méi)有這么簡(jiǎn)單,欲知詳情,請(qǐng)轉(zhuǎn)到參考2。
兩個(gè)邏輯CPU需要調(diào)度嗎?答案是肯定的,OS只認(rèn)識(shí)邏輯CPU,物理CPU還需要調(diào)度邏輯CPU。何時(shí)切換?首先CPU運(yùn)算在何時(shí)會(huì)停頓?cache缺失,分支預(yù)測(cè)失敗,等待前一指令執(zhí)行結(jié)果等等都有可能造成CPU停頓,停頓時(shí)間從幾拍到幾百拍不等。切換工作都在X86指令變換位uops微指令之后,通過(guò)微指令調(diào)度器來(lái)實(shí)現(xiàn),參考2中說(shuō),這時(shí)的調(diào)度已經(jīng)沒(méi)有邏輯上的概念了,可以把兩個(gè)邏輯CPU上的線程混合起來(lái)調(diào)度。同時(shí),對(duì)于cache來(lái)說(shuō),如果兩個(gè)邏輯寄存器的微指令混合調(diào)度,就意味著cache的預(yù)測(cè)和存取可能存在沖突。還有死鎖問(wèn)題,等等。
最后,超線程技術(shù)到底適合什么樣的程序呢?很顯然,多線程程序的性能提升最大,本來(lái)操作系統(tǒng)要做的調(diào)度,上下文保存和恢復(fù)工作,由CPU做,而且CPU做僅僅在片內(nèi)保存,大大降低開銷。因?yàn)樵黾恿瞬l(fā)執(zhí)行能力,系統(tǒng)的響應(yīng)時(shí)間也大大提升。
那對(duì)于每個(gè)線程內(nèi)的程序呢?最小化CPU沖突很關(guān)鍵,如何最小化呢?盡可能把線程差異化,比如把計(jì)算和IO密集操作不要混在一個(gè)線程內(nèi),把浮點(diǎn)和整點(diǎn)運(yùn)算盡量分在不同的線程中。對(duì)于訪存,則看重同化,盡量讓可能同時(shí)執(zhí)行的線程訪問(wèn)相同的內(nèi)存,這樣共用cache,會(huì)降低物理CPU的cache缺失率。
咳咳,寫了這么多,本博的一個(gè)想法是,根據(jù)上面的要求調(diào)程序真的有必要嗎?如果能花錢雇得起這種程序員,一個(gè)月一兩萬(wàn)的薪水,還真能買幾個(gè)好CPU了,唉怎么跑怎么跑!價(jià)格便宜量又足。一個(gè)超線程,intel才只敢吹30%的性能提升,多買幾個(gè)CPU,輕輕松松上50%。不過(guò)對(duì)于多線程,大規(guī)模并發(fā)的大型網(wǎng)站服務(wù)器,超線程是個(gè)絕對(duì)好選擇。
參考:
- http://en./wiki/Hyper-threading
- Hyper-Threading Technology Architecture and Microarchitecture, technical description of Hyper-Threading




