IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Question de temps


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 47
    Points
    47
    Par défaut Question de temps
    Bonjour,
    je suis un peu perdu dans mon programme alors j'espere que vous pourrez m'aider.
    j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    define frequence 449e6
    precedent= RDTSC();
    ...
    precedent= RDTSC();
    ...
    TempsDernierCycle=(suivant-precedent)/frequence;
    RDTSC() nous donne le nombre de cycle.
    Pouvez-vous me dire si TempsDernierCycle est en millisecondes, en microsecondes en en secondes?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    tout dépend de l'unité de "frequence"

  3. #3
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Logiquement la fréquence est cycles/s donc le résultat doit être en secondes. Par contre la valeur de retour du deuxième appel à RDTSC() devrait être affecté à suivant logiquement.
    Je trouve ça bizarre de chercher à avoir un temps avec RDTSC, normalement si tu l'utilises c'est que ce n'est pas assez précis avec les millisecondes. Sous Windows tu peux utiliser GetTickCount() pour avoir des ms directement.

  4. #4
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 47
    Points
    47
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     tout dépend de l'unité de "frequence"
    ben c'est 446MHz

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Logiquement la fréquence est cycles/s donc le résultat doit être en secondes. Par contre la valeur de retour du deuxième appel à RDTSC() devrait être affecté à suivant logiquement.
    Je trouve ça bizarre de chercher à avoir un temps avec RDTSC, normalement si tu l'utilises c'est que ce n'est pas assez précis avec les millisecondes. Sous Windows tu peux utiliser GetTickCount() pour avoir des ms directement.
    si c'est en secondes alors un usleep(1) me fait 68 usecondes sous ubuntu.
    Je voudrais bien avoir une valeur plus petite, je sais que mon programme doit être implanté dans un temps reel mais pour l'instant non.
    Si vous trouvé d'autre solutions sous ubuntu, ca serait bien gentil.

  5. #5
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    clock_gettime est assez portable et précis.

  6. #6
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 47
    Points
    47
    Par défaut
    Je pense que ca doit être mon RDTSC qui ne doit pas être bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double RDTSC(void)
    {
      unsigned long long x;
      __asm__ volatile  (".byte 0x0f, 0x31" : "=A"(x));
      return (double)x;
    }

  7. #7
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    C'est un unsigned long long qu'elle doit retourner. Pour l'encodage je vérifierai chez moi mais il n'y a pas moyen de mettre rdtsc directement ?

  8. #8
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 47
    Points
    47
    Par défaut
    ah oui tout de suite ca va mieux avec un unsigned long long

    enfin, si je fais ce code là, il me donne environ 3600 et des fois 41000 en reexecutant plusieurs fois le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main(void) {
    	int i=0;
    	unsigned long long b=0;
    	unsigned long long a=0;
            while(i<50) {
    	  	b=RDTSC();
    		printf("%llu\n",b-a);		
    	  	a=b;
    		i++;
    	}
    	return 0;
    }

  9. #9
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    L'encodage de RDTSC est bon, par contre tu n'utilises que la valeur retournée dans EAX donc tu peux te contenter de retourner un unsigned long. En fait tu n'as pas besoin d'utiliser la variable x, RDTSC renvoie son résultat dans EDX:EAX et les compilateurs s'en servent aussi pour mettre les valeurs de retour des fonctions.
    Si tu veux connaitre la précision de ton compteur tu peux essayer ce code-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main (void)
    {
       unsigned long t1;
     
       t1 = RDTSC ();
       printf ("%lu\n", RDTSC() - t1);
     
       return 0;
    }
    Dans l'idéal ça affiche zéro. Sur les processeurs actuels le résultat n'est pas vraiment égal au nombre de cycles écoulés parce qu'ils changent leur fréquence dynamiquement mais le compter de cycles s'incrémente toujours à la même vitesse.

  10. #10
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 47
    Points
    47
    Par défaut
    justement je trouve pas que ca soit super précis.
    Je veux faire un comptage à la microseconde et le même programme peut faire entre 200µs et 2ms. C'est enorme comme difference je trouve.
    Pourtant j'ai fait un code dans la commande pour qu'il soit gérer en priorité par rapport aux autres taches à faire.


  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Sylar44 Voir le message
    justement je trouve pas que ca soit super précis.
    Je veux faire un comptage à la microseconde et le même programme peut faire entre 200µs et 2ms. C'est enorme comme difference je trouve.
    Pourtant j'ai fait un code dans la commande pour qu'il soit gérer en priorité par rapport aux autres taches à faire.

    En faisant ça, tu l'as rendu moins prioritaire par rapport aux autres tâches!!!

  12. #12
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 47
    Points
    47
    Par défaut
    j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    man nice -n -20 ./programme
    mais c'est pareil, les valeurs sont aberantes.
    je le temps mis est en secondes alors qu'il doit me donner une valeur en microsecondes.
    De plus , les valeurs ne correspondent pas à celle de mon chronometre qui tourne en même temps

    Ca peut être à cause des sleep ou pas?

  13. #13
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Il n'y a pas de sleep dans le code que tu as donné. Tu peux remettre le code que tu testes ?

  14. #14
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 47
    Points
    47
    Par défaut
    en fait entre les 2 rdtsc, je fait juste une appel de fonction appartenant à un autre fichier
    j'appele ce fichier avec un

    jusqu'à là rien d'anormal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int add(int nb, int nb2)
     
    {
     
         sleep (1);
     
         nb+=nb2;
         return 1; 
     
         //1s 
     
    }
    cette fonction ne ressemblera pas à ca mais je préfere commencer par ca

  15. #15
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 47
    Points
    47
    Par défaut
    mainatenant j'ai aussi j'ai changé les printf et j'obtiens toujours 0.000
    Ca me parait un peut trop court pour être la réalité
    j'ai bien regardé, ca peut que être sur le retour de la fonction RDTSC que l'erreur se fait ou sur quelques calculs que j'ai fait avec ca.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    precedent=RDTSC();
    ...
    suivant= RDTSC();
    ...
    (unsigned long long)(suivant-precedent)/frequence;
    frequence etant un float

Discussions similaires

  1. [RTS] Une question de temps
    Par Fax37 dans le forum Réseau et multijoueurs
    Réponses: 6
    Dernier message: 11/03/2011, 17h24
  2. [curl] question si temps max
    Par Merfolk dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2009, 09h39
  3. Question de temps de calculs
    Par deubelte dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/11/2009, 18h40
  4. Réponses: 16
    Dernier message: 11/07/2006, 11h30
  5. Tutoriel sur le BDE ? (et question en même temps!)
    Par Yomane dans le forum C++Builder
    Réponses: 7
    Dernier message: 18/02/2004, 17h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo