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 :

Matrice, template, optimisation.


Sujet :

C++

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut Matrice, template, optimisation.
    Bonjour à tous, j'essaie de créer une classe Matrice la plus rapide possible.

    Je vous demande donc quelques conseils.

    Quelques informations :

    -Les éléments de ma matrice sont contigus en mémoire (j'ai un T* et non un T**).
    -Le nombre de ligne et de colonnes est connus à la compilation (ce sont des templates)

    Quelques questions :

    En utilisant les templates, et en particulier std::is_pod, j'ai pensé qu'on pourrait optimiser les copies.

    -Comment optimiser la création de la matrice ou tous les éléments sont à une valeur donnée et les éléments des pod ? (memset marche que pour des taille d'un octet).
    -utiliser memcpy pour les copies si T est un POD.
    -Existe-il pour les matrices de manière non intuitive d'effectuer des opérations pour les accélérer (multiplication de matrice, mise à une puissance d'une matrice, ...). Par exemple, lors d'une mise à une puissance, puisque la taille est connue à la compilation, décomposé les facteurs de chaque opération à la compilation ?
    -Autres astuces ?

    Merci.

    SVP, ne dites pas qu'il faut faire quelque chose qui marche avant d'optimiser.

  2. #2
    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
    Citation Envoyé par NoIdea Voir le message
    -Les éléments de ma matrice sont contigus en mémoire (j'ai un T* et non un T**).
    Tu peux avoir un T** et un stockage continue, cf Pointeur de Iliffe.

    Citation Envoyé par NoIdea Voir le message
    En utilisant les templates, et en particulier std::is_pod, j'ai pensé qu'on pourrait optimiser les copies.
    std::copy fait deja ca tout seul.

    Citation Envoyé par NoIdea Voir le message
    -Existe-il pour les matrices de manière non intuitive d'effectuer des opérations pour les accélérer (multiplication de matrice, mise à une puissance d'une matrice, ...). Par exemple, lors d'une mise à une puissance, puisque la taille est connue à la compilation, décomposé les facteurs de chaque opération à la compilation ?
    Plein, des theses entieres sont faites dessus tout les ans. Je te donne 6 mois avant d'arreter de vouloir faire mieux que BLAS/LAPACK.

    Citation Envoyé par NoIdea Voir le message
    -Autres astuces ?
    Ne reinvente pas la roue :o

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par NoIdea Voir le message
    Bonjour à tous, j'essaie de créer une classe Matrice la plus rapide possible.

    Je vous demande donc quelques conseils.
    Ne le fais pas.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    La façon d'optimiser (et de stocker, d'ailleurs) va beaucoup dépendre du type de données que tu auras dans tes matrices, et du type de traitements que tu entends leur infliger.

    Quelques questions qu'il faut te poser, sur la nature des données :

    1- quelle est la taille de tes matrices? si elles sont à peu près carrées, et de petite dimension, les méthodes compliquées d'optimisation sont généralement peu utiles.
    2- tes matrices sont elles pleines ou creuses ?(les creuses ca ne se stocke pas pareil, et donc ca ne se traite pas pareil) Ont elle des caractéristiques particulières (genre beaucoup de matrices carrées, ou symétriques, ou des coefficients bornés, ou...)
    3- tes matrices sont elles de "vraies" matrices, avec une forte équivalence entre lignes et colonnes, ou sont elles des tableaux de données (par exemple avec des questions en colonnes et des individus en ligne...)? Dans le second cas, ce qui compte c'est généralement davantage de stocker les données dans le "bon ordre" que d'utiliser des algorithmes génériques.
    4- tes données sont elles exactes, ou de nature statistique? Dans le second cas, comme tu peux remplacer une matrice par une autre matrice "voisine", tu vas utiliser toutes sortes d'algorithmes particuliers.

    Sur les traitements, si tu fais de l'algèbre "de base" (additions, produits, ...) sur un grand nombre de matrices, les principal facteur d'optimisation sont d'éviter les copies intermédiaires, et le stockage si tu as des matrices creuses. Si tu fais des stats, et que tu inverses ou que tu diagonalises, alors les considérations de stabilité du calcul prendront toujours le pas sur la vitesse (traiter vite mais faux n'est pas une bonne idée).

    Pour une bonne introduction générale, et des exemples dans des domaines variés, essaye Numerical Recipes in C++, il y a beaucoup de choses (pas juste sur les matrices), ça ne demande pas un niveau de maths trop élevé, c'est très bien écrit, et il y a des exemples. Cherche la 3eme édition (le bouquin noir) plutôt que la seconde (le rouge), il y a pas mal de choses en plus.

    Francois

  5. #5
    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,

    Citation Envoyé par NoIdea Voir le message
    Comment optimiser la création de la matrice ou tous les éléments sont à une valeur donnée et les éléments des pod ?
    Ne stocker la valeur qu'une seule fois dans un scalaire.

    Citation Envoyé par NoIdea Voir le message
    Existe-il pour les matrices de manière non intuitive d'effectuer des opérations pour les accélérer (multiplication de matrice, mise à une puissance d'une matrice, ...).
    Regarde l'algorithme de Strassen. Attention à trouver un bon compromis entre stabilité et rapidité à chaque fois.

    Plus généralement, pour aller vite il y a le parallélisme... voir le gpgpu puisque c'est à la mode... voir de la parallélisation hybride puisque c'est un sujet de recherche actuel. Un autre moyen consiste à t'acheter un supercalculateur...

  6. #6
    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
    Citation Envoyé par Aleph69 Voir le message
    Regarde l'algorithme de Strassen. Attention à trouver un bon compromis entre stabilité et rapidité à chaque fois.
    Strassen est impracticable en geenral car tres complexes a coder. Il n'as d'interet que pour des matrices denses de tres grande tailles.

    Citation Envoyé par Aleph69 Voir le message
    Plus généralement, pour aller vite il y a le parallélisme... voir le gpgpu puisque c'est à la mode... voir de la parallélisation hybride puisque c'est un sujet de recherche actuel. Un autre moyen consiste à t'acheter un supercalculateur...
    Cooli sur les GPUs. Deja SIMD+openMP et on en reparle.

  7. #7
    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 Joel,

    concernant les très petites matrices, j'étais tombé là-dessus si ça t'intéresse :
    http://www.csd.uwo.ca/~eschost/publi...s/DrIsSc09.pdf

    Sinon, pour Strassen-Winograd , le problème c'est la stabilité numérique. C'est surtout pour cela qu'on ne l'utilise presque jamais. Dans le cas contraire, la complexité de l'implémentation n'arrêterait personne à mon avis.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Bonjour Joel,
    Sinon, pour Strassen-Winograd , le problème c'est la stabilité numérique. C'est surtout pour cela qu'on ne l'utilise presque jamais. Dans le cas contraire, la complexité de l'implémentation n'arrêterait personne à mon avis.
    Pas seulement. La complexité de l'algorithme se traduit généralement par une augmentation du coefficient du terme dominant, ou des termes juste en dessous. Sur de grosses matrices, l'amélioration est réelle, sur de petites, il faut faire le calcul.

    C'est d'ailleurs pour cela qu'on a un problème de stabilité. L'algorithme de Strassen est exact, il n'y a donc en théorie pas que problème de stabilité, si on utilise des mantisses suffisantes, ou des méthodes adaptées, mais celles ci se traduisent pas une augmentation des coefficients dominants, qui repoussent les conditions d'utilisation de la méthode.

    Ensuite, sur de petites matrices, des optimisations "machine" entrent en ligne de compte, qui font qu'un algorithme plus efficace sur le papier ne l'est pas toujours en pratique.

    Francois
    Dernière modification par Invité ; 17/02/2011 à 12h06.

  9. #9
    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 François,

    Citation Envoyé par fcharton Voir le message
    Pas seulement. La complexité de l'algorithme se traduit généralement par une augmentation du coefficient du terme dominant, ou des termes juste en dessous. Sur de grosses matrices, l'amélioration est réelle, sur de petites, il faut faire le calcul.
    Il y a un malentendu sur le terme de complexité. Je n'évoquais pas la complexité algorithmique mais la "complexité d'implémentation" c'est-à-dire la difficulté à programmer l'algorithme. Je reconnais volontiers que ma phrase était ambigue et que j'aurais dû utiliser un vocabulaire plus clair. En particulier, je ne remets pas du tout en cause ce qu'a dit Joel sur les petites/moyennes matrices.

    Citation Envoyé par fcharton Voir le message
    C'est d'ailleurs pour cela qu'on a un problème de stabilité. L'algorithme de Strassen est exact, il n'y a donc en théorie pas que problème de stabilité, si on utilise des mantisses suffisantes, ou des méthodes adaptées, mais celles ci se traduisent pas une augmentation des coefficients dominants, qui repoussent les conditions d'utilisation de la méthode.
    L'algorithme de Strassen n'est pas backward stable (théorie).

  10. #10
    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
    surtout deja avant de strassen, je pense que faire bu blocking et du loop unrolling proprement en SIMD suffit largement pour les matrices de tailles raissonable.

Discussions similaires

  1. Optimisation Listechainé avec template et operateur surchargé.
    Par Alain Defrance dans le forum Langage
    Réponses: 8
    Dernier message: 29/12/2007, 18h25
  2. Réponses: 1
    Dernier message: 24/05/2007, 14h46
  3. template matrice générique
    Par troussepoil dans le forum Langage
    Réponses: 7
    Dernier message: 12/03/2007, 11h45
  4. [Matrice]Optimisation de la multiplication
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 27/06/2006, 18h11
  5. Créer un type matrice avec des templates
    Par souading3000 dans le forum C++
    Réponses: 2
    Dernier message: 15/06/2006, 11h24

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