2015-11-06 92 views
-2

超線程可能會傷害某些應用程序的性能,因此不應使用它。從微軟的網站(https://msdn.microsoft.com/en-us/library/cc615012%28BTS.10%29.aspx):如何決定是否使用超線程?

至關重要超線程可對於BizTalk Server 電腦關閉。超線程使服務器似乎擁有比實際更多的處理器/處理器內核。然而,超線程處理器通常提供物理處理器/處理器內核的性能的20%到30%之間。當BizTalk 服務器計算處理器的數量來調整其自調諧算法 ;超線程處理器會導致對這些調整 傾斜,這對整體性能不利。

過程套索計劃允許對一些過程禁用超線程:

您可以使用程序,如過程套索(免費)設置默認CPU 親和力的關鍵過程,使自己的線程永遠得不到 分配給邏輯核心。我們稱之爲HyperThreaded Core 避免。

我有一些執行大量數學計算的較舊程序。看到他們使用一個核心是令人沮喪的,如果他們可以使用4.我想重寫它們以使用許多線程。他們使用大型連續內存塊,因此緩存未命中數量很少。我的問題如下:

  • 如何決定是否在您的應用程序中使用超線程? (如有必要,請提供一些具體技術細節的指導)
  • 是否需要進行實驗以作出最終決定?
  • 如何避免超線程在您的應用程序,如果它不是有利的? (在C++和c中的例子)
+2

超線程(有點)是CPU內部的概念。您聽起來更像是在討論線程,而不是專門爲超線程定製代碼,因爲超線程可以被認爲是「假」核心。 – Olipro

+0

你是指多線程? – NathanOliver

+0

是的。超線程是一些CPU的技術性東西。多線程是編程併發執行代碼的一種方式。在多線程環境(或多進程環境)中,它顯然取決於所執行的處理類型,關於這些處理您不會提供詳細信息。 – hexasoft

回答

2

我不知道Process Lasso的作品是「禁用超線程」。對於那個特定的應用程序,你可以做的最好的做法是將DLL注入到系統的每個進程中,調用SetProcessAffinityMask,其中只包含猜測,禁用其他每個核心,希望操作系統避免調度到超線程邏輯核心。

猜測和希望,沒有什麼在Windows API中可以做到這一點。這回答你的第三個要點。

您可以禁用HyperThreading作爲BIOS級別(通常)。

我無法評論Microsoft爲BizTalk禁用HT的建議,your linked article,因爲我找不到本文的日期。唯一有趣的是關於「賦予邏輯處理器的中斷關聯......」,對我來說是新的。關於HT的文章中唯一的其他建議是相當薄弱的。

更大的說明:我不知道你爲什麼要問HyperThreading,當你應該關心多線程時。如果您擔心多個線程爭奪相同的共享資源......則請勿在您的應用中使用線程。

一個幽默撇開:同一家公司也出售一款名爲SmartTrim的產品,讓人想起在90年代流行的RAM-doublers

2

基本上,它歸結爲配置執行CPU工作負載的併發線程數。操作系統知道超線程,並將線程分配給物理內核直到它耗盡,並且只有在線程數多於物理內核的情況下才會開始將工作分配給邏輯內核。

要確定線程的最佳數量是物理還是邏輯內核的數量,測量真實任務的性能是最好的方法。綜合基準​​可以告訴你一些關於超線程如何工作的內容,但不會告訴你什麼最適合你的特定指令組合。

控制線程數量的確切方法取決於您使用的多線程構造 - 如果您自己創建線程,則很明顯,但線程池和自動化並行性框架(如OpenMP)也提供調整線程數的方法。

+1

實際上,如果您的程序運行在4C/8T CPU上有4個線程,會有2個線程分配給同一個物理內核的時間。這可能是因爲OS隨時處理幾十個後臺線程。只有顯式親和力控制可以防止這種情況儘管如此,答案很好。 –

+1

請參閱處理此問題的procs上的'numactl'。 – hexasoft

+0

@void_ptr:當然,但是因爲你的線程是CPU綁定的,他們幾乎都會坐在獨立的物理內核上,後臺線程偶爾會被調度到邏輯內核上,從你的線程中竊取資源。即使您在您的線程上分配親和力,也會發生這種情況。 –

相關問題