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 :

Etrange réponse sous linux 64-bit


Sujet :

C++

  1. #1
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut Etrange réponse sous linux 64-bit
    Bonjour,

    Le code suivant est sencé me donner un timer précis, mais alors qu'il fonctionne trés bien sous windows et linux 32 bits avec gcc ca ne marche plus sous linux 64 bits (pour info, mon linux tourne sous WMWare)

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    // Instruction RDTSC du processeur Pentium
    double RDTSC(void)
    {
      unsigned long long x;
      __asm__ volatile  (".byte 0x0f, 0x31" : "=A"(x));
      return (double)x;
    }
     
    double wtime()
    {
      static double freq=-1;
      double t;
      if (freq<=0) Frequence_CPU(&freq);
      t=RDTSC()/freq;
      return(t);
    }
     
    int main(int argc, char *argv[])
    {
      double dif=wtime();
      Sleep(100);
      printf("100: %.4lf s\n",wtime()-dif);
      dif=wtime();
      Sleep(1000);
      printf("1000: %.4lf s\n",wtime()-dif);
      dif=wtime();
      Sleep(10000);
      printf("10000: %.4lf s\n",wtime()-dif);
      return(0);
    }
    Ca me reponds
    100: 0.1001 s
    1000: -0.1125s
    10000: -0.4558s

    C'est étrange, si quelqu'un à une idée

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Première chose, il faudrait aussi donner la fonction qui s'apelle Frequence_CPU.

    Deuxièmement, le problème peut venir qu'il y a des changements entre 32 et 64 bits. Je crois que le double est codé sur 64bits.

    L'utilisation de l'ASM est dangereuse aussi :s ( surtout quand je comprends pas :p )

    Et finalement, si vous voulez une réponse, il faudra nous donner ( et vous donner ) plus d'information, genre les valeurs de freq et de RDTSC lors de la division qui se trouve dans wtime().
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Bonjour,

    Si je n'ai pas indiqué la fonction Fréquence_CPU, c'est parce qu'elle fonctionnait trés bien. Donc quand on rencontre un probleme, j'estime qu'il faut simplifier au mieux de maniére à isoler au mieux le probleme en question.

    Autant que je sache en 32 ou 64 bit un double est identique.

    Pourquoi l'utilisatioon de l'assembleur serait-elle un probléme?

    Maintenant pour finir, j'ai finit par obtenir la solution qui est ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    double RDTSC(void)
    {
    #if defined( __LP64__ ) || defined( _LP64 )
     unsigned long lo, hi;
     __asm__ volatile ( "rdtsc" : "=a" (lo), "=d" (hi) );
     return( lo | (hi << 32) );
    #else
     unsigned long long x;
     __asm__ volatile  (".byte 0x0f, 0x31" : "=A"(x));
     return (double)x;
     #endif
    }

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Bonjour,

    Si je n'ai pas indiqué la fonction Fréquence_CPU, c'est parce qu'elle fonctionnait trés bien. Donc quand on rencontre un probleme, j'estime qu'il faut simplifier au mieux de maniére à isoler au mieux le probleme en question.

    Autant que je sache en 32 ou 64 bit un double est identique.

    Pourquoi l'utilisatioon de l'assembleur serait-elle un probléme?
    J'ennonce les sources possible du problème ( en essayant n'en oublier aucune ). Pourquoi ? car d'abord, j'arrive sur le post, et que je ne pouvait pas faire les tests moi même.
    Deuxièmement, car les problèmes arrivent toujours dans les cas les plus idiots.
    Et l'utilisation de l'assembleur semble être un problème ( surtout entre deux architectures de processeur, genre 32bits, et 64bits) car les deux ne sont pas pareilles. En plus cela se confirme, vu que votre solution ( j'en suis heureux que vous avez trouvé, car j'étais pas près :s ) est une modification du code ASM.
    Pour le coup du double, c'est principalement une erreur de ma part, que j'ai laissé car j'étais dans le doute.

    Donc, certes, on simplifie le problème au maximum, mais, lorsque quelqu'un arrive sur votre cas, il ne peut pas savoir que vous juger la fonction Frequence_CPU() infaillible. (Mes bugs arrivent souvent sur des préjugé de résultat).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Tout à fait d'accord avec tout ca, j'essayait simplement de répondre au mieux à tes intérrogation et suggestions. Y a pas de soucie

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/03/2012, 10h43
  2. installation oracle 10g ou 11G sous linux(fedora) 32 bit
    Par coolwindy dans le forum Installation
    Réponses: 6
    Dernier message: 31/10/2011, 16h44
  3. Réponses: 2
    Dernier message: 21/10/2010, 14h00
  4. Probleme avec le WTK sous linux 64 bits et netbeans
    Par insomniak dans le forum Java ME
    Réponses: 0
    Dernier message: 06/12/2009, 15h30
  5. Entier 64 bits sous linux, problème d'affectation
    Par Steki-kun dans le forum Linux
    Réponses: 2
    Dernier message: 13/01/2005, 21h10

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