天天看點

《高性能科學與工程計算》——1.5 多線程處理器

本節書摘來自華章計算機《高性能科學與工程計算》一書中的第1章,第1.5節,作者:(德)Georg Hager Gerhard Wellein 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

所有現代的處理器都以高度流水線化來提高性能(如果可以使用流水線)。前面提到,一些因素會影響流水線的高效利用:相關性、存儲延遲、不确定的循環長度、指令混合以及分支判斷錯誤等(參考2.32節)将導緻流水線頻繁等待,很大一部分執行資源處于空閑狀态(見圖1-19)。不幸的是,這種情況是規則而不是意外。為了提高時鐘頻率而盡可能設計長流水線會增加算法的複雜性,結果導緻沒有獲得成比例的性能提升,處理器也會有更多的功耗。

《高性能科學與工程計算》——1.5 多線程處理器

正是由于這個原因,到很多現代的處理器設計中加入了線程,也叫做超線程技術(Hyper Threading)[V108,V109]或者實時多線程(Simultaneous Multithreading,SMT)。這種設計的特點是CPU核的結構狀态多次複現在不同的線程中,結構狀态包括資料、狀态和控制寄存器,還有棧和指令指針,但諸如算術運算器、cache、記憶體接口等執行資源沒有重複。由于多個結構狀态的存在,CPU看起來像是包含了一組核(有時也叫邏輯處理器),可以并行執行多個指令流或者線程,而不用理會它們是否屬于同一個程式。硬體必須記錄指令屬于哪個結構狀态。所有線程共享這些執行資源,是以由流水線阻塞而産生的氣泡可以用另外一個線程的指令來填充。如果存在并行運作的多個流水線(參見1.2.4節),一個線程擱置了或者多個流水線正處于空閑狀态,則另一個線程就可以使用它們,參見圖1-20。

《高性能科學與工程計算》——1.5 多線程處理器

https://yqfile.alicdn.com/7c07989f503f91eadb27bb9a234669e836d9d8f0.png

" >

SMT可以通過多種不同的方式實作。這些方式的一個不同點是在流水線上線程如何實作切換。理想的情況切換按周期發生,但是很多實作方式需要将流水線全部清空來支援另外一個線程,這會帶來非常大的延遲。

如果多個線程的代碼既可以發射在同一流水線内也可以發射在不同的流水線上,則SMT可以提高指令的吞吐量。如果不同的線程使用不同的執行資源,比如浮點運算和整數運算,就很容易提高吞吐量。一般以浮點操作為主的科學計算,經過很好的優化後,并不能從SMT中獲益太多,但是也有例外:在一些架構上,記憶體引用表的數量與現線程數量一緻時,同時運作足夠多的線程就能夠充分利用主存帶寬。

如果對于擁有SMT的線程資源有限,單個指令流的性能不會提高,甚至會有小小地下降。并且,多個線程共享很多資源尤其是cache時,如果代碼對cache容量敏感就很可能增加cache容量沖突(由高速緩存容量較小引起的容量沖突)。最後,SMT會嚴重增加同步操作的開銷:如果同一實體核執行的幾個線程都通過執行緊湊的自旋等待循環等待某些事件,它們将競争共享的執行單元,這将導緻很大的同步延遲。[132,133,M41]

如果系統上有多個實體核,并且作業系統和程式員了解SMT機制,那麼在不同實體核上預設運作不同程式的線程和程序是一個不錯的想法,但隻有在確定安全時才使用SMT來提高總體性能。SMT的出現,仿射機制将比在多核晶片上更重要(參考1.4節和附錄A)。對于手頭的應用程式,需要徹底測試才能确定SMT機制是否能提高性能。如果不能在一個實體核上通過合适仿射應該隻保留一個邏輯核,并且如果可能的話SMT應該被一起關掉。

繼續閱讀