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 :

Comment utiliser un tableau comprenant plus de 7 dimensions ?


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 49
    Par défaut Comment utiliser un tableau comprenant plus de 7 dimensions ?
    Bonjour, ayant un espace à beaucoup de paramètres, je suis obligé d'utiliser un tableau de réels à 8 dimensions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    real, dimension(:,:,:,:,:,:,:,:), allocatable :: tab1,tab2
    Or, si le programme compile et roule correctement avec ifort, ce n'est pas le cas avec g95 qui me renvoie l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    g95 -cpp  -g -fbounds-check -ftrace=full -fimplicit-none   -c    -DPOINTER_SIZE=8 modules.f90 -I/home/xxxx/yyyy 
    In file modules.f90:938
     
      real, dimension(:,:,:,:,:,:,:,:), allocatable :: tab1,tab2
    est-ce en rapport avec -DPOINTER_SIZE=8 ? comment la changer ?

    merci beaucoup ?


  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 shadock0 Voir le message
    ...ayant un espace à beaucoup de paramètres, je suis obligé d'utiliser un tableau de réels à 8 dimensions... Or, si le programme compile et roule correctement avec ifort, ce n'est pas le cas avec g95 ... est-ce en rapport avec -DPOINTER_SIZE=8 ? ...
    La limite de 7 est inscrite dans la norme. Un compilateur doit supporter au moins 7 dimensions...

    Je ne connais pas la switch DPOINTER_SIZE, mais le nom ne semble pas faire référence à cela...

    Solutions possibles ?

    • Utiliser seulement des compilateurs supportant au moins 8 dimensions
    • Changer d'algorithme
    • Utiliser une fonction de conversion des indices (technique décrite ci-après)


    Posons que tu veux le tableau :

    A( MaxI1, MaxI2, MaxI3, MaxI4, MaxI5, MaxI6, MaxI7, MaxI8).

    Tu dois plutôt utiliser :

    A( MaxI1 * MaxI2 * MaxI3 * MaxI4 * MaxI5 * MaxI6 * MaxI7 * MaxI8).

    Plutôt que de faire :

    A(i1, i2, i3, i4, i5, i6, i7, i8)

    Tu dois plutôt faire (et c'est là que ça se complique) :

    A(i1 + (i2-1)*MaxI1
    + (i3-1)*MaxI1*MaxI2
    + (i4-1)*MaxI1*MaxI2*MaxI3
    + (i5-1)*MaxI1*MaxI2*MaxI3*MaxI4
    + (i6-1)*MaxI1*MaxI2*MaxI3*MaxI4*MaxI5
    + (i7-1)*MaxI1*MaxI2*MaxI3*MaxI4*MaxI5*MaxI6
    + (i8-1)*MaxI1*MaxI2*MaxI3*MaxI4*MaxI5*MaxI6*MaxI7)

    Pour simplifier, tu place l'expression dans une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    integer function Ind(i1, i2, i3, i4, i5, i6, i7, i8)
    ...déclarations
    Ind = i1 + (i2-1)*MaxI1 
             + (i3-1)*MaxI1*MaxI2 
             + (i4-1)*MaxI1*MaxI2*MaxI3 
             + (i5-1)*MaxI1*MaxI2*MaxI3*MaxI4
             + (i6-1)*MaxI1*MaxI2*MaxI3*MaxI4*MaxI5
             + (i7-1)*MaxI1*MaxI2*MaxI3*MaxI4*MaxI5*MaxI6
             + (i8-1)*MaxI1*MaxI2*MaxI3*MaxI4*MaxI5*MaxI6*MaxI7
    end function Ind
    Et les expressions de la forme A(i1, i2, i3, i4, i5, i6, i7, i8) deviennent A(Ind(i1, i2, i3, i4, i5, i6, i7, i8)), ce qui ne pollue pas trop le code.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 49
    Par défaut
    Wow ! Merci c'est une solution à la fois intelligente et élégante afin de contourner le problème je trouve !

    Par contre... quelque chose que j'utilise beaucoup est l'adressage pour sélectionner toute une coordonnées, par exemple:

    tab1(a1,a2,a3,:,a5,a6,:,a8)

    Il ne sera plus possible de le faire avec ta méthode de conversion d'indice si ? ou bien alors... cela risque de rendre le code bien plus lent pour rechercher les valeurs voulues non ?

    Merci de ton éclairage à ce sujet!

  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
    Par défaut
    A priori, tu as raison, ça ne fonctionnera pas.

    Et je n'ai pas vraiment le temps d'y réfléchir aujourd'hui.

    Mais, si tu ne faisais jamais la sélection complète de 2 colonnes précises, tu pourrais possiblement utiliser un stratégie hybride en compressant ces 2 colonnes dans une, et en maintenant explicites les autres colonnes...

  5. #5
    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
    Une solution peut être :

    Si la fonction Ind est "elemental", elle pourrait être utilisée avec des arguments vectoriels. De là, tu pourrais faire :

    A(Ind(i1,i2,[(k,k=1,MaxI3)],i4,....)

    Bon, d'accord, c'est un "peu" lourd, mais il y a peut-être moyen de poursuivre et d'améliorer...

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 49
    Par défaut
    Ok, merci beaucoup !

    Afin de ne pas ralentir en terme de calcul le code (avec les indices etc...), je crois que je vais merger seulement deux colonnes, celles qui ont les IMAX les plus petit. Le reste des accès mémoire étant automatiquement optimisé par fortran.

    Par contre, on m'a dit que tes indices étaient à l'envers de la manière dont fortran traite les accès mémoire et donc que ça pourrait ralentir le calcul.

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

Discussions similaires

  1. Comment utiliser 3 micros ou plus ?
    Par paissad dans le forum LabVIEW
    Réponses: 2
    Dernier message: 21/12/2008, 20h56
  2. Réponses: 6
    Dernier message: 26/01/2008, 10h37
  3. [Tableaux] Comment utiliser un tableau dans ce cas
    Par Equinoxe5 dans le forum Langage
    Réponses: 1
    Dernier message: 19/08/2007, 22h13
  4. Réponses: 3
    Dernier message: 20/12/2006, 17h13
  5. Réponses: 4
    Dernier message: 24/08/2005, 14h09

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