[architecture] différences 32-64 bit

Bonjour,
Voila mon souci. J'ai un logiciel scientifique écri en C++ et fortran77, il est lourd (1000 fichiers environ) et donc difficilement analysable.
Je compile ce code en deux version : 32 bit grace à l'option -m32 de gcc, et en 64 bit grace à l'option -m64.
Je lance ces deux programme, et j'obtiens deux résultats différents.
Ma question est : pourquoi ??
Le programme n'utilise que des int et des double qui ont la même taille en 32 et 64 bit. D'après vous qu'est-ce qui mêne à cette différence alors qu'a priori la précision est la même.
Merci de m'aider si vous avez des piste.

Salutation !

Quand on sait pas, on touche pas !JBT
Char Snipeur
Configuration: Windows XP
Firefox 2.0.0.11

14 réponses

  • Votes
  • Date
  • Date décroissante
  1. Salut a tous
    Je me pose une question?
    Je tourne sur Xp Pro Coccinelle 3.5 . Et des amis me disent de passer sur Vista 64 Bits
    Voila ma configuration :
    Intel dual Core 6300 2 GHZ
    Carte mere Asus P5B Deluxe
    Carte Video Ge Force 7300 GS et 2G de RAM
    Quand pense vous ?
    Merci d'eclairer ma lanterne.
    1. Bonjour,

      Ceci est à vérifier bien sûr mais je pense que tu vas te faire chier car tous tes divers devront être signés et des fabriquants tels que NVidia par exemple ne le font pas forcément... Il y a peut-être un autre débat à ouvrir: un dual core 32 bits peut comprendre du 64 bits mais le fait-il aussi bien qu'un vrai processeur 64 bits ?

      M.
    2. Contributeur
      @MahmahTiens, moi j'aurai dit le contraire...
      comment un 32 bits peut il comprendre du 64 ?

      Sinon, pour la question, je pense que Vista est encore à éviter pendant quelques années.
    3. @Char SnipeurLes dual core d'Intel peuvent fonctionner en parallèle et se faire passer pour un seul processeur 64 bits.

      M.
    4. Contributeur
      @MahmahOk merci.
      Du coup tu perds pas mal d'avantage du dual corps. Il est clair qu'il vaut mieu un proc 64 pour travailler en 64.
  2. Contributeur
    Je m'attend aussi à une différence de ce genre. Il est clair que si il y a un calcul sur deux registres, puis une opération spécifique, ça peut expliqué la différence.
    Il est possible que dans certains cas lors d'une opération sur les doubles le collage des registres 32 bits entrainent un arrondi ou la suppresion d'un bit.
    Je me galère pour trouver de la doc à ce sujet.
    1. Modérateur
      Mouaif bon....je t'abandonne à ton triste sort, je ne vois pas vraiment ce qui cloche.
      1. Modérateur
        Oui, 8 octets.
        Mais je pense (sans être sûr) que les doubles sur les proc 32 bits sont séparés sur 2 registres puis les opérations se font avec du code spécifique fourni par ton système ou compilateur... C'est du moins comme ça que ça se passe pour les entiers 64 sur processeur 32 (les types long long).

        Sur 64, ça se fait à priori en une instruction processeur.

        Et ce qu'il y aurait une différence de précision entre les deux?
        1. Contributeur
          Oui, j'utilise des double, donc coé sur 8octets (64 bits non?)
          1. Modérateur
            Ben à part ça je ne vois pas.
            Les différences théoriques ne devraient pas se voir tant qu'on continue d'utiliser des variables 32 bits.
            Tu utilises des doubles?

            Peut être que les nombres flottaants 64 bits ne sont pas traités de la même façon.

            1. Contributeur
              Sortir le debugueru, je veux bien, mais l'arreter sur quel critère ?
              quand au printf... il y a tellement de variables différentes ! En fesant un maillage avec une seul maille, peut être que ça simplifierai le problème avec seulement une grosse centaines de variables à tester.
              En fait, je pensais que quelqu'un aurait une réponse un peu théorique sur les différences entre 32 et 64
              1. Modérateur
                Je ne pourrais pas t'aider... Il faudrait au moins localiser la zone qui coince dans la source.
                Donc mettre des printf à différents endroits, ou sortir le debuggeur...
                1. Contributeur
                  Le problème, c'est que ça coince pas, les résultats sont juste différents.
                  La première différence visible se produit environ au 200éme pas de temps, mais si ça se trouve il y a des différence depuis bien avant.
                  1. Modérateur
                    L'idéal serait de localiser l'endoit dans le code qui coince... Je sais bien que c'est plus facile à dire qu'à faire :-)
                    1. Contributeur
                      malheureusement, non plus...
                      les real*8 et les real*4 ont toujours la même taille, semblerai-til.
                      Je n'arrive pas à produire une diffrence de calcul à partir d'un calcul simple.
                      1. Contributeur
                        Non, justement, j'ai remarqué que c'était les seuls type qui variaient entre 32 et 64, et pas de type long (ni long int, ni long double)