CPU的硬體資源是動態分配的,或者說,看運氣。
超執行緒這東西並不像想象的那麼美好,單核超執行緒,和雙核單執行緒的效能差距是很大的。
在實時性要求較高的作業系統裡,首要的事情就是關閉超執行緒,因為超執行緒會讓執行緒的執行時間變得不確定,據說高效能計算的也會關。
表面上看,是一個核跑著兩個執行緒,實際上兩個執行緒哪個線跑完是不確定的,同樣的程式碼的兩個執行緒,跑在一個核上,可能一個已經跑完了,另一個1/3都還沒過。
作業系統排程的時候,會根據核的繁忙程度來分配執行緒。至於會不會讓某一個核忙死另一個核在摸魚,這種事情很難說,看作業系統的排程器如何設計了。理論上說稍微有點腦子的作業系統都會解決這個問題,比如執行緒按照奇偶數的方式分配核心,先分配1、3、5、7,跑滿了以後才是2、4、6、8,這樣就可以避免摸魚的問題了。
反正我手頭的WIN7能明顯看出來這種現象(CPU為4核 i7-3770,開超執行緒):
------------------------
有人貼了AMD的架構,我放一張haswell的圖:
可以看到一個核上有不止一個ALU,像x86的LEA指令實際上是有計算的功能的,有單獨的ALU負責執行LEA這種指令,所以在任何時刻,一個核裡的執行單元都是不可能完全佔滿的,佔不滿的情況下,就有能力讓另外一個執行緒執行了,但如果兩個執行緒都需要同樣的執行單元(比如都需要進行浮點計算),那麼有一個執行緒就需要等待,此時執行緒的實際執行時間就是不可控的。
CPU的硬體資源是動態分配的,或者說,看運氣。
超執行緒這東西並不像想象的那麼美好,單核超執行緒,和雙核單執行緒的效能差距是很大的。
在實時性要求較高的作業系統裡,首要的事情就是關閉超執行緒,因為超執行緒會讓執行緒的執行時間變得不確定,據說高效能計算的也會關。
表面上看,是一個核跑著兩個執行緒,實際上兩個執行緒哪個線跑完是不確定的,同樣的程式碼的兩個執行緒,跑在一個核上,可能一個已經跑完了,另一個1/3都還沒過。
作業系統排程的時候,會根據核的繁忙程度來分配執行緒。至於會不會讓某一個核忙死另一個核在摸魚,這種事情很難說,看作業系統的排程器如何設計了。理論上說稍微有點腦子的作業系統都會解決這個問題,比如執行緒按照奇偶數的方式分配核心,先分配1、3、5、7,跑滿了以後才是2、4、6、8,這樣就可以避免摸魚的問題了。
反正我手頭的WIN7能明顯看出來這種現象(CPU為4核 i7-3770,開超執行緒):
------------------------
有人貼了AMD的架構,我放一張haswell的圖:
可以看到一個核上有不止一個ALU,像x86的LEA指令實際上是有計算的功能的,有單獨的ALU負責執行LEA這種指令,所以在任何時刻,一個核裡的執行單元都是不可能完全佔滿的,佔不滿的情況下,就有能力讓另外一個執行緒執行了,但如果兩個執行緒都需要同樣的執行單元(比如都需要進行浮點計算),那麼有一個執行緒就需要等待,此時執行緒的實際執行時間就是不可控的。