Newsgroup: it.comp.lang.c++
Titolo: Frequenza CPU

Esistono comandi in C++ che restituiscono il clock della CPU??
Se si quali sono e in che libreria si trovano.
GRAZIE

 Se si quali sono e in che libreria si trovano.
Nel C++ Standard non esistono funzioni simili.
<OT>
A partire dai processori di classe 586 (Pentium) esiste un'istruzione
assembly, RDTSC, che permette di leggere il valore di un contatore che viene
aggiornato ad ogni ciclo di clock. Leggendo due valori a distanza di un
secondo ed eseguendo la differenza, puoi trovare la frequenza di clock.
</OT>
Marco

 frequenza di clock. </OT>
direi con molta approssimazione...
/* frequenza.cc */
#include <cstdio>
#include <unistd.h>
unsigned long long asmclock(){
 __asm__ __volatile__("rdtsc");
}
int main(){
   unsigned long long start, end;
   int i;
   for (i = 0; i < 20; ++i){
     start = asmclock();
     sleep(1);
     end = asmclock();
     printf("clock %llu \n", (end - start));
   }
   return 0;
}
/* OUTPUT */
clock 859684323 
clock 865997521 
clock 866174015 
clock 866175596 
clock 866167691 
clock 866194602 
clock 866156785 
clock 866156930 
clock 866179446 
clock 866161537 
clock 866168745 
clock 874847244 
clock 866090519 
clock 866144452 
clock 866185847 
clock 866195324 
clock 866150300 
clock 866168728 
clock 866200764 
clock 866149603 
la differenza tra min e max e' notevole.... 


Perché la Sleep() è estremamente imprecisa, soprattutto se il thread
chiamante non ha a disposizione il processore tutto per sé in quel momento.
Se usi l'accoppiata QueryPerformanceFrequency() e QueryPerformanceCounter()
vedrai che i valori saranno decisamente migliori.
Marco

 momento. 
Ero su linux, ho lasciato solo quel processo e gli ho dato nice 
massimo, riprovo con usleep(1000) piu' precisa della sleep, e max nice, 
unico processo:
clock 863829801 
clock 865993457 
clock 866168473 
clock 866198869 
clock 866157432 
clock 866360080 
clock 866004073 
clock 866896379 
clock 865536430 
clock 866254263 
clock 866022140 
clock 866197959 
clock 866383132 
clock 866266954 
clock 865957988 
clock 866117906 
clock 866153309 
clock 866185167 
clock 866172383 
clock 866186340 
c'e' comunque un'ampia variabilita', e inoltre il mio clock e' 
857.639 MHZ


Ecco cosa ho ottenuto utilizzando le API di Windows che ho citato nella mia
risposta precedente:
1208866878
1208866963
1208865325
1208866026
1208866567
1208865541
1208865109
1208920188
1208865684
1208866342
Approssimando alle centinaia di kHz e arrotondando, si ottiene una lettura
stabile di 1208,9 MHz, una precisione più che sufficiente (credo) per
numerosi scopi. La misura è stata fatta nel thread principale di un processo
a priorità normale. Il codice utilizzato è il seguente, compilato con
mingw32:
#include <windows.h>
#include <cstdlib>
#include <iostream>
inline __int64 rdtsc()
{
 __asm __volatile__("rdtsc");
}
int main()
{
 LARGE_INTEGER li;
 QueryPerformanceFrequency(&li);
 for (int i=0; i<10; ++i) {
     __int64 t0 = rdtsc();
     LARGE_INTEGER c0, c1;
     QueryPerformanceCounter(&c0);
     do {
        QueryPerformanceCounter(&c1);
     } while ((c1.QuadPart-c0.QuadPart)<li.QuadPart);
     __int64 t1 = rdtsc();
     std::cout << (t1-t0) << std::endl;
 }
 std::system("pause");
}
Chiaramente l'ho scritto di getto, senza nessuna ottimizzazione o
accorgimento particolare.
Marco

 1208866878
si, ma il tuo clock e'?

 ha scritto nel messaggio
news:1983865.N...@iol.it...

La frequenza nominale è 1,2 GHz, Windows XP mi dà il valore di 1,21 GHz,
misurando con CPUClock ottengo 1209 MHz. Tutti questi valori sono l'esatto
arrotondamento di 1208,8 MHz. Del resto, i software che misurano la
frequenza di clock utilizzano proprio il sistema discusso in questo
thread...
Marco

 in questo thread...
sara'...
su linux cat /proc/cpuinfo mi da' la frequenza esatta (ho controllato 
sul sito amd), rdtsc no