2016-03-08 70 views
1

我正在使用VS2012 C++ Windows 7,我需要獲取有關CPU多線程的信息來計算可用邏輯處理器的數量。使用VS2012支持__asm__ __volatile__彙編代碼

I'm代碼(從This SO Post

typedef __int32 int32_t; 
typedef unsigned __int32 uint32_t; 

uint32_t registers[4]; 
__asm__ __volatile__ ("cpuid " : 
         "=a" (registers[0]), 
         "=b" (registers[1]), 
         "=c" (registers[2]), 
         "=d" (registers[3]) 
         : "a" (1), "c" (0)); 

unsigned CPUFeatureSet = registers[3]; 
bool hyperthreading = CPUFeatureSet & (1 << 28); 

該組件不能編譯,提示以下錯誤:

error C2065: '__asm__' : undeclared identifier 

從來就試圖改變以__asm __volatile並把一切單行爲:

__asm __volatile ("cpuid " : "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3]) : "a" (1), "c" (0)); 

這也行不通,leadi ng到:

error C2400: inline assembler syntax error in 'opcode'; found '(' 

幫助讚賞解決這個問題。

+0

這是gcc的語法,它不會在這樣的VS中工作。您需要自行輸入輸出,但如果您沒有可以打電話來獲取此信息的winapi功能,我會感到驚訝。 – Jester

+0

Buf ...我不能寫彙編器...'mov'應該去哪裏? – Mendes

+0

此外,語法完全不同。在MSDN上查找它。 – edmz

回答

2

您可以使用提供的API查詢當前機器的體系結構,包括處理器和內核數量以及NUMA體系結構。

+0

哪一個給我「處理器核數」和「邏輯處理器數量」管理 - >性能? – Mendes

+2

您也可以使用[GetLogicalProcessorInformation](https://msdn.microsoft.com/en-us/library/windows/desktop/ms683194.aspx)獲取更多詳細信息。 –

4

如果你堅持使用CPUID,你應該使用__cpuid()內在功能。 msdn page甚至附帶示例代碼。這樣的事情:

#include <intrin.h> 

void foo() 
{ 
    uint32_t registers[4]; 
    __cpuid(registers, 1); 
    unsigned CPUFeatureSet = registers[3]; 
    // ... 
} 
+2

還有一個''__cpuidex'',如果你需要找到需要在ECX中使用子功能的CPUID擴展 –