關於小賢作業系統 coarse-grained multithreading 的解答

問題與回答

C 語言

Java

C#

學習方法

日常生活

專題製作

訊息

相關網站

參考文獻

最新修改

簡體版

English

小賢的問題:

請問…關於作業系統一顆處理器中的多緒行緒有兩種實作方式,粗質執行緒(coarse-grained)與細質的執行緒,課本裡說到粗質會執行一條執行緒一直到出現記憶體失速(Memory stall)才進行切換並清空管線,這樣的成本很高;而第二種細質執行緒的方式會在每個cycle不斷切換不同的執行緒,這樣的成本比較低。    

我的問題是細質執行緒會一直切換執行緒為什麼這樣的成本會比粗質還低呢?

回答:

我試圖尋找一個解釋,但不知道合不合理,SMP 的架構中每個 CPU 都有一個 cache,因此 cache 中儲存了一堆指令,但是這堆指令的來源到底是同一個 thread 的還是不同 thread 的呢?

假如是同一個 thread 的指令,那麼進行 thread switching 的成本就會非常的高,因為整個 cache 都會失效而重讀。這也正是 corase-grained multithreading 所採用的方法,因為在 memory stall (記憶體存取時期) 正好可以將 cache 清空載入新的程式區塊與記憶區塊。

假如是不同 thread 的指令,那麼進行 thread switching 的成本就低多了,因為 cache 不需要全部失效,而是讓多個 thread 的指令都同時在 cache 當中,於是在進行 thread switching 的成本就會較低。舉例而言,假如兩個 thread 在同一個 CPU 中,這兩個 thread 的 register set 全部都可容納在該 CPU 的 cache 中,於是在 thread switching 的時候並不需要存取記憶體,只要存取 cache 即可,如此就能在不需要進行記憶體存取的情況下切換 thread 了 (雖然仍然要存取 cache)。

請注意關鍵在 SMP 的硬體架構,每個 CPU 都有自己的 cache 這個特性,因此 fine-grained 的架構可以不需要重新讀取 memory。

但是仍有一些小疑點,作者提到 corase-grained multithreading 的 pipeline 需要重新 flush 之後才能進行,這表示 fine-graine multithreading 的 pipeline 不需要 flush 就能繼續進行。

經過思考之後,我認為在fine-graine multithreading 的 pipeline 不需要 flush 就能繼續進行是可行的,thread 切換確實不會影響到整體效能太多。

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License