2011-01-22 54 views
15

如果你產卵多線程(或進程)同時,爲更好產卵多達的物理處理器的數量或邏輯處理器的數量,假設任務CPU綁定?還是在兩者之間做一些事情比較好?(比如3個主題)?雙核超線程:我應該使用4個線程還是3或2?

性能是否取決於正在執行的指令種類(比如,非本地內存訪問是否與緩存命中大不相同)?如果是這樣,在哪些情況下利用超線程會更好?


更新:

我問的原因是,我記得讀書的地方,如果你有儘可能多的任務,如虛擬處理器的數量,在同一個物理核心任務有時會捱餓一些CPU資源並防止彼此獲得所需的儘可能多的資源,可能會降低性能。這就是爲什麼我想知道是否有像虛擬內核一樣多的線程是一個好主意。

回答

5

的性能取決於各種各樣的因素。大多數任務不是嚴格限制CPU的,因爲即使所有數據都存儲在內存中,它通常也不在處理器緩存中。我看過一些例子(如this one),其中內存訪問模式可以顯着改變給定「並行」進程的性能分佈。

總之,對於所有情況都沒有完美的數字。

+0

+1該鏈接非常豐富;謝謝! – Mehrdad 2011-01-22 23:51:28

2

我記得超線程技術可以提供高達30%的性能提升。一般來說,你最好把它們當作4個不同的核心。在一些特定的情況下,當然(例如,具有綁定到每個核心同樣長期運行的任務),你可以把你的處理更要考慮到一些核心只是邏輯一約超線程本身

更多信息here

+0

+1有趣......我讀HT其它Intel的文檔,但是這一次的不同,有很多的詳細信息;謝謝! – Mehrdad 2011-01-22 23:51:55

+0

鏈接現在404。 – user643011 2017-05-25 19:19:00

4

機會相當不錯,你會看到一個性能提升,每個核心啓用了超線程功能後運行2個線程。 似乎完全被CPU綁定的作業通常不是,並且HyperThreading可以從偶爾的中斷或上下文切換中提取幾個「額外」週期。另一方面,使用Turbo Boost的核心iX處理器,實際上你可能會更好地在每個內核中運行1個線程,以鼓勵CPU自行超頻。

在工作中,我們經常以全CPU的方式運行多核服務器,每次進行多種日計算。前一段時間,我們測量了有和沒有HT的性能差異。我們發現平均而言,使用超線程技術並且同時運行兩倍的作業,我們可以比不使用超線程技術快10%的速度完成相同數量的作業。

假設2 ×核心是一個很好的起點,但底線是:measure!

+0

+1感謝您指出Turbo Boost功能......我在自己的CPU上擁有它,但我從未想過如何影響部分等式。 – Mehrdad 2011-01-22 23:52:51

2

使用超線程上運行相同的核心兩個線程,當兩個線程也有類似的內存訪問模式,但不相交的訪問數據結構,將是非常大致相當於運行它們在每兩個獨立內核一半的緩存。如果內存訪問模式使緩存的一半足以防止抖動,性能可能會很好。如果內存訪問模式使得緩存減半導致抖動,則可能會有十倍的性能下降(意味着沒有超線程的情況下會更好)。

另一方面,在某些情況下,超線程可能是一個巨大的勝利。如果許多線程都將使用無鎖數據結構讀取和寫入相同的共享數據,並且所有線程必須看到數據的一致視圖,則嘗試在不相交的處理器上運行線程可能會導致抖動,因爲一次只有一個處理器可能對任何給定的緩存行具有讀寫訪問權限;在兩個內核上運行這樣的線程可能比每次僅運行一個線程需要更長的時間。但是,當一個數據被單個內核上的多個線程訪問時,不需要這種緩存仲裁。在這些情況下,超線程可能是一個巨大的勝利。

不幸的是,我不知道有什麼辦法讓調度程序有任何「提示」來暗示某些線程應儘可能共享一個內核,而其他線程應儘可能單獨運行。

0

所有其他的答案已經給了很多優秀的信息。但是,還有一點要考慮的是SIMD單元在同一芯片上的邏輯內核之間共享。所以,如果你使用SSE代碼運行線程,你是在所有4個邏輯核心上運行它們,還是隻產生2個線程(假設你有兩個芯片)?對於這種奇怪的情況,最好用你的應用程序進行配置。

1

對於,HT允許提升約10-30%,主要是使用額外虛擬內核的cpu綁定任務。儘管這些任務可能看起來像CPU一樣,除非它們是定製的程序集,但它們通常會遭遇RAM和本地高速緩存之間的IO等待。這允許在另一個線程正在等待IO時,在啓用物理HT的核心上運行的一個線程工作。這確實帶來一個缺點,因爲兩個線程共享相同的緩存/總線,這將導致每個線程在等待IO時暫停兩個線程。

在最後一種情況下,運行單個線程會降低最大同時理論處理能力(降低10-30%),有利於運行單線程,而不會緩慢緩存抖動,這在某些應用中可能非常重要。

選擇使用哪個內核與選擇運行多少個線程同樣重要。如果每個線程的CPU大致持續時間大致相同,最好設置親和力,以便使用大多數不同資源的線程可以找到不同的物理內核,並且使用公共資源的線程可以分組到相同的物理內核(不同的虛擬內核)可以從相同的緩存中使用通用資源,而無需額外的IO等待。

由於每個程序具有不同的CPU使用特性,緩存抖動可能是也可能不是主要的減速(通常是),因此無法確定理想的線程數量應該是多少,而不需要首先進行性能分析。最後要注意的是OS/Kernel也需要一些CPU和緩存空間。如果在CPU綁定線程上需要實時延遲,以避免共享緩存/ cpu資源,那麼爲操作系統保留單個(物理)內核通常是理想的選擇。如果線程經常等待IO並且高速緩存抖動不成問題,或者如果運行專門爲該應用程序設計的實時操作系統,則可以跳過這最後一步。

http://en.wikipedia.org/wiki/Thrashing_(computer_science) http://en.wikipedia.org/wiki/Processor_affinity

相關問題