Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/05/2010, à 18:51

Creak

Comment obtenir la fréquence du CPU en C/C++?

Hello!

Afin d'obtenir un temps très précis, j'ai dégoté cette fonction sur le site http://okki666.free.fr/docmaster/articles/linux125.html:

__inline__ unsigned long long int rdtsc()
{
    unsigned long long int x;
    __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
    return x;
}

Elle permet d'obtenir le Time Stamp Counter(TSC) stocké dans un registre du CPU. Ce TSC équivaut au nombre de cycles effectués par le CPU. Du coup, si on divise ce nombre par la fréquence du CPU (qui n'est autre que des cycles par seconde) on obtient un temps en seconde qui est d'autant plus précis que le CPU à une fréquence élevée!

Oui mais voilà... comment je l'obtiens ma fréquence de CPU? Pour le moment j'ai écrit en dur dans mon code la valeur "cpu MHz" de mon /proc/cpuinfo. Mais du coup mon programme ne marche que pour ma machine...
Du coup j'aimerai savoir si l'un d'entre vous connais la technique pour obtenir (en code) la fréquence du CPU.

PS: Si vous avez une meilleure technique pour obtenir un temps très précis, je suis preneur aussi smile

Merci,
Creak

Hors ligne

#2 Le 01/05/2010, à 19:05

Pacifick_FR42

Re : Comment obtenir la fréquence du CPU en C/C++?

tu as regardé sur le site http://www.developpez.com ?

Hors ligne

#3 Le 02/05/2010, à 00:41

Creak

Re : Comment obtenir la fréquence du CPU en C/C++?

Alors je suis tombé là-dessus http://haypo.developpez.com/article/frequence_cpu/
Mais c'est aussi ce que j'ai pensé en premier, à savoir aller lire la valeur de "cpu MHz" dans /proc/cpuinfo (pour Linux).

Mais j'avoue qu'avec les processeurs de maintenant, qui ont 6 cœurs et qui augmente ou diminue leur fréquence en fonction de la charge, je sais pas si cette valeur est très fiable...

Je vais continuer mes recherches (il doit bien y avoir moyen de savoir précisément ce genre de chose, sinon comment le kernel arriverait à générer le /proc/cpuinfo? smile)

Hors ligne

#4 Le 02/05/2010, à 01:44

Creak

Re : Comment obtenir la fréquence du CPU en C/C++?

J'ai lancé un thread sur le sujet sur le forum de developpez.com, si ça intéresse des gens.
J'ai un début de solution, mais c'est pas encore le must que j'aimerai avoir (c'est trop dépendant de la charge du CPU)

http://www.developpez.net/forums/d916994/c-cpp/c/rdstc-frequence-processeur/#post5180869

Hors ligne

#5 Le 02/05/2010, à 03:15

Pacifick_FR42

Re : Comment obtenir la fréquence du CPU en C/C++?

ok, bonne info si tu trouves en tous ca wink

Hors ligne

#6 Le 02/05/2010, à 04:15

Creak

Re : Comment obtenir la fréquence du CPU en C/C++?

J'aimerai bien savoir comment ils font dans les jeux pour avoir une cadence régulière.
Avant (sous DOS), les jeux étaient aussi rapide que les CPU pouvaient le permettre. C'est pour ça que si on rejoue à Theme Park maintenant, ça va juste beaucoup trop vite.
Depuis, on temporise la boucle moteur. On applique le changements nécessaires pour le temps qui s'est écoulé entre la dernière trame et la trame courante.


... alors que vous lisez cette ligne, 20 minutes se sont passées chez moi ...


Bon en fait je viens de remarquer que je m'y prenais très mal. Je me suis focalisé sur les cycles, pour plus de précision, mais ça m'a apporté pas mal de problèmes pour pouvoir les reconvertir en temps car pour cela il me faut connaitre la fréquence du CPU, chose de plus en plus difficile à savoir avec les machines multicoeurs et à fréquence variable.
En fait la solution était sous mes yeux, il me suffit de faire un simple système de "time - lasttime". La seule difficulté est alors de trouver une version assez précise pour mes besoins; et pour cela j'ai trouvé clock_gettime!

voici donc le code que j'utilise maintenant:

double getTime()
{
    timespec time = { 0, 0 };
    int err = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time);
    assert(err == 0);
    return (double) time.tv_sec + (double) time.tv_nsec * 1e-9;
}

int main()
{
    // ... init code ...

    double lasttime = getTime();
    while(!done)
    {
        double time = getTime();
        double dt = time - lasttime;
        lasttime = time;

        // ... utiliser le dt calculé pour faire avancer la scène ...

    }

    // ... exit code ...
}

Mais toutes ces recherches ne m'ont pas servies à rien. Déjà je connais mieux comment obtenir un temps précis. Et en plus ma fonction rdtsc() pourra toujours me servir pour benchmarker et optimiser des fonctions bas niveau comme l'arithmétique sur les vecteurs, les matrices et les quaternions.
Et puis, pour faire classe j'affiche la fréquence du CPU au lancement de mon programme big_smile

Bon ben voilà, bonne nuit à tous!
Creak

Hors ligne

#7 Le 02/05/2010, à 10:14

francoisp31

Re : Comment obtenir la fréquence du CPU en C/C++?

#include <stdio.h>
#include <string.h>
 
/* Renvoie la vitesse d'horloge a l'instant T du processeur en MHZ, d'après /proc/cpuinfo.
   Sur un système multiprocesseur, renvoie la vitesse du premier.
   Renvoie zéro en cas d'erreur. */
 
float get_cpu_clock_speed ()
{
  FILE* fp;
  char buffer[1024];
  size_t bytes_read;
  char* match;
  float clock_speed;
 
  /* Charge le contenu de /proc/cpuinfo dans le tampon. */
  fp = fopen ("/proc/cpuinfo", "r");
  bytes_read = fread (buffer, 1, sizeof (buffer), fp);
  fclose (fp);
  /* Traite le cas où la lecture échoue ou le buffer est trop petit. */
  if (bytes_read == 0 || bytes_read == sizeof (buffer))
    return 0;
  /* Place un caractère nul à la fin de la chaîne. */
  buffer[bytes_read] = "\0";
  /* Recherche la ligne commençant par "cpu MHz". */
  match = strstr (buffer, "cpu MHz");
  if (match == NULL)
    return 0;
  /* Analyse la ligne pour extraire la vitesse d'horloge. */
  sscanf (match, "cpu MHz : %f", &clock_speed);
  return clock_speed;
}
 
int main ()
{
  printf ("CPU clock speed: %4.0f MHz\n", get_cpu_clock_speed ());
  return 0;
}

Que les puces d'un millier de chiens galleux infeste le cul de celui qui osera vous gacher ne serai ce
qu'une seule journée de votre vie et que les bras lui soient trop court pour qu'il puisse se le gratter.

Hors ligne

#8 Le 02/05/2010, à 13:58

Creak

Re : Comment obtenir la fréquence du CPU en C/C++?

Merci pour ce bout de code. Ça résout le cas des fréquences variables sur des CPU mono-cœur (à condition qu'on aille régulièrement à la pêche aux fréquences), mais le problème du multi-cœurs reste entier. Surtout avec les derniers Intel Core i7 980X et AMD Phenom II X6 1090T et respectivement leur technologie TurboBoost et Turbo Core qui permettent d'endormir 3 cœurs inactifs afin d'augmenter la fréquence des trois cœurs restants. (Source: http://www.clubic.com/processeur/processeur-amd/article-337352-2-amd-phenom-ii-x6-thuban-1090t-test.html)

Du coup, ne sachant pas quels cœurs vont être désactivés, ne regarder que le premier cœur peut nous rendre 0MHz, ce serait fâcheux smile

En fait, plus j'y pense et plus je me rend compte que c'est infaisable de connaitre la fréquence exacte. Si en plus le programme est multithreadé... Avoir une fréquence ne rime plus à rien. Me trompe-je?

Hors ligne

#9 Le 02/05/2010, à 15:57

francoisp31

Re : Comment obtenir la fréquence du CPU en C/C++?

AMHA tu devrais te baser sur la frequence théorique maxi-mini d'un coeur et la detection du nombre de coeur (en tout)

et tu generes ta base de temps à ce qui est le minimum possible de la machine c'est à dire 1 coeur / à sa frequence minimale (non desactivé) puiqu'il y aura tjrs au moins un coeur actif meme pour faire des instrictions NOP

et ca te donne un Xmillisecondes qui te sert alors de synchro ...


Que les puces d'un millier de chiens galleux infeste le cul de celui qui osera vous gacher ne serai ce
qu'une seule journée de votre vie et que les bras lui soient trop court pour qu'il puisse se le gratter.

Hors ligne