Avatar billede tlj Nybegynder
21. januar 2005 - 13:19 Der er 5 kommentarer

cpu speed og cash

hej er der nogle der kan hjælpe mig med at lave et program der kan hente prososser speed og dens cash. programmet skal køre på en computer med winxp. computerne der skal køre programmet har pentiom m, celeron prossore.

på forhond tak
Avatar billede soreno Praktikant
21. januar 2005 - 13:46 #1
Funktion til at beregne cpu speed (til gcc):

int getCpuSpeed()
{
    unsigned long long start;
    unsigned long long stop;
    unsigned long long freq;
    unsigned long long count;
    unsigned long long countStop;
 
    // skaf frekvens for high-performance counter
    QueryPerformanceFrequency((LARGE_INTEGER *) &freq);

    // skaf antal cycles siden systemstart, dvs. Hz
    asm (".byte 0x0f, 0x31" : "=A" (start));

    // skaf current count af high-performance counter
    QueryPerformanceCounter((LARGE_INTEGER *) &countStop);

    // definer 1 sekund
    countStop += freq;

    // loop indtil der er gået 1 sekund
    do
    {
    QueryPerformanceCounter((LARGE_INTEGER *) &count);   
    }while(count<countStop);
 
    // skaf antal cycles siden systemstart, dvs. Hz
    asm (".byte 0x0f, 0x31" : "=A" (stop));

    // konverter forksellen mellem stop og start fra Hz til MHz
    return (int)((stop - start)/1000000);
}
Avatar billede tlj Nybegynder
21. januar 2005 - 19:33 #2
int getCpuSpeed()
{
   
    unsigned long start;
    unsigned long stop;
    unsigned long freq;
    unsigned long count;
    unsigned long countStop;
 
    // skaf frekvens for high-performance counter
    QueryPerformanceFrequency((LARGE_INTEGER *) &freq);

    // skaf antal cycles siden systemstart, dvs. Hz
    __asm (".byte 0x0f, 0x31" : "=A" (start);//(linje 56)

    // skaf current count af high-performance counter
    QueryPerformanceCounter((LARGE_INTEGER *) &countStop);

    // definer 1 sekund
    countStop += freq;

    // loop indtil der er gået 1 sekund
    do
    {
    QueryPerformanceCounter((LARGE_INTEGER *) &count);   
    }while(count<countStop);
 
    // skaf antal cycles siden systemstart, dvs. Hz
    __asm (".byte 0x0f, 0x31" : "=A" (stop));//(linje 71)

    // konverter forksellen mellem stop og start fra Hz til MHz
    return (int)((stop - start)/1000000);
   
    return 1;
}
når jeg compiler den kode i visual studio 6 med service pack 6 får jeg følgene fejl

C:\Program Files\Microsoft Visual Studio\MyProjects\cpuinfo\cpuinfo.cpp(56) : error C2400: inline assembler syntax error in 'opcode'; found '('
C:\Program Files\Microsoft Visual Studio\MyProjects\cpuinfo\cpuinfo.cpp(71) : error C2400: inline assembler syntax error in 'opcode'; found '('
Avatar billede soreno Praktikant
21. januar 2005 - 20:03 #3
Det er fordi assembler syntaksen i min kode er at&t (fordi jeg bruger gcc).
MSVC forstår Intel syntaks og de 2 er ikke kompatible.

Jeg ved ikke hvordan man får loadet en long long variabel fra eax:edx registret med Intel syntaks og jeg har ikke mulighed for at teste.

Et skud i tågen er noget ala:
unsigned long lo, hi;
asm {
  cpuid
  move lo, eax
  move hi, edx
}
start = lo;
start <<= 32;
start |= hi;

i stedet for linien:
asm (".byte 0x0f, 0x31" : "=A" (start));


Men siden du nu bruger VC++ så synes jeg du skulle kigge på kamel programmet:
http://www.codeproject.com/system/camel.asp
Avatar billede nlf Nybegynder
22. januar 2005 - 10:56 #4
En ting du skal huske på, at CPU'er, der kan variere CPU hastigheden, vil måske ikke have den samme hastighed hele tiden, medmindre strømforsyningen er sat til (dvs. Banias/Dothan/Turion kan godt være lidt lumske ;-)).

Hastigheden kan også aflæses fra registreringsdatabasen, men RDTSC (Read Timestamp Counter), som de overstående eksempler benytter sig af, er jo den mest præcise, da den opdateres for hvert clock tick.

Cache-størrelsen kan (så vidt jeg husker) aflæses i EAX, ECX og EDX (hvis bit 31 er sat, så vil det pågældende register være en gyldig cache-størrelse), efter et kald til CPUID med EAX = 1.
Du kan envidere bruge cache-størrelsen til at finde ud af hvilken CPU, der er tale om.

Det er alt sammen beskrevet i Intels "Intel® Processor Identification
and the CPUID Instruction", som kan findes på intel.com
Avatar billede tlj Nybegynder
22. januar 2005 - 12:05 #5
jeg har fået fat i prosser hastigheden men har lidt problemer med at finde cashen på prosossern og det asm ligger lidt langt væk men er der nogle der har noget kode til at få cashen på prosossern eller det muligt at hente den fra regsterings databasen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester