1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| #ifndef CPUID_H
#define CPUID_H
struct cpuid_reg { unsigned int eax,ebx,ecx,edx; };
#if defined(__ICL) || defined(_MSC_VER)
#include <windows.h>
inline cpuid_reg _cpuid(unsigned int a, unsigned int c=0)
{
cpuid_reg r;
__try
{
_asm
{
mov eax, a
mov ecx, c
cpuid
mov r.eax, eax
mov r.ebx, ebx
mov r.ecx, ecx
mov r.edx, edx
}
} __except (EXCEPTION_EXECUTE_HANDLER) { r.eax=r.ebx=r.ecx=r.edx=0; }
return r;
}
#elif defined(__GNUC__)
inline cpuid_reg _cpuid(unsigned int a, unsigned int c=0)
{
cpuid_reg r;
__asm__("cpuid":"=a"(r.eax),"=b"(r.ebx),"=c" (r.ecx),"=d"(r.edx):"a"(a),"c"(c));
return r;
}
#endif
inline cpuid_reg cpuid(unsigned int a, unsigned int c=0)
{
if (a<_cpuid(0).eax)
return _cpuid(a,c);
cpuid_reg r={0,0,0,0};
return r;
}
static char _cpu_name[13];
char *cpu_name() { cpuid_reg reg = cpuid(0); (unsigned int&)_cpu_name[0] = reg.ebx; (unsigned int&)_cpu_name[4] = reg.edx; (unsigned int&)_cpu_name[8] = reg.ecx; _cpu_name[12]='\0'; return _cpu_name; }
bool is_mmx_cpu () { return (cpuid(1).edx & 0x00800000); }
bool is_sse_cpu () { return (cpuid(1).edx & 0x02000000); }
bool is_sse2_cpu () { return (cpuid(1).edx & 0x04000000); }
bool is_sse3_cpu () { return (cpuid(1).ecx & 0x00000001); }
bool is_multithreaded_cpu() { return (cpuid(1).edx & 0x10000000); }
unsigned int logical_cpu_count() { return is_multithreaded_cpu()?(cpuid(1).ebx>>16)&0xFF:1; }
bool is_amd_cpu () { return (cpuid(0x80000000).eax==0x80000000); }
bool is_3dnow_cpu () { return (cpuid(0x80000001).edx & 0x80000000); }
unsigned int l1_cache_size() { cpuid_reg reg = cpuid(4,1); return (((reg.ebx>>22)&0x3FF)+1)*(((reg.ebx>>12)&0x3FF)+1)*((reg.ebx&0xFFF)+1)*(reg.ecx+1); }
unsigned int l2_cache_size() { cpuid_reg reg = cpuid(4,2); return (((reg.ebx>>22)&0x3FF)+1)*(((reg.ebx>>12)&0x3FF)+1)*((reg.ebx&0xFFF)+1)*(reg.ecx+1); }
#endif |
Partager