超線程技術在線程這個層面是否是真正的空間並行?

intel的超線程技術是給處理器添加一個邏輯處理單元,其餘部分的運算單元基本是沒有變化的,基本原理是對於不同的不相關線程,令部分閑置的運算單元也能充分利用。

按照這個原理的解釋,超線程技術在空間上應該是完全並行的。

參考以前UNIX系統上實現的多線程,一方面從系統角度而言是時分復用的,也就是說實際上多線程的實現仍是在不同線程間切換來實現的——實現原理是線程A對應的處理器狀態被保存到寄存器,然後載入線程B的處理器狀態,執行線程B,實現上下文切換。

——而超線程技術僅是在這個基礎上做了助力,也就是說,「多線程」仍是通過切換來實現的,因為上下文切換是需要資源成本開銷的,在超線程技術中硬體對多線程的協助是令這個切換過程在瞬間實現。

那麼從這個角度理解,是否超線程實際上並不是真正的並行呢?

第一段所講的利用不同運算單元的並行,這個的並行層面應該是對超線程技術的解釋吧?——即便有時指令並行,可能本身並行的指令就屬於不同線程,也就實現了多線程。

*這裡不討論多核心問題...

相關提問:http://www.zhihu.com/question/20508086


Intel的超線程技術,目的是為了更充分地利用一個單核CPU的資源。CPU在執行一條機器指令時,並不會完全地利用所有的CPU資源,而且實際上,是有大量資源被閑置著的。超線程技術允許兩個線程同時不衝突地使用CPU中的資源。比如一條整數運算指令只會用到整數運算單元,此時浮點運算單元就空閑了,若使用了超線程技術,且另一個線程剛好此時要執行一個浮點運算指令,CPU就允許屬於兩個不同線程的整數運算指令和浮點運算指令同時執行,這是真的並行。

我不了解其它的硬體多線程技術是怎麼樣的,但單就超線程技術而言,它是可以實現真正的並行的。但這也並不意味著兩個線程在同一個CPU中一直都可以並行執行,只是恰好碰到兩個線程當前要執行的指令不使用相同的CPU資源時才可以真正地並行執行。

參考:

超執行緒(執行緒就是線程的意思),http://zh.wikipedia.org/wiki/%E8%B6%85%E5%9F%B7%E8%A1%8C%E7%B7%92


超線程"可能"是並行的,也可能不是並行的.

前面一位解釋的非常對,其實現在的CPU,即使只有一條線程,從微觀來看也是並行的,

比如有三條彙編指令構成的一小段程序:

1.浮點數X加一

2.定點數Y加一

3.定點數Z乘10

那麼,CPU在執行的時候,並不是一條一條按照順序執行的,這三條進入流水線之後這三條指令實際上是並行執行的.CPU會一直保持這種並行直到遇到了邏輯相關的指令上下文,例如:

1.浮點數X加一

2.定點數Y加一

3.定點數Y乘10

顯然2和3之間存在先後順序,不能並行,但1和23之間還是可以並行的.

因此,假如能寫出大量的邏輯無關的,各種加法,乘法,浮點,內存讀寫混合的代碼來,CPU的微觀並行

是很高效的.只是滿足這種條件太難了.

超線程的概念和上面所說差不多,假設有兩個線程A和B,他們分別由三條彙編指令構成:

1.A線程浮點數X1加一

2.A線程浮點數Y1加一

3.A線程浮點數Z1乘10

1.B線程定點數X2加一

2.B線程定點數Y2加一

3.B線程定點數Z2乘10

CPU執行它們的時候並不是分時間片得,而是將兩條線程的指令"打散",變成這種形式:

1.A線程浮點數X1加一

1.B線程定點數X2加一

2.A線程浮點數Y1加一

2.B線程定點數Y2加一

3.A線程浮點數Z1乘10

3.B線程定點數Z2乘10

這樣,就可以微觀層面上浮點和定點是並行的,從而也保證了A和B宏觀上的並行執行.

當然上文是理想情況,實際上完全沒有那麼有效.大多數情況下不能做到並行,而且可能還會

更慢.....


歪個樓:

我們做超算比賽的時候都是關了超線程的。。。

--待續--


intel的超線程有幾個(?不記得了)版本,你說的似乎是奔騰4時代的版本。

1)可以簡單地理解為執行單元負責執行,硬體多線程負責線程上下文的管理。

2)奔騰4時代,因為流水線太長,執行單元會「冷」,所以會將部分非當前線程的指令讓冷單元執行,提高流水線利用率。

3)如上,不能簡單地理解為完全不是並行,也不能理解為完全並行。

4)應該是部分並行

5)歷史和測試數據都證明,此技術在當時意義不大。

酷睿時代的超線程,因為執行單元的效能提高,表現要明顯優於舊時代。

本人不是這方面的專家,只是聽過一位intel工程師講解,如有不實,請指正。


要看情況

似乎聽說大約奔騰U裡面有一條簡單指令的流水,一條複雜指令的流水。。。如果是恰好有一個簡單操作和一個複雜操作,那麼是可以做到物理上的並行的。。如果沒那麼恰好。。。在某些關鍵節點上,還是需要時間劃分的。。。但總的來說,部分的並行也好過一條一條的指令順序執行。。。。而且超線程根本目的是提高CPU各個模塊的使用率,本質上還是單核U,單核要做到任意指令的完全並行。。自然是沒機會的。。。。不然還要雙核四核來幹嘛。。。


不是空間並行,而是時間並行

你所說的操作系統,算是分時操作系統,現在大部分的操作系統均為分時

這類的操作系統會把CPU時間細分,然後在某個適當的時間粒度上輪流執行這些線程,讓每個線程都有機會被執行到。只要在人所能感知的時間粒度上(差不多是100~200ms)每個線程都有機會做一點事情,用戶就會認為這些線程是在同時執行的。這種並行叫做偽並行。

當計算機有多個處理器的時候,偽並行可能會變成真並行,也就是你所說的空間並行。


我覺得多線程是concurrent,是在同一時間段內的「並行」,在單cpu下是一種交替執行;多cpu下可能會是真正的並行運算吧。並行是parallel,是真正的空間並行,是同一時刻的「並行」。


推薦閱讀:

電腦中有哪些必不可少的軟體 或者 有意思的軟體?
演算法導論這類書有必要看英文版嗎?
如果讓你推薦一本 Linux 書籍,你會推薦什麼?
有那些有價值的關於計算機互聯網的紀錄片?
內存分頁技術可以讓 32 位操作系統管理 4GiB 以上內存,是什麼原因讓系統可用的物理內存容量受限於 4GiB?

TAG:英特爾Intel | 中央處理器CPU | 計算機 | 信息技術IT | 硬體 | AMD | 並行計算 | 多線程 |