Re[2]: Определение количества физических и логических процессоров
От: Lepsik Индия figvam.ca
Дата: 14.02.13 15:03
Оценка:
а так не пойдет?


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 );
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.