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

Langage C++ Discussion :

Optimisation Vitesse d'Exécution Calcul matriciel


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Par défaut Optimisation Vitesse d'Exécution Calcul matriciel
    Bonjour à toutes et à toutes.

    Pour un algorithme de traitement d'informations, je dois appliquer sur un tableau 600x600 un filtre de corrélation 21x21

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    int demiTaille = 10;
    for(int n=0; n< 600; ++n)
        for(int m=0; m<600; ++m)
        {
            int uBegin = std::max(0, n - demiTaille );
            int uEnd = std::min(600- 1, n + demiTaille );
            int vBegin = std::max(0, m - demiTaille );
            int vEnd = std::min(600- 1, m + demiTaille );
            double temp = 0.0;
            for(int u=uBegin; u<=uEnd; ++u)
                for(int v=vBegin; v<=vEnd; ++v)
                    temp += abs(tabInitial[u][v]) * filter[demiTaille + u - n][demiTaille + v - m];
            tabFinal[n][m] = temp;
        }
    Le problème est que l'exécution de cette partie dure 0.4 secondes, ce qui est trop long pour mon application.

    Est ce que quelqu'un aurait des solutions d'optimisation.

    Merci d'avance

  2. #2
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut
    Bonjour,

    est ce que tes conteneurs sont des vectors ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Par défaut
    alors au depart oui j'ai utiliser des vector<vector<double>>, mais l'exécution était alors de 4.2s.
    donc j'ai essayé avec des double**, et la je passe à 0.4s

    je n'ai pas essayer de faire un vector<double> de taille 600x600 par contre...

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 604
    Par défaut
    essaye

    Avec un double**, toutes tes données ne sont pas contiguë en mémoire. Avec un vector de taille 600*600 elle le seront et les accès mémoire seront beaucoup plus rapide.

    Je te renvois là, ça pourrait t'aider:
    http://www.developpez.net/forums/d10...cteur-vecteur/

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par pyros Voir le message
    essaye

    Avec un double**, toutes tes données ne sont pas contiguë en mémoire. Avec un vector de taille 600*600 elle le seront et les accès mémoire seront beaucoup plus rapide.
    Non, c'est pas garantie en C++98 (par contre toute les implémentations que je connaissent le sont oui )

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 287
    Billets dans le blog
    2
    Par défaut
    une idée à tester, bien qu'il y a de grandes chances pour que le compilateur optimise ça lui-même, mais ne sait-on jamais:
    - les tests d'arrêt de boucle. Ils sont appelés à chaque itération. Les == et != sont plus rapide que les <, >, <= ou >=

    Après, moi je suis sûr que dans ce cas là, ce sera plus rapide avec des vector à une dimension et un iterateur, qu'avec un vector à une dimension et accès avec indice. Certainement pas un gain énorme, mais ce sera toujours ça de pris.

    Et puis après, il faut chercher du côté de l'utilisation de threads, si tu as plusieurs cores ou plusieurs processeurs en particulier. Et surtout si tu peux trouver une méthode pour pouvoir permettre cela. Par exemple en découpant ta matrice en sous-matrices et appliquant le filtre dans des processus séparés, ce genre de choses.

    Sinon iol doit bien y avoir des libs qui font ce genre de choses déjà non?

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Citation Envoyé par Goten Voir le message
    Non, c'est pas garantie en C++98 (par contre toute les implémentations que je connaissent le sont oui )
    La contigüité dans les vecteurs est garantie en C++03.
    Pour les sttring, j'ai la flemme de chercher si c'est maintenant assuré dans le C++11.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. [Débutant] Optimiser la vitesse d'exécution
    Par horemheb dans le forum VB.NET
    Réponses: 2
    Dernier message: 02/08/2013, 10h40
  2. Optimisation de calcul matriciel
    Par maxi_simo dans le forum MATLAB
    Réponses: 3
    Dernier message: 20/03/2013, 12h53
  3. Optimisation de boucles via calcul matriciel
    Par HAL-9000 dans le forum MATLAB
    Réponses: 12
    Dernier message: 06/03/2010, 21h53
  4. Calcul de la vitesse d'exécution d'un prog.
    Par fred61 dans le forum Débuter
    Réponses: 4
    Dernier message: 10/08/2009, 17h14
  5. Calcul Matriciel en PL/SQL
    Par PpPool dans le forum PL/SQL
    Réponses: 4
    Dernier message: 02/02/2004, 10h11

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