Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Fortran
Fortran Forum d'entraide sur la programmation en Fortran. Avant de poster -> FAQ Fortran
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/08/2012, 14h52   #1
TheOyoStyledMan
Membre habitué
 
Inscription : septembre 2004
Messages : 111
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 111
Points : 118
Points : 118
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 :
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 :
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 :
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?
TheOyoStyledMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2012, 20h54   #2
Sylvain Bergeron
Modérateur
 
Inscription : août 2006
Messages : 781
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : août 2006
Messages : 781
Points : 1 028
Points : 1 028
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.
Sylvain Bergeron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2012, 11h26   #3
TheOyoStyledMan
Membre habitué
 
Inscription : septembre 2004
Messages : 111
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 111
Points : 118
Points : 118
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
TheOyoStyledMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2012, 20h35   #4
Sylvain Bergeron
Modérateur
 
Inscription : août 2006
Messages : 781
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : août 2006
Messages : 781
Points : 1 028
Points : 1 028
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.
Sylvain Bergeron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2012, 15h34   #5
TheOyoStyledMan
Membre habitué
 
Inscription : septembre 2004
Messages : 111
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 111
Points : 118
Points : 118
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 ....
TheOyoStyledMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2012, 08h21   #6
Ehouarn
Membre éclairé
 
Inscription : mars 2007
Messages : 326
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 326
Points : 378
Points : 378
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
Citation:
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").
Ehouarn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2012, 10h37   #7
TheOyoStyledMan
Membre habitué
 
Inscription : septembre 2004
Messages : 111
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 111
Points : 118
Points : 118
Déjà essayé mais pas plus conluant

Merci pour le conseil!
TheOyoStyledMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2012, 10h17   #8
Fortran90
Membre du Club
 
Avatar de Fortran90
 
Homme
Inscription : septembre 2006
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme

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

Informations forums :
Inscription : septembre 2006
Messages : 83
Points : 62
Points : 62
Stack size overflow... quel est la taille des tableaux sur la stack? As tu des tableaux automatiques? Quel compilateur utilises tu?
Fortran90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2012, 15h49   #9
TheOyoStyledMan
Membre habitué
 
Inscription : septembre 2004
Messages : 111
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 111
Points : 118
Points : 118
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.
TheOyoStyledMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2012, 19h03   #10
Fortran90
Membre du Club
 
Avatar de Fortran90
 
Homme
Inscription : septembre 2006
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme

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

Informations forums :
Inscription : septembre 2006
Messages : 83
Points : 62
Points : 62
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.
Fortran90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h07.


 
 
 
 
Partenaires

Hébergement Web