- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
So ,I doublt whether set eax=1 can get the cpuid signature ?
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 ?
Link Copied
3 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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]
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]
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
eax[19,16] eax[7,4] is the model
eax[15,8] is the cpu family
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
...
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page