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 :

Optimisation d'un code simple.


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Par défaut Optimisation d'un code simple.
    Bonjour,

    Après avoir profilé mon code, je me suis rendu compte que 70% du temps Elapse est passé dans bout de code suivant qui est appelé des milliers de fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      y(n)=0.0d0
      do i = n - 1, 1, - 1
         r = 0.0d0
         do j = istart(i), iend(i)
            r = r + a(j)*x(ja(j))
         end do
         y(i) = r
      end do
    A chaque appel, les tableaux d'entiers ja, istart et iend sont identiques, ainsi que le tableau de double a. seul le tableau de double x varie.

    Est-ce qu'il est possible d'optimiser encore ce code? (hormis les options à la compilation)
    Merci.

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 32
    Par défaut
    Bonjour,
    Je ne sais pas si ce te fera vraiment gagner du temps de calcul, mais tu peux au moins t'épargner une boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      y(n)=0.0d0
      do i = n - 1, 1, - 1
         y(i) = sum(a(istart(i):iend(i))*x(istart(i):iend(i))
      end do

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Par défaut
    Merci mais le problème est que les indices du tableau x sont stockés dans le tableau ja, ce qui rend la somme impossible à priori car le code suivant n'est pas correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      y(n)=0.0d0
      do i = n - 1, 1, - 1
         y(i) = sum(a(istart(i):iend(i))*x(ja(istart(i):iend(i)))
      end do

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur modélisation aérodynamique
    Inscrit en
    Juillet 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur modélisation aérodynamique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 105
    Par défaut
    Bonjour,
    de ce que je vois, les calculs des y(i) sont tous découplés (ils ne dépendent pas les uns des autres.
    Donc pourquoi fais-tu une boucle inverse ? En suivant l'ordre naturel de stockage, tu dois pouvoir gagner un peu, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    y(n)=0.0d0
      do i = 1, n-1
         r = 0.0d0
         do j = istart(i), iend(i)
            r = r + a(j)*x(ja(j))
         end do
         y(i) = r
      end do
    EDIT :

    Par contre tu peux passer par un tableau tampon pour pouvoir utiliser sum()
    qui est assez avantageux. En gros tu perd un peux de temps à remplir le tampon (c'est simplement une copie des x qui vont jouer dans la somme) et tu gagnes à utiliser sum() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    y(n)=0.0d0
      do i = 1, n-1
     
         ! remplissage du tampon
         do j = istart(i), iend(i)
             x_tmp(j) = x(ja(j))
         enddo
     
         y(i) = sum(  a(istart(i):iend(i)) * x_tmp(istart(i):iend(i))  )
     
      end do
    Bon je ne suis pas completement certain des indices, mais c'est l'idée. Faut tester pour voir si ca gagne vraiment du temps de calcul.

  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
    En continuant l'idée de bobbyboy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ! remplissage du tampon
    do j = minvalue(istart), maxvalue(iend)
        x_tmp(j) = x(ja(j))*a(j)
    enddo
     
    y(n)=0.0d0
    do i = 1, n-1
        y(i) = sum(x_tmp(istart(i):iend(i)))
    enddo
    Cette version devrait être plus rapide si les sections couvertes par istart et iend représentent une grande portion de la plage totale.

  6. #6
    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
    Autre possibilité (à raffiner) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ! remplissage du tampon
    x_tmp(0) = 0.0
    do j = 1, maxvalue(iend)
        x_tmp(j) = x(ja(j))*a(j) + x_tmp(j-1)
    enddo
     
    y(n)=0.0d0
    do i = 1, n-1
        y(i) = x_tmp(iend(i)) - x_tmp(istart(i))
    enddo
    Cette piste est cependant sujette à des risques de perte de précision.

Discussions similaires

  1. [MySQL] Optimisation de mon code utilisant simple xml
    Par heretik25 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 05/08/2011, 20h13
  2. probleme de code simple
    Par BFH dans le forum C
    Réponses: 18
    Dernier message: 28/10/2005, 18h57
  3. Explication de code simple
    Par Clad3 dans le forum OpenGL
    Réponses: 3
    Dernier message: 20/03/2005, 11h31
  4. Réponses: 2
    Dernier message: 08/04/2004, 11h11

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