检测AMD CPU是否有模块

时间:2014-07-15 13:34:01

标签: assembly x86 intrinsics amd-processor cpuid

某些Intel CPU具有超线程功能,我可以通过阅读bit 28 in register EDX from CPUID来检测。 AMD CPU没有超线程,但其中一些有modules which have two integer units and one floating point unit。有没有办法,比如通过CPUID来检测CPU是否有模块?

编辑:根据Jester的回答,我提出了以下未经测试的功能(我无法访问AMD处理器)来确定每个"计算单元的内核数量&# 34; (又名模块)。

// input:  eax = functionnumber, ecx = 0
// output: eax = output[0], ebx = output[1], ecx = output[2], edx = output[3]
//static inline void cpuid (int output[4], int functionnumber)  

void coresPerComputeUnit() {
    int abcd[4];
    int cores = 1;
    cpuid(abcd,0x80000000);
    if(abcd[0]<0x8000001E) return; // Fn8000_001E not available 
    cpuid(abcd,0x8000001E);  
    cores += (abcd[1] & 0xff00) >> 8; //ebx bit 15:8 CoresPerComputeUnit
}

http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/42301_15h_Mod_00h-0Fh_BKDG1.pdf

1 个答案:

答案 0 :(得分:1)

您可以使用cpuid Fn8000_001E计算单位标识符。 EBX的比特15:8(即BH)包含 CoresPerComputeUnit:每个计算单元的核心。价值:特定产品。每个计算单元的核心数是CoresPerComputeUnit + 1.

请参阅AMD Bios和内核开发人员指南。