а так не пойдет?
bool GetCPUInfo( size_t& nCores, size_t& nLogicCores )
{
unsigned __int32 regs[4] ={0x00};
// Get vendor
char vendor[12] ={0x00};
cpuID(0, regs);
((unsigned *)vendor)[0] = regs[1]; // EBX
((unsigned *)vendor)[1] = regs[3]; // EDX
((unsigned *)vendor)[2] = regs[2]; // ECX
std::string cpuVendor = std::string(vendor, 12);
// Get CPU features
cpuID(1, regs);
unsigned __int32 cpuFeatures = regs[3]; // EDX
// Logical core count per CPU
cpuID(1, regs);
unsigned __int32 logical = (regs[1] >> 16) & 0xff; // EBX[23:16]
nLogicCores = static_cast<size_t>( logical );
unsigned __int32 cores = logical;
if( cpuVendor == "GenuineIntel" )
{
// Get DCP cache info
cpuID(4, regs);
cores = ((regs[0] >> 26) & 0x3f) + 1; // EAX[31:26] + 1
}
else
if (cpuVendor == "AuthenticAMD")
{
// Get NC: Number of CPU cores - 1
cpuID(0x80000008, regs);
cores = ((unsigned __int32)(regs[2] & 0xff)) + 1; // ECX[7:0] + 1
}
nCores = static_cast<size_t>( cores );
// Detect hyper-threads
return ( cpuFeatures & (1 << 28) && cores < logical );
}