2010-05-25 34 views
6

我已經可以在所有這三個平臺上正確檢測到邏輯處理器的數量。C/C++/Assembly以編程方式檢測Windows,Mac和Linux上的超線程是否處於活動狀態

爲了能夠正確檢測物理處理器/內核的數量,我必須檢測是否支持超線程並且處於活動狀態(如果您願意,可以啓用),如果是這樣,則將邏輯處理器的數量除以2以確定物理處理器的數量。

Perphaps我應該提供一個例子:

四核Intel的CPU與啓用超線程有4個物理核心,但8個邏輯處理器(超線程創建4多個邏輯處理器)。所以我目前的功能將檢測8而不是所需的4.因此,我的問題是,如果有一種方法來檢測是否支持超線程和啓用?

回答

4

Linux操作系統:

編號物理CPU:

grep -i "physical id" /proc/cpuinfo | sort -u | wc -l 

邏輯CPU數目:

grep -i "processor" /proc/cpuinfo | sort -u | wc -l 
+0

猜測我不得不在你的程序中使用boost庫中的grep.cpp來使用它。我的問題是針對主題和標籤中提到的c/C++/assemler特定的問題 – HTASSCPP 2010-05-26 16:24:46

5

CPUID指令(當你通過在EAX函數1H)返回它們超線程功能標誌在EDX寄存器的第28位。我認爲即使每個核心只能運行一個線程,多核處理器也會報告它們是超線程的。

它還返回EBX位23-16中每個物理處理器的邏輯處理器數量。我認爲你必須單獨查詢每個處理器才能打到系統中的所有處理器。

4

在Windows 2003 Server和Windows XP SP3及更高版本上,您可以使用GetLogicalProcessorInformation系統調用來確定此信息。

+0

這個工作可以讓我們說Windows 7或Windows Server 2008 RC2嗎?或者我應該使用GetLogicalProcessorInformation呢? – HTASSCPP 2010-05-26 16:26:15

+0

msdn頁面顯示SYSTEM_LOGICAL_PROCESSOR_INFORMATION :: ProcessorCore.Flags字段「如果此成員的值爲1,則由ProcessorMask成員的值標識的邏輯處理器共享功能單位,如超線程或SMT中所示。否則,標識的邏輯處理器不共享功能單元。「但它也表示Windows Vista之前的價值是錯誤的,然後只意味着邏輯處理器處於相同的物理包中。還有更多的問題:確實沒有指定調用將以有用的方式對邏輯處理器進行分組。 – 2014-04-26 09:53:59

3

在OS X:

#include <sys/sysctl.h> 

int physicalCores; 
sysctlbyname("hw.physicalcpu", &physicalCores, sizeof(physicalCores), NULL, 0); 

更多信息請見頁眉或手冊頁。 (請注意,您可以使用「hw.logicalcpu」字符串以相同的方式獲取邏輯cpus的數量)

+0

在我測試過的所有機器上完美地工作,謝謝! – HTASSCPP 2010-05-26 16:26:57

相關問題