Bonjour tout le monde,
Je suis un nouveau sur le forum. J'aimerais savoir s'il existe des librairies "calcul matriciel" pour le langage C/C++ c'est à dire "inverse d'une matrice", "produit matriciel",...
Merci.
Version imprimable
Bonjour tout le monde,
Je suis un nouveau sur le forum. J'aimerais savoir s'il existe des librairies "calcul matriciel" pour le langage C/C++ c'est à dire "inverse d'une matrice", "produit matriciel",...
Merci.
Personne n'a une idée sur le sujet :(Citation:
Envoyé par bassabo
MTL, Blitz++, boost.uBlas, ...
Ayant un peu touché aux deux dernières, je ne peux que te les conseiller.
La plus rapide de toutes semble être ATLAS (Automatically Tuned Linear Algebra Software).
Elle utilise les instructions SSE,SSE2, elle optimise la mémoire cache.
http://math-atlas.sourceforge.net/
Malheureusement c'est que du C
Donc je ne pense pas qu'elle soit plus rapide que MTL, Blitz++ et les autres en C++ qui permettent de supprimer les temporaires et de considérer uen matrice comme un type comme un autre. Pour les instructions SSE et autres, en spécifiant l'architecture d'arrivée + des matrices statiques - taille connue à la compilation -, le compilo devrait pouvoir les utiliser.
Le compilo n'optimisera jamais ces bibliothèques autant qu'ATLAS.
Je connais particulièrement bien les algorithmes utilisés par ATLAS. Je reconnais que je ne connais pas bien Blitz++, MTL, Pooma et Co, mais la programmation générique a malheureusement ici des limites.
La gestion des instructions SSE pour ces bibliothèque reste encore à faire (à ma connaissance) et leurs algorithmes n'optimisent pas la mémoire cache.
Supprimer les temporaires, (je suppose que ça correspond à la "lazy calculation") est très utile dans certains cas. Mais pour le calcul matriciel, la plupart du temps on veut calculer la matrice complète. L'interface BLAS permet déjà pas mal de combinaison.
Je ne cherche pas à défendre ATLAS dont je n'aime pas l'interface BLAS en C. Ca ne sera jamais aussi pratique que des bibliothèques génériques.
Si tu veux faire un test, je veux bien te compiler un programme pour la multiplication de matrices, disons 1024x1024, pour float, double et complexes, et te donner la vitesse sur mon ordi. On comparera avec tes résultats.
Il faudrait qu'on ait le même PC ;)
Je ferais sans doute un jour les tests, j'ai comme objectif de faire un petit article sur les bibliothèques matricielles, on verra bien le résultat :) Je testerai toutes les libs que je trouve et qui sont utilisables - GSL, MTL, Blitz++, boost::uBLAS, ATLAS et d'autres si je trouve, ça prendra juste plus de temps :D -
Je parie sur ATLAS. Je parie que Blitz & Co. sont battus à plate couture pour le calcul matriciel.
Même avec des PCs différents, on aurait un bon ordre de grandeur.
Au besoin je peux te transmettre un fichier compilé.
Choisis ta ou tes librairies, et on fait une course.
Mon PC: P4 2.6GHz, SSE2, Cache L2=512K, Cache L1=8K, FSB 800MHz.
D'ici 1 ou 2 mois je compte rajouter de nouvelles fonctions (dont des optimisations comme ATLAS) à ma bibliothèque générique qui est déjà en ligne.
J'aurai alors peut-être besoin d'un testeur pour lancer quelques becnchmarks de ma librairie sur un P4 avec 1Mo de cache. Tu pourrais m'aider?
Accessoirement, Blitz a les perfs du fortran avec une expressivité proche des notations mathématiques -- il manquerait quelques opérateurs pour bien faire. Et elle ne repose pas juste sur de l'évaluaton paresseuse, mais sur du pré-traitement réalisé à la compil sur les expressions mathématiques.
Pour le SSE, je reste persuadé que c'est le rôle du compilo que de s'occuper de ces détails pour nous. Des essais dont tu nous avais parlés (si me souvenirs sont bons), je n'ai pas l'impression que cela soit le cas.
OK, je veux bien t'aider ;) Au boulot, j'ai un P4 assez proche.Citation:
Envoyé par Charlemagne
De toute manière, je ferai aussi un bench sur ma lib au boulot ;)
D'ailleurs, si tu veux m'envoyer ton fichier bench, je me ferai un plaisir de le lancer avec les différentes bibliothèques dont on a parlé, enfin, petit à petit ;)
Bon, fin du HS ;)
Merci tout le monde.
Je crois que ça va aller avec MTL.
Merci Miles.
Mon bench n'est pas encore fait, pas avant 1 mois. Je te recontacterai quand je serai près. Il faudra se mettre d'accord sur les modalités du bench.
Des multiplications sur un panel de matrices de différentes tailles devraient faire l'affaire.
Pour bien testet la bibliothèque ATLAS, il faut la compiler sur l'ordinateur testé, parce qu'elle s'adapte à l'ordi (SSE, mémoire cache). Si tu as besoin de conseils pour son installation, n'hésite pas à me contacter.
ATLAS va plus loin dans les optimisations, mais celles ci ne sont pas génériques.Citation:
Accessoirement, Blitz a les perfs du fortran avec une expressivité proche des notations mathématiques -- il manquerait quelques opérateurs pour bien faire. Et elle ne repose pas juste sur de l'évaluaton paresseuse, mais sur du pré-traitement réalisé à la compil sur les expressions mathématiques.
Tu as bonne mémoire (mon dernier poste à ce sujet doit bien remonter à 8-9 mois).Citation:
Pour le SSE, je reste persuadé que c'est le rôle du compilo que de s'occuper de ces détails pour nous. Des essais dont tu nous avais parlés (si me souvenirs sont bons), je n'ai pas l'impression que cela soit le cas.
Mais les optimisations SSE des compilos ne servent (quasiment) à rien. Tout au plus quand le code utilise des schémas C très précis et peu pratiques pour mettre le compilo sur la voie. Il y a de plus le problème de l'alignement.
(exemple très approximatif et pas sûr du tout):
Code:
1
2
3
4
5
6
7
8
9 float *a, *b, *c... for (int i=0; i<n, i+=4) { a[i]=b[i]+c[i]; a[i+1]=b[i+1]+c[i+1]; a[i+2]=b[i+2]+c[i+2]; a[i+3]=b[i+3]+c[i+2]; }
Attention, la MTL n'est plus maintenue à ma connaissance depuis pas mal d'années. Je crois que le mec a passé son doctorat, et bye byeCitation:
Je crois que ça va aller avec MTL.