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

C++ Discussion :

Multiplication de deux matrices


Sujet :

C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut Multiplication de deux matrices
    Salut à tous,

    En faisant le profiling de mon programme, j'ai retrouvé que le hot path est la fonction que j'ai définit pour la multiplication entre deux matrices, voici son code

    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
    16
    17
    18
    19
    20
    vector<double> Multiplication(vector<double>const & a,vector<double>const & b,int m)
    {
    int i,j,w;
    int l(a.size()/m);
    int e(b.size()/m);
    double sum;
    vector<double> cl;
        cl.reserve(l*e);
    	for(int i(0);i<l;++i)
    		for(int j(0);j<e;++j)
    		{
    			sum=0;
    		  for(int w(0);w<m;++w)
    		  {
    			  sum=sum+a[i*m+w]*b[w*e+j];
    		  }
    		  cl.push_back(sum);
    		}
    		return(cl);
    }
    Alors est ce que je peux faire mieux ??

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour

    Oui :
    - lisibilité (indentation)
    - compréhension (noms des variables, commentaires)
    - performance (tiling, parallélisme)
    - simplicité (et performance) (pourquoi ne pas appeler une bibliothèque dédié au calcul matriciel comme BLAS via Boost.uBLAS)

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Pardon c'est vrai les indices ne snt pas compréhensible, voici le code de nouveau
    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
    16
    17
    18
    19
    20
    21
     
    vector<double> Multiplication(vector<double>const & a,vector<double>const & b,int m)
    {
    int i,j,w;
    int l(a.size()/m);//ligne de la matrice a
    int e(b.size()/m);//colonne de la matrice b, m nombre de colonne de a et les lignes de b
    double sum;
    vector<double> cl;//la matrice produit
        cl.reserve(l*e);
    	for(int i(0);i<l;++i)
    		for(int j(0);j<e;++j)
    		{
    			sum=0;
    		  for(int w(0);w<m;++w)
    		  {
    			  sum=sum+a[i*m+w]*b[w*e+j];
    		  }
    		  cl.push_back(sum);
    		}
    		return(cl);
    }
    Si j'appelle une bibliothèque dédié au calcul matricielle est ce que elle peux faire carément la multiplication des deux matrices est ça sera en performance mieux

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    j'ai cherché sur le tiling, parallélisme mais j'ai pas trouvé grand chose sinon est ce que ça va m'aider d'une façon remarqueble ???

  5. #5
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Si elle est orientée fonction, oui si la fonction 2mm existe.
    Sinon, il faut prendre des bibliothèques comme NT².

    Pour le tiling ou le parallélisme, sur des cas aussi simples que des multiplications de matrices, un compilateur polyhédrique comme PoCC ou Pluto s'en sort très bien

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Sincèrement je suis perdu dans les bibliothèque, j'arrivepar à retrouvé la fonction

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    J'ai un autre hot path:c'est la fonction sous_matrice qui prend en paramètre une matrice a et un tableau b et retourne une sous matrice de a dont les colonne sont les colonne de a d'indice dans b, le code source est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vector<double> sous_matrice(vector<double>const & a,vector<int>const  & b, int m, int e)
    {
    	int l(a.size()/m);//m:nombre de colonne de a, l:nombre de ligne de a
    	vector<double> cl;//  la sous matrice à retourné
    	cl.reserve(m*e);// e la taille du tableau b
    	for(int i(0);i<m;++i)
    		for(int j(0);j<e;++j)
    		{
    			cl.push_back(a[i*l+b[j]]);//l'instruction hot
    		}
    	return(cl);
    }
    Est ce que je peut l'améliorer ?? (j'espère que le code est indenté)

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    Bonjour
    - performance (tiling, parallélisme)
    maintenant j'ai compris ce que tu voulais dire Ehonn à travers ce site msdn.microsoft.com/en-us/library/hh873134.aspx

  9. #9
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    reimplantez MM a la main (sauf exercice scolaire) est inutile. On sort un bon BLAS et hop;

  10. #10
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    après une lecture rapide de ton code, voici plusieurs remarques générales :

    1. ce n'est pas utile d'utiliser un conteneur tel que vector puisque les tailles de tes matrices doivent être connues a priori;
    2. modéliser le comportement des matrices à l'aide d'une classe améliorerait la simplicité et la lisibilité de ton code;
    3. dans la mesure du possible, indiquer à son compilateur où et comment optimiser (register, inline, const, ...);
    4. respecter le principe de localité des données;
    5. promouvoir la réutilisation des mémoires caches en découpant tes matrices en blocs;
    6. la parallélisation est évidemment à conseiller mais l'extensibilité de ton code dépendra très fortement du point précédent;
    7. utiliser les bonnes options de compilation (O2,O3,etc) pour optimiser ton code permet de gagner en performances;
    8. le recours à des bibliothèques externes ne t'apprendra pas grand chose sur l'optimisation de code mais te fera gagner un temps considérable;
    9. privilégier les générateurs de codes optimisés pour ta machine (Atlas, Goto, Intel MKL, ...) sinon la performance ne sera pas au rendez-vous;
    10. puisque tu écris ton code en C++, les expression templates sont susceptibles de t'intéresser;
    11. les instructions SIMD sont susceptibles de t'intéresser;
    12. les manuels de référence sur l'optimisation proposés par Intel sont susceptibles de t'intéresser;
    13. la notion de "cache-oblivious algorithm" est susceptible de t'intéresser;
    14. les techniques de transformation de programme sont susceptibles de t'intéresser.

Discussions similaires

  1. multiplication de deux matrices en C
    Par komat dans le forum Débuter
    Réponses: 15
    Dernier message: 15/12/2010, 21h05
  2. multiplication de deux matrice sous matlab
    Par khalil.ajmi dans le forum MATLAB
    Réponses: 4
    Dernier message: 12/05/2010, 16h04
  3. multiplication de deux matrices
    Par ikuzar dans le forum Débuter
    Réponses: 2
    Dernier message: 19/10/2009, 14h38
  4. Calcul de la multiplication de deux matrices
    Par al_alias dans le forum Pascal
    Réponses: 2
    Dernier message: 30/05/2007, 22h37

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