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

Algorithmes et structures de données Discussion :

Multiplication rapide de deux matrices 8x8


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Multiplication rapide de deux matrices 8x8
    Bonjour à tous et toutes !
    Je cherche un algo pour faire la multiplication de deux matrices 8x8 la plus rapide possible.
    L'algo "naïf" que j'ai est le suivant :

    C=A*B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pour i=0 à 7
        pour j=0 à 7
            pour k=0 à 7
                C[i*8+j] += A[i*8+k] * B[k*8+j];
    Mais je ne pense pas me tromper quand je dis que c'est lent et qu'on peut faire mieux, non ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    je sais que l'on peut aller beaucoup plus vite, mais ça dépend du contenu des matrices.

    Regarde du coté de matlab qui est le numéro un incontesté pour tout ce qui touche au matrices.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    OK, mais on n'a pas le code ?
    A moins que je ne soit pas au courant de son éventuelle libération ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  4. #4
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Si tu n'as pas tellement de données dans tes matrices tu peux toujours utiliser une bibliothèque qui gère les matrices creuses (matrices qui ne stockent que les valeurs non nulles). Il y a un article sur Wikipedia à cette adresse : http://en.wikipedia.org/wiki/Sparse_matrix.


    Nico.
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  5. #5
    Membre actif Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Points : 299
    Points
    299
    Par défaut
    Il y'a eu un sujet sur l'optimisation des multiplications des matrices 4*4, c'est toujours les memes combines, comme pour l'optimisation de la multiplication des complexes.
    En suite tu généralise la formule, puisqu'une multilication 8*8 peut etre decomposée comme plusieurs produit et somme de matrice 4*4.

    (Pour un algo générale il faut chercher du coté de Strassen)

    http://www.enseignement.polytechniqu...iez/sujet.html
    Si tu ne te plantes pas, comment veux tu pousser?

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Etant donné que tu te limites à une dimension 8x8, je te conseille fortement de développer autant que possible les boucles.
    Si tu veux encore plus optimiser je te conseille d'utiliser les instructions parallèles SIMD (SSE/SSE2 sur les Pentiums) , plutôt que de chercher un algorithme d'ordre inférieur à O(N^3) qui ne saura pas utiliser le calcul parallèle.

  7. #7
    Membre habitué Avatar de larnicebafteur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 131
    Points
    131
    Par défaut
    A moins que la matrice soit vraiment particulière, il n'y a pas vraiment d'autre solution que la solution avec les boucles proposée.
    Si la matrice ne contient pas tout les termes et possède beaucoup de 0, on peut envisager d'utiliser d'autres méthodes, mais dans ce cas, on risque de complexifier le problème car l'accès aux elements de la matrice demande d'utiliser plusieurs tables.
    Et pour des matrice 8*8, est-ce bien utile de vouloir optimiser un calcul qui est de toute facon très rapide ?
    On utilise des méthodes de stockage et de calcul pour des tailles de matrices à partir de centaines ou de milliers de lignes.
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Est-ce que ta matrice est diagonale par bloc ?

  9. #9
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Non, c'est une multiplication d'une matrice dont l'une est une DCT, et l'autre correspond à un macroblock (codage MPEG-2).
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  10. #10
    Invité
    Invité(e)
    Par défaut
    Pour ameliorer ton calcul, tu peux déjà, comme il a été evoqué, au lieu de faire 3 boucles, en faire qu'une seule, ce qui risque d'etre assez moche, mais qui marchera un poil plus vite, apres, tu peux aussi remarquer que 8 = 2**3 et donc faire des décalages de bits plutot que des multiplications, et pour finir, essayer de paralleliser

  11. #11
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Ce n'est pas destiné à une machine INTEL ou AMD...
    Pas de parallélisation dispo.
    Et les décalages, un -O3 avec GCC le fait déjà .
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    S'il n'y a pas d'instructions SIMD disponibles (bizarre quand-même car ça existe sur la plupart des processeurs depuis pas mal d'années), voici quelques idées pour améliorer la vitesse:

    1)Développer les boucles, surtout les boucles intérieurs

    2)Utiliser le minimum de ponteurs, 3 doivent suffire pour 3 matrices

    3)Stocker les matrices sous forme de vecteurs et faire des accès comme ceci:
    X[3*8+5] pour la coordonnée (3,5). Il est important d'utiliser des constantes dans les crochets plutôt que des variables i,j,k: c'est possible grâce au développement des boucles

    4)Faire de la rétention de valeurs dans les registres en "factorisant" les calculs, pour limiter les accès mémoire. Le facteur de factorisation dépend du nombre de registres (8 sur un pentium)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=0; i<8; ++i)
      for (int j=0; j<8; j+=N)
    
        ...

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