2013-01-10 17 views
5

Durante la scrittura di un nuovo codice per Windows, sono incappato su _cpuinfo() dall'API di Windows. Poiché mi occupo principalmente di un ambiente Linux (GCC), desidero avere accesso a CPUInfo.Come chiamo "cpuid" in Linux?

Ho provato quanto segue:

#include <iostream> 

int main() 
{ 
    int a, b; 

    for (a = 0; a < 5; a++) 
    { 
    __asm ("mov %1, %%eax; "   // a into eax 
      "cpuid;" 
      "mov %%eax, %0;"    // eax into b 
      :"=r"(b)      // output 
      :"r"(a)      // input 
      :"%eax","%ebx","%ecx","%edx" // clobbered register 
     ); 
    std::cout << "The code " << a << " gives " << b << std::endl; 
    } 

    return 0; 
} 

Questa assemblea uso, ma io non voglio di re-inventare la ruota. C'è un altro modo per implementare CPUInfo senza assemblare?

errori di compilazione:

[email protected]:~/Desktop/prog$ g++ -Wall CPUInfo.cpp 
CPUInfo.cpp: In function ‘int main()’: 
CPUInfo.cpp:10:22: error: expected ‘)’ before ‘;’ token 
CPUInfo.cpp:10:23: error: expected primary-expression before ‘)’ token 
CPUInfo.cpp:10:23: error: expected ‘;’ before ‘)’ token 
CPUInfo.cpp:8:8: warning: unused variable ‘b’ [-Wunused-variable] 
CPUInfo.cpp:12:8: error: expected ‘}’ at end of input 
+1

Quindi, questo è g ++, credo. E x86? Dovresti dire. Qual è la domanda in ogni caso? Ci hai detto cosa stai facendo e hai mostrato il codice. Ma non c'è dubbio. –

+0

@JerryCoffin Sto usando Linux (come in questa sarà la sezione Linux per determinare la CPU del computer che esegue il codice). Ho già la versione/sezione Windows inchiodata con la funzione _cpuinfo() dall'API Win. Questo è il mio punto. – TheBlueCat

+0

@DavidHeffernan Vedere il mio post aggiornato, ho trascurato di aggiungere gli errori del compilatore. – TheBlueCat

risposta

31

Dal momento che si sta compilando con GCC allora è possibile includere cpuid.h che dichiara queste funzioni:

/* Return highest supported input value for cpuid instruction. ext can 
    be either 0x0 or 0x8000000 to return highest supported value for 
    basic or extended cpuid information. Function returns 0 if cpuid 
    is not supported or whatever cpuid returns in eax register. If sig 
    pointer is non-null, then first four bytes of the signature 
    (as found in ebx register) are returned in location pointed by sig. */ 
unsigned int __get_cpuid_max (unsigned int __ext, unsigned int *__sig) 

/* Return cpuid data for requested cpuid level, as found in returned 
    eax, ebx, ecx and edx registers. The function checks if cpuid is 
    supported and returns 1 for valid cpuid information or 0 for 
    unsupported cpuid level. All pointers are required to be non-null. */ 
int __get_cpuid (unsigned int __level, 
    unsigned int *__eax, unsigned int *__ebx, 
    unsigned int *__ecx, unsigned int *__edx) 

Non è necessario a, e non dovrebbe, ri- implementare questa funzionalità.

+6

+1 Non sapevo che l'intestazione esistesse. L'ho sempre fatto con un po 'di assemblaggio in linea. – Mysticial

+0

Sicuro. Sono riuscito comunque a compilare il pezzo. Nonostante ciò, perché non dovrei ri-implementarlo? Oltre a risparmiare tempo? – TheBlueCat

+1

@Mysticial È qui che la mia totale ignoranza di GCC e Linux è utile. Ho dovuto google per la risposta! –

7
for (a =0; a < 5; ++a;) 

Ci dovrebbero essere solo due punti e virgola. Ne hai tre.

Questa è la sintassi di base in C/C++; il CPUID è un'aringa rossa.

+0

errore di battitura. L'ho riparato prima di pubblicare, per qualche motivo è tornato lì. Ho cambiato ramo su Git, questa è probabilmente la ragione. Ma sì, conosco questa 'sintassi di base'. – TheBlueCat

+7

Ma gli errori che hai postato sono causati da questo errore di battitura. Se hai risolto il problema e i problemi persistono, aggiorna l'elenco degli errori. – user9876

Problemi correlati