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

Fortran Discussion :

[Fortran 77] Effets de l'optimisation à la compilation


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Par défaut [Fortran 77] Effets de l'optimisation à la compilation
    Bonjour,
    j'ai une question concernant l'option d'optimisation à la compilation.
    J'ai un code volumes finis écrit en fortran 77.
    J'utilise Visual Fortran pour la compilation et le développement.
    Mon problème est que lorsque je compile en mode "Release", c'est a dire avec l'option "Full Optimisation", j'ai des résultats un peu différents que lorsque je compile en mode "Debug" c'est à dire avec aucune optimisation.

    J'ai testé sur le compilateur g77 (utilisé avec Force2.0) sur le mode par défaut et en utilisant -O3.

    Ma question est : Un code correctement écrit peut-il donner des résultats différents selon le niveau d'optimisation choisi à la compilation ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Citation Envoyé par gregory2526 Voir le message
    Un code correctement écrit peut-il donner des résultats différents selon le niveau d'optimisation choisi à la compilation ?
    Théoriquement, la réponse est non.

    La norme Fortran est très explicite sur ce que peut faire et ne pas faire un compilateur. Par exemple, si A = (f(x) == k) .and. (g(x) == y), le code optimisé n'a pas le droit "d'arrêter" après le premier terme si c'est faux. Aussi, le compilateur n'a pas le droit de réorganiser une expression d'une façon qui puisse changer le résultat (incluant les erreurs d'arrondi/troncation).

    Tu ne dis pas dans quelle mesure il y a différence.

    Parmi les pistes possibles que je vois, il y a les erreurs de programmation subtiles genre :

    call Routine(4)
    subroutine Routine(k)
    ...
    k = ...

    Dans un tel exemple, il est possible qu'en mode développement, le 4 soit réinitialisé à chaque appel alors qu'en mode release, il ne soit initialisé qu'une fois.

    Ou encore :

    z = f(x) + y

    où f(x) modifie y via un common.

    L'autre possibilité c'est qu'une fois optimisé, le code maintienne des résultats intermédiaires dans les registres. Sur un processeur x86, les registres ont 80 bits alors que les doubles ont 64 bits et les reals simples ont 32 bits. L'expression a / b + c / d pourrait donc donner des résultats différents selon que les résultats intermédiaires sont ramenés à la précision de a, b, c, et d ou maintenu à la précision des registres. Je crois que le compilateur n'a pas le droit de maintenir la précision des registres, mais je ne suis plus certain. Je crois avoir lu quelque chose sur le sujet dans Usenet. Si tu baragouine en anglais, fais une recherche du côté de http://groups.google.com/groups?oi=d...p.lang.fortran

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Par défaut
    Merci, je vais chercher dans le lien que tu m'a donné.

    En tout cas, ça ne fait que confirmer ce que je pensais déjà sur le code sur lequel je travaille.
    Il est vieux, et très mal programmé (le nombre de bugs que j'y ai trouvé est impressionnant). Mais bref...

    C'est un code qui résoud une équation de diffusion. J'ai des écarts de qq % en relatif, dans les résultats entre la version optimisée et la non optimisée, lorsque la quantité est faible. Ce n'est donc pas très important. Mais ce n'ai pas satisfaisant, et qui sait quelle erreur on peut faire sur un modèle complexe (au niveau geométrie par exemple).

    Merci encore.

  4. #4
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut [Fortran 77] Effets de l'optimisation à la compilation
    Salut.

    Sylvain Bergeron a raison: le problème ne réside pas dans le Fortran, mais dans une particularité des processeur Intel (80 et 64 bits). Tu ne rencontrerais pas ce problème sur une machine appliquant strictement la norme ANSI. Je me suis amusé une fois à écrire un programme qui, au départ, se plantait misérablement (racine d'un nombre négatif), mais qui marchait impeccablement si on ajoutait un "write" quelque-part ou si on appliquait l'option "debug". C'est un peu le problème que tu as rencontré. Malheureusement, je n'ai pas conservé ce programme quand j'ai changé de machine.

    Jean-Marc Blanc

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Par défaut
    En fait il fonctionne bien (ou pas bien) dans l'un ou l'autre cas. Je n'ai pas d'erreur qui ne se produise que dans un certain degré d'optimisation, et pas a un autre. C'est simplement le résultats des calculs qui est légèrement différent. Je n'ai testé l'effet de l'optimisation que dans un cas simple.


    Donc finalement, je ne peux pas faire grand chose...
    je serai toujours dépendant de la machine.

    De toute façon, je n'ai plus trop de temps pour me plonger dans ce problème avant la fin de mon stage...

  6. #6
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut
    Si tu utilises Visual Studio, surtout la version 6, (au CEMEF? ) vérifie si tu utilises par défaut la librairie IMSL, contenant les BLAS, LAPACK optimisés pour ton processeur.

    Si c'est le cas ( et en général dans le cadre d'utilisation de libraries optimisées constructeur genre MKL ou optimisée "manuelle" comme ATLAS), et ce n'est pas étonnant vu le type d'optimisation engagée dans ces cas (utilisation mémoire, cache niveau 1 et 2 etc etc)...

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/09/2014, 16h37
  2. Optimiser la compilation win32 - taille du fichier
    Par user 56gt8 dans le forum Débuter
    Réponses: 4
    Dernier message: 28/09/2007, 07h12
  3. [Fortran 77] Problème de compilation
    Par Kenji dans le forum Fortran
    Réponses: 26
    Dernier message: 23/05/2005, 16h07
  4. [Visual Fortran] Erreur de compilation
    Par Julito dans le forum Fortran
    Réponses: 1
    Dernier message: 04/03/2005, 21h24
  5. Réponses: 2
    Dernier message: 27/02/2004, 13h47

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