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

Assembleur Discussion :

Mesurer le temps des instructions


Sujet :

Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Mesurer le temps des instructions
    Quelqu'un sais ou trouver un timer pour mesurer le temps des instruction?

  2. #2
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    : : :

    Tu veux savoir combien met de temps ton programme pour être exécuté ? Il suffit de compter le nombre de cycle d'horloge nécéssaire à l'exécution de toutes les instructions.

    Etape 1 : récupérer la datasheet du µP / µC que tu utilise. Dedant, tu trouve une table qui met en relation le nombre de cycles d'horloge de chaque instruction avec son mode d'adressage.
    Etape 2 : faire la somme pour avoir le nombre de cycles d'horloge requis.
    Etape 3 : en connaissant la fréquence du processeur et le nombre de division interne de fréquence (4 ?), tu calcule le temps en seconde.

    En gros, ca dépends de pas mal de choses...

    Bon dev'

    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Pour les processeurs recents Intel & AMD, le calcul est extremement complexe. Sur ces processeurs, l'instruction rdtsc permet de compter le nombre de cycles d'horloges. Fait une recherche sur ce forum si tu veux en savoir plus.

  4. #4
    Membre habitué Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Points : 170
    Points
    170
    Par défaut
    Je suis pas d'accord avec Smortex, suffit pas de faire l'addition des durées prises individuellement. Ca, c'était bon du temps du 6502 ou du Z80 ...
    D'accord avec Blustuff ....
    Ici on a affaire a un pentium. Ce processeur comporte une structure "pipeline" en trois niveaux ! C'est un "truc" d'optimisation dynamique grave ce machin ! trop long a expliquer ici, va gratter sur le Net "pentium pipeline" ou va voir dans la doc intel de l'architecture du Pentium !
    Une réelle solution, c'est l'instruction " RDTSC " , ca, ok !
    accessible depuis le privilège 3, utilisateur ! nickel !
    Fait une recherche sur le Net "RDTSC", tu trouveras ton bonheur !

  5. #5
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Citation Envoyé par - Robby -
    Ici on a affaire a un pentium.
    Comment tu le sait ? Il a rien dit Moi, je suis plus branché 68HC11 & co... Donc c'est la seule méthode de compter et de diviser par 4... Et c'est la méthode de base... Même si il est certain que maintenant, cette méthode, elle est complètement inutilisable avec les technologies utilisées...


    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Oui, d'ailleurs il serait bienvenu lucky luke que tu précise a chaque fosi pour quel proc, quel os, etc. Et puis "mesurer le temps des instructions" ca veut pas dire grand chose lol.

    J'ajouterais en dehors du fait que c'est pas bien de remmettre ainsi en cause les utilisateurs de ce forum, que l'instruction RDTSC, donne souvent des surprises. Non pas qu'elles ne soit pas fiable, mais que le fonctionement des processeurs recent est tellement complqué, que d'une mesure sur l'autre l'instruction ne donnera pas les même résultats (en déifférence de ecycles j'entends)

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par - Robby -
    Je suis pas d'accord avec Smortex, suffit pas de faire l'addition des durées prises individuellement. Ca, c'était bon du temps du 6502 ou du Z80 ...
    D'accord avec Blustuff ....
    Ici on a affaire a un pentium. Ce processeur comporte une structure "pipeline" en trois niveaux ! C'est un "truc" d'optimisation dynamique grave ce machin ! trop long a expliquer ici, va gratter sur le Net "pentium pipeline" ou va voir dans la doc intel de l'architecture du Pentium !
    Une réelle solution, c'est l'instruction " RDTSC " , ca, ok !
    accessible depuis le privilège 3, utilisateur ! nickel !
    Fait une recherche sur le Net "RDTSC", tu trouveras ton bonheur !
    Je suis d'accord avec Robby , j'ai pu trouvé ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    double RDTSC(void) 
    { 
    #ifdef linux 
      unsigned long long x; 
      __asm__ volatile (".byte 0x0f, 0x31" : "=A"(x)); 
      return (double)x; 
    #else 
      unsigned long a, b; 
      double x; 
      asm 
      { 
        db 0x0F,0x31 
        mov [a],eax 
        mov [b],edx 
      } 
      x = b; 
      x *= 4294967296; 
      x += a; 
      return x; 
    #endif 
    }
    Ce code est en c mais c'est des routines asm donc tu dois probablement comprendre!
    A bientot
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    pourais tu expliquer ton code quel valeur edx et eax sont suposer contenir
    pour quoi tu multipli x par 4294967296... svp


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    double RDTSC(void) 
    { 
    #ifdef linux 
      unsigned long long x; 
      __asm__ volatile (".byte 0x0f, 0x31" : "=A"(x)); 
      return (double)x; 
    #else 
      unsigned long a, b; 
      double x; 
      asm 
      { 
        db 0x0F,0x31 
        mov [a],eax 
        mov [b],edx 
      } 
      x = b; 
      x *= 4294967296; 
      x += a; 
      return x; 
    #endif
    [Balise [code] rajoutée par Smortex]
    [Pensez-y vous-même à l'avenir. Merci.]

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par luckylucke
    pourais tu expliquer ton code quel valeur edx et eax sont suposer contenir
    pour quoi tu multipli x par 4294967296... svp
    Salut, je fais une explication breve, mais si celle ci ne te suffit pas n'hésite pas a demander !
    En faitt le nombre est sur 64 bits donc edx contient les 32 bits de poids fort et eax les 32 bits de poids faible or 2^32= 4294967296 ;
    tu comprends maintenant pourquoi on multiplie edx par 2^32?? Pour obtenir le nombre sur 64 bits.
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  10. #10
    Futur Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mesurer le temps de calcul des fonctions
    Par dzada dans le forum Caml
    Réponses: 2
    Dernier message: 12/03/2007, 19h54
  2. [Test][Perf]Mesure du temps d'execution différente 2 fois de suite
    Par debdev dans le forum Tests et Performance
    Réponses: 11
    Dernier message: 22/07/2005, 12h04
  3. Liste des instructions de la bibl. std c++
    Par BBric dans le forum SL & STL
    Réponses: 7
    Dernier message: 29/10/2004, 00h02
  4. [info] mesure du temps
    Par nicolas581 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 02/08/2004, 13h45
  5. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39

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