Intel® ISA Extensions
Use hardware-based isolation and memory encryption to provide more code protection in your solutions.

CPUID signature

zhangxiuxia
ビギナー
2,166件の閲覧回数
Intel 64 and IA-32 Architectures Optimization Reference Manual
Order Number: 248966-024
April 2011

APPENDIX C
INSTRUCTION LATENCY AND THROUGHPUT


it said using cpuid can catch cpuid signature

set eax=1
the cpuid
the low 12bit of eax is cpu signature
//--------------------------------------------------------------//

#include
int
main ()
{
int low12bit;
int ebx, ecx, edx, eax;
ecx = 0;
edx = 0;
ebx = 0;
eax = 1;
__asm__ ("cpuid": "=b" (ebx), "=c" (ecx), "=d" (edx), "=a" (eax):"a" (eax));

low12bit = eax & 0x0FFF;
printf ("%x %x %x %x \\n", eax, ebx, ecx, edx);
printf ("%x\\n", low12bit);
printf("model %x \\n",44);
return 0;
}
~
//-----------------------------------------------------------------//

But I can not get the same value as waht the manual said .
On sandyBirdge , I get 06a7 , but on the manual , the sandybirge is 062a
On Nehalem , I get 06A5(E5530) , 06C2 (X5650), not the same as manual


When I read the manual carefully , I find that
"
The column represented by 0xF3n also applies to
Intel processors with CPUID signature 0xF4n and 0xF6n. The notation 0xF2n represents
the hex value of the lower 12 bits of the EAX register reported by CPUID
instruction with input value of EAX = 1; F indicates the family encoding value is 15,
C-4
INSTRUCTION LATENCY AND THROUGHPUT
2 indicates the model encoding is 2, n indicates it applies to any value in the stepping
encoding.

"

I use cat /proc/cpuinfo to get the model and the family encoding .

and transform them to hexadecimal and find the value

concatenating is the same as manal.



So ,I doublt whether set eax=1 can get the cpuid signature ?


0 件の賞賛
3 返答(返信)
Maxym_D_Intel
従業員
2,166件の閲覧回数
just have a look on the following document:

http://www.intel.com/content/dam/www/public/us/en/documents/application-notes/processor-identification-cpuid-instruction-note.pdf

where note that for Model, there are actually : "Extended Model" and just "Model" which have to be combined like:
[bash]M = (Extended Model << 4) + Model which is actually like: M = (CPUID(1).EAX[19:16] << 4) + CPUID(1).EAX[7:4][/bash] from "Equation 5-2.Calculated Model Value" of the document above,

so, you code might look like:
[bash]low12bit = ((eax & 0xF0000) >> 12) + ((eax & 0x0FF) >> 4);[/bash]
as by this code - dont forget to skip stepping, if not needed , which are CPUID(1).EAX[3:0]


zhangxiuxia
ビギナー
2,166件の閲覧回数
I got it , thanks !
But the expression in Optimazation Manual is confusing about how to get the cpuid signature .
At first sight, it looks like the lower 12bit of eax.

In fact ,it is the

concatenation of eax[19,16] eax[15,8] eax[7,4]


eax[19,16] eax[7,4] is the model

eax[15,8] is the cpu family
SergeyKostrov
高評価コントリビューター II
2,166件の閲覧回数

Here is example on how to get a CPU Vendor text with a '__cpuid' intrinsic function:

...
int CPUInfo[4] = { -1, -1, -1, -1 };
char CPUVendor[32] = { 0x0 };
uint nIds = 0;
...

...
__cpuid( CPUInfo, 0 );

nIds = CPUInfo[0];

*( ( int * )( CPUVendor )) = CPUInfo[1];
*( ( int * )( CPUVendor+4 )) = CPUInfo[3];
*( ( int * )( CPUVendor+8 )) = CPUInfo[2];
...
printf( "\tCPU Vendor: %s\n", CPUVendor );
...

and in case of Intel CPU the output should look like:

...
CPU Vendor: GenuineIntel
...

返信