2013-03-12 7 views
5

Nella Guida Intel Intrinsics sono presenti "Informazioni sulla latenza e la velocità effettiva" nella parte inferiore di diversi Intrinsics, che elencano le prestazioni per più CPUID.Determina CPUID come elencato nella Guida Intel Intrinsics

Ad esempio, la tabella nella Guida Intrinsics appare come segue per l'intrinseca _mm_hadd_pd:

CPUID(s)    Parameters Latency Throughput 
0F_03         13   4 
06_2A     xmm1, xmm2   5   2 
06_25/2C/1A/1E/1F/2E xmm1, xmm2   5   2 
06_17/1D    xmm1, xmm2   6   1 
06_0F     xmm1, xmm2   5   2 

Ora: Come faccio a determinare, quale ID mia CPU ha?

Sto usando Kubuntu 12.04 e ho provato con sudo dmidecode -t 4 e anche con il piccolo programma cpuid dai pacchetti di Ubuntu, ma il loro output non è veramente utile.

Non riesco a trovare nessuna delle stringhe elencate nella Guida Intrinsics in nessun punto dell'output dei comandi sopra riportati.

risposta

1

è possibile ottenere queste informazioni utilizzando CPUID, dove

La famiglia estesa, po posizioni 20 attraverso 27 sono utilizzati in combinazione con il codice di famiglia , specificato nelle posizioni di bit da 8 a 11, per indicare se il processore appartiene a la famiglia di processori Intel386, Intel486, Pentium, Pentium Pro o Pentium 4. I processori della famiglia P6 includono tutti i processori basati sull'architettura del processore Pentium Pro e hanno una famiglia estesa uguale a 00h e un codice famiglia uguale a 06h. I processori della famiglia Pentium 4 includono tutti i processori basati sulla microarchitettura Intel NetBurst® e hanno una famiglia estesa uguale a 00h e un codice famiglia uguale a 0Fh.

Il modello esteso specificato nel bit positi componenti 16 a 19, in combinazione con il numero modello specificato nei bit 4 se 7 sono utilizzati per identificare il modello del processore nella famiglia del processore.

vedere pagina 22 in Intel Processor Identification and the CPUID Instruction per ulteriori dettagli.

CPUID effettiva è quindi "family_model". Il seguente codice dovrebbe fare il lavoro:

#include "stdio.h" 

int main() { 

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

    int model = (eax & 0x0FF) >> 4; 
    int extended_model = (eax & 0xF0000) >> 12; 
    int family_code = (eax & 0xF00) >> 8; 
    int extended_family_code = (eax & 0xFF00000) >> 16; 

    printf ("%x %x %x %x \n", eax, ebx, ecx, edx); 
    printf ("CPUID: %02x %x\n", extended_family_code | family_code, extended_model | model); 
    return 0; 
} 

per il mio computer ottengo:

CPUID: 06_25

Speranza che aiuta.

+0

Sì, è tutto. Ora ho preso 06_2A per Sandy Bridge :) –

+0

Una bella risposta, ma sicuramente c'è un modo più semplice rispetto alla compilazione del codice sorgente? Qualche programma là fuori forse? – crockeea