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