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 :

Conversion d'une boucle DO à l'ancienne


Sujet :

Fortran

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 110
    Points : 130
    Points
    130
    Par défaut Conversion d'une boucle DO à l'ancienne
    Bonjour,

    je suis en train de réécrire un bout de code (des FFTs) en vieux Fortran:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          do 1001 i=1,10
                do 1001 j=1,20
             [...]
    1001 continue
    J'ai bêtement pensé que c'était équivalent à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          do 1001 i=1,10
                do 1002 j=1,20
             [...]
    1002 continue
    1001 continue
    Et donc en version plus récente:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          do i=1,10
                do j=1,20
             [...]
                enddo
          enddo
    Mais apparemment, ce n'est pas le cas... La dernière version me fait un plantage "sigsev / stacksize overflow". Il n'y a que ce genre de boucles dans la subroutine.

    Ce post me confirme que ces versions sont les mêmes: http://www.developpez.net/forums/d37...o/#post2307861

    Qu'en pensez-vous?

  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
    Points : 1 346
    Points
    1 346
    Par défaut
    Pas évident.

    La première transformation pourrait introduire une erreur via un goto 1001 dont le sens passerait de "cycle" à "exit", mais ça n'explique pas que l'erreur se produise avec la version "enddo" (il ne peut y avoir de goto 1001 oublié puisque la compilation avorterait).

    Il reste selon moi 2 possibilités :
    1. Tu as bousillé autre chose.
    2. Le code un peu différent en syntaxe produit un exécutable un peu différent "permettant" de rendre visible un problème initialement invisible, mais déjà présent.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 110
    Points : 130
    Points
    130
    Par défaut
    Je penchais pour la deuxième solution et tu confirmes ce que je pense.

    Je ne mets pas de côté la 1ère mais j'ai bien vérifié à coup d'outils de diff (tkdiff, emacs diff et vimdiff ;-) ). Mais bon ca fait quand même 2000 lignes...

    Enfin bref, tant pis, j'abandonne!

    Merci pour la réponse

  4. #4
    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
    Points : 1 346
    Points
    1 346
    Par défaut
    Comment ça, « j'abandonne » ? Comme dirait l'autre, de quessé ?

    Le problème avec ta stratégie (abandon), c'est que le problème risque de revenir dès tu changeras quelque chose (un petit bout de code, le compilateur, ...).

    Pour trouver ce genre d'erreur, la stratégie est toujours la même : mettre toutes les switches d'optimisation à off, toutes les switches de contrôle à on, et si possible, utiliser plus d'un compilateur.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 110
    Points : 130
    Points
    130
    Par défaut
    Non mais 2000 lignes de code de fft que je pige que dalle

    Mais pour faire avancer les choses, j'ai entrepris de faire la même chose avec le dgemm de BLAS, c'est-à-dire remplacer les continue par les enddo et oui apparemment les effets des optimisations compilateur se voient sur le résultat ....

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,
    Citation Envoyé par TheOyoStyledMan Voir le message
    Mais pour faire avancer les choses, j'ai entrepris de faire la même chose avec le dgemm de BLAS, c'est-à-dire remplacer les continue par les enddo et oui apparemment les effets des optimisations compilateur se voient sur le résultat .... :cry:
    Oui, ce n'est pas plus étonnant que ça, surtout si les optimisations du compilo sont "agressives".

    Par contre, pour en revenir à ton premier post et le fait que
    La dernière version me fait un plantage "sigsev / stacksize overflow".
    Ca peut aussi venir de ton environnement qui inclurai un stacksize "trop petit": la nouvelle version demanderai plus de mémoire que l'ancienne et se ferait ainsi tuer à l'exécution lorsqu'elle atteint ce plafond.
    Mais ce n'est qu'une hypothèse...
    (que tu peux tester en changeant la mémoire "stack" allouée à ta session; sous Unix/Linux via la commande "ulimit -s").

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 110
    Points : 130
    Points
    130
    Par défaut
    Déjà essayé mais pas plus conluant

    Merci pour le conseil!

  8. #8
    Membre régulier 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
    Points : 82
    Points
    82
    Par défaut
    Stack size overflow... quel est la taille des tableaux sur la stack? As tu des tableaux automatiques? Quel compilateur utilises tu?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 110
    Points : 130
    Points
    130
    Par défaut
    La taille max des tableaux est environ de 2500*2500 complexes double precision (a priori 65Mo par processus).

    J'ai bien des tableaux automatiques.

    J'utilise Intel 11 et 12.

  10. #10
    Membre régulier 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
    Points : 82
    Points
    82
    Par défaut
    Les tableaux automatiques c'est pas automatique ! ...

    Ahem...

    Ils sont alloués sur la stack donc ça peut expliquer ton problème.

    Passe les sur le heap en faisant un allocate ça devrait aller mieux.

    Si tu compiles avec -openmp, tu peux essayer d'augmenter la KMP_STACK_SIZE aussi. Essaye avec :

    export KMP_STACK_SIZE=70m (par défaut c'est 1m)

    En sachant que c'est un très mauvais workaround si ça marche, le mieux étant d'aller sur le heap.

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

Discussions similaires

  1. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  2. Modification de composant ds une boucle
    Par sinsenono dans le forum C++Builder
    Réponses: 10
    Dernier message: 22/02/2004, 12h46
  3. swf dans une boucle asp
    Par Chucky69 dans le forum Flash
    Réponses: 11
    Dernier message: 10/02/2004, 17h07
  4. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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