Des recommandations pour une bibliothèque de matrices C ++ rapide et utilisable?


158

Quelqu'un a-t-il des recommandations sur une bibliothèque matricielle C ++ rapide et utilisable?

Ce que je veux dire par utilisable est le suivant:

  • Les objets matriciels ont une interface intuitive (ex.: Je peux utiliser des lignes et des colonnes lors de l'indexation)
  • Je peux faire n'importe quoi avec la classe matrix que je peux faire avec LAPACK et BLAS
  • Facile à apprendre et à utiliser l'API
  • Installation relativement facile à installer sous Linux (j'utilise actuellement Ubuntu 11.04)

Pour moi, la facilité d'utilisation est plus importante que la vitesse ou l'utilisation de la mémoire pour éviter une optimisation prématurée. En écrivant le code, je pouvais toujours utiliser des tableaux 1-D (ou des vecteurs STL) et une arithmétique d'index ou de pointeur appropriée pour émuler une matrice, mais je préférerais ne pas le faire pour éviter les bugs. J'aimerais aussi concentrer mon effort mental sur le problème que j'essaie de résoudre et de programmer dans le domaine du problème, plutôt que d'utiliser une partie de mon attention finie pour me souvenir de toutes les petites astuces de programmation que j'avais l'habitude d'émuler comme matrices dans des matrices. , et rappelez-vous les commandes LAPACK, et cetera. De plus, moins de code je dois écrire et plus il est standardisé, mieux c'est.

Dense versus clairsemé n'a pas encore d'importance; certaines des matrices que je traite seront rares, mais pas toutes. Toutefois, si un paquet particulier gère bien les matrices denses ou creuses, il convient de le mentionner.

Les gabarits ne comptent pas beaucoup pour moi non plus, puisque je travaillerai avec des types numériques standard et que je n'aurai pas besoin de stocker autre chose que des doublons, des flottants ou des entiers. C'est sympa, mais pas nécessaire pour ce que j'aimerais faire.


1
Est-ce que l'utilisation de CUDA est une option?
paperboard

1
Cela pourrait être, plus tard. CUDA ne m'intéresse pas pour le moment car je construis une bibliothèque pour une application où la multiplication de matrices est le moindre de mes soucis. La majeure partie de l'effort sera consacrée à l'appel d'un solveur de programme linéaire à nombres entiers mélangés. L'utilisation de CUDA serait donc excessive. Après avoir terminé ma thèse, je compte utiliser des algorithmes plus lourds en algèbre linéaire et moins centrés sur l'optimisation. Je vous encourage certainement à poster sur les bibliothèques CUDA, cependant, si vous avez de l'expérience avec elles, car je suis sûr que d'autres personnes seraient intéressées à connaître votre opinion.
Geoff Oxberry

Qu'en est-il d'Intel MKL et IPP?
Royi

Réponses:


146

J'ai rassemblé les informations suivantes issues de recherches en ligne jusqu'à présent:

J'ai un peu utilisé Armadillo et j'ai trouvé l'interface assez intuitive. Il était donc facile de localiser les paquets binaires pour Ubuntu (et je suppose d'autres distributions Linux). Je ne l’ai pas compilé à partir de la source, mais j’espère que ce ne sera pas trop difficile. Il répond à la plupart de mes critères de conception et utilise une algèbre linéaire dense. Il peut appeler des routines LAPACK ou MKL. Il n’est généralement pas nécessaire de compiler Armadillo, il s’agit d’une bibliothèque purement basée sur des modèles: vous n’incluez que l’en-tête et le lien vers BLAS / LAPACK ou MKL, etc.

J'ai entendu de bonnes choses à propos d' Eigen , mais je ne les ai pas utilisées. Il prétend être rapide , utilise des modèles et prend en charge l'algèbre linéaire dense. LAPACK ou BLAS n’est pas une dépendance, mais semble pouvoir faire tout ce que LAPACK peut faire (plus certaines choses que LAPACK ne peut pas faire). Beaucoup de projets utilisent Eigen, ce qui est prometteur. Il contient un paquet binaire pour Ubuntu, mais en tant que bibliothèque contenant uniquement des en-têtes, il est également facile de l’utiliser ailleurs.

La version 4 de la bibliothèque de modèles de matrice semble également prometteuse et utilise des modèles. Il prend en charge l'algèbre linéaire dense et creuse , et peut appeler UMFPACK en tant que solveur crépus . Les fonctionnalités ne sont pas claires de leur site Web. Il contient un paquet binaire pour Ubuntu, téléchargeable à partir de leur site web.

PETSc , écrit par une équipe du Laboratoire National d'Argonne, a accès à des solveurs linéaires rares et denses. Je suppose donc qu'il peut fonctionner comme une bibliothèque matricielle. Il est écrit en C, mais a des liaisons C ++, je pense (et même si ce n’était pas le cas, appeler C depuis C ++ n’était pas un problème). La documentation est incroyablement complète. Le paquet est un peu excessif pour ce que je veux faire maintenant (multiplication et index matriciels pour mettre en place des programmes linéaires à nombres entiers mixtes), mais pourrait être utile comme format matriciel pour moi à l'avenir, ou pour d'autres personnes ayant des besoins différents que moi.

Trilinos , écrit par une équipe du Sandia National Laboratory, fournit des interfaces C ++ orientées objet pour les matrices denses et clairsemées via son composant Epetra et des interfaces modélisées pour les matrices denses et clairsemées via son composant Tpetra. Il comporte également des composants fournissant des fonctionnalités de résolution linéaire et de résolution propre. La documentation ne semble pas être aussi raffinée ni aussi visible que PETSc; Trilinos ressemble à l'analogue Sandia de PETSc. PETSc peut appeler certains des solveurs Trilinos. Les fichiers binaires pour Trilinos sont disponibles pour Linux.

Blitz est une bibliothèque C ++ orientée objet qui comporte des binaires Linux. Elle ne semble pas être activement maintenue (2012-06-29: une nouvelle version vient de paraître hier!), Bien que la liste de diffusion soit active, il y a donc une communauté qui l'utilise. Il ne semble pas que l'algèbre linéaire numérique soit très efficace au-delà de BLAS et ressemble à une bibliothèque matricielle dense. Il utilise des modèles.

Boost :: uBLAS est une bibliothèque orientée objet C ++ qui fait partie du projet Boost. Il prend en charge l'algèbre linéaire numérique modèle et dense. J'ai entendu dire que ce n'est pas particulièrement rapide.

Le modèle Numerical Toolkit est une bibliothèque orientée objet C ++ développée par NIST. Son auteur, Roldan Pozo, semble contribuer occasionnellement aux correctifs, mais il ne semble plus être en développement actif (la dernière mise à jour date de 2010). Il se concentre sur l'algèbre linéaire dense et fournit des interfaces pour certaines décompositions matricielles de base et un résolveur de valeurs propres.

Elemental , développé par Jack Poulson, est un progiciel d'algèbre linéaire dense à mémoire distribuée (parallèle) écrit dans un style similaire à FLAME . Pour une liste des fonctionnalités et du contexte du projet, consultez sa documentation . FLAME lui-même a une bibliothèque associée pour l'algèbre linéaire dense séquentielle et à mémoire partagée, appelée libflame , qui semble être écrite en C. orienté objet. Libflame ressemble beaucoup à LAPACK, mais avec une meilleure notation sous-jacente aux algorithmes permettant le développement de bibliothèques d'algèbre linéaire plus d'une science et moins d'un art noir.

Il existe d'autres bibliothèques qui peuvent être ajoutées à la liste. si nous comptons les paquets algébriques linéaires clairsemés comme des "bibliothèques de matrices", le meilleur que je connaisse en C est SuiteSparse , qui est programmé dans un style orienté objet. J'ai utilisé SuiteSparse et l'ai trouvé assez facile à prendre en main. cela dépend de BLAS et de LAPACK pour certains des algorithmes qui décomposent des problèmes épars en beaucoup de sous-problèmes d'algèbre linéaire petits et denses. L'auteur principal de la trousse, Tim Davis, est incroyablement serviable et polyvalent.

Les bibliothèques de sous-routines Harwell sont célèbres pour leurs routines d'algèbre linéaire éparses et sont gratuites pour les utilisateurs académiques, bien que vous deviez suivre ce processus consistant à remplir un formulaire et à recevoir un e-mail pour chaque fichier à télécharger. Comme les sous-routines ont souvent des dépendances, l’utilisation d’un résolveur peut nécessiter le téléchargement de cinq ou six fichiers, et le processus peut s'avérer fastidieux, d’autant plus que l’approbation du formulaire n’est pas instantanée.

Il existe également d'autres solutions simples à l'algèbre linéaire, mais pour autant que je sache , MUMPS et d'autres packages sont principalement dédiés à la solution de systèmes linéaires, et la résolution de systèmes linéaires est la moindre de mes préoccupations pour le moment. (Peut-être que plus tard, j'aurai besoin de cette fonctionnalité, qui pourrait être utile pour d'autres.)


2
Je pense que vous avez confondu Eigen avec Elemental; Je n'ai pas travaillé sur Eigen, même si je suis très impressionné par le projet. Elemental cible principalement les machines à mémoire distribuée.
Jack Poulson

3
Je suppose que ma première question serait: Voulez-vous jamais exécuter quelque chose en parallèle?
Matt Knepley

1
Je devrais mentionner Trilinos ... bien qu’il n’ait pas beaucoup de visibilité ici, c’est une alternative viable à PETSc, avec un package matriciel basé sur un modèle, un eigensolver et un solveur matriciel éparse, il contient également un package. destiné spécifiquement à résumer la comptabilité d'un algorithme, bien que je ne sache pas si cela fonctionne bien.
Andrew Spott

1
Eigen semble génial - un de mes collègues l'a utilisé dans un contexte professionnel et peut vous permettre de fonctionner rapidement, sans sacrifier la performance.
qdot

7
Je voudrais également ajouter les bibliothèques suivantes à votre réponse: ViennaCL - Bibliothèque d’en -têtes C ++ basée sur OpenCL pouvant s’interfacer avec Eigen et MTL. PLASMA - une refonte basée sur UTK des bibliothèques BLAS et LAPACK comportant des décompositions basées sur des tuiles. MAGMA - un autre projet UTK qui vise à améliorer les performances de LAPACK / BLAS.
Aron Ahmadia

24

Ce document a été rédigé en mars 2009 pour faciliter le choix d’une bibliothèque d’algèbre linéaire pour une bibliothèque scientifique. Il évalue la portabilité, l'interface de haut niveau et les licences de plusieurs bibliothèques, parmi lesquelles Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos et uBlas. Il semble aimer particulièrement Flens et Seldon . (L'une des conditions était que les modèles C ++ et les matrices creuses devaient être pris en charge.)


17

Parmi tous les projets énumérés ci-dessus, seuls deux poids lourds extrêmement utilisés (et pour de bonnes raisons): PETSc et Trilinos. Les deux sont développés professionnellement et ont une grande base de développeurs. Tous les autres projets sont plutôt petits comparés à ces deux projets, et je recommanderais de les accompagner car (i) ils seront pris en charge pendant longtemps et (ii) ils auront probablement déjà toutes les fonctionnalités dont vous aurez besoin concernant algèbre linéaire (et bien plus encore).


4
PETSc ne propose pas beaucoup plus qu'une interface légèrement abstraite pour ScaLAPACK et PLAPACK. Si Geoff est intéressé par l'algèbre linéaire dense et commode, je pense que PETSc est excessif (je ne connais pas assez les capacités denses de Trilinos pour commenter)
Aron Ahmadia

@AronAhmadia: À ce stade, je pense que la réponse est devenue une ressource wiki de communauté, c'est pourquoi j'ai ajouté des packages à la demande de commentateurs.
Geoff Oxberry

3
@WolfgangBangerth: Je pense qu'il est important de mentionner les objectifs de conception. Si l'objectif est d'écrire un logiciel durable et destiné à être utilisé par d'autres, et que l'algèbre linéaire en fait partie intégrante, alors PETSc et Trilinos sont de bons choix. Cependant, il existe des cas où des options plus légères sont préférables et utiles, car elles ont des API plus simples et peuvent accomplir presque la même tâche avec moins de lignes de code. Enfin, le biais de sélection joue un rôle dans la survie des codes. Si personne n'utilise les codes plus petits, ils ne dureront pas et ne constitueront pas une base comme PETSc et Trilinos.
Geoff Oxberry

1
Pour ajouter à ce que Geoff a dit, la grande majorité des fonctionnalités de PETSc et Trilinos provient d'encapsuleurs autour de bibliothèques externes. Dire que personne ne devrait utiliser lesdites bibliothèques externes me semble étrange.
Jack Poulson

1
@ JackPoulson: Je maintiens mon commentaire. Oui, PETSc encapsule beaucoup de paquets individuels. Mais il le fait avec une interface uniforme et il est donc plus simple d’apprendre cela une fois que de devoir apprendre les particularités de la convention et du style de nommage de chaque paquet. En d'autres termes, bien que chaque projet individuel puisse également bien utiliser les packages emballés, il existe une synergie qui résulte de leur utilisation à travers PETSc à chaque fois.
Wolfgang Bangerth le

11

Si tu veux

  • Classes matricielles avec une interface intuitive
  • Toutes les fonctionnalités de LAPACK et BLAS
  • Facile à apprendre et à utiliser l'API
  • Facile à installer

Ensuite, je vous recommande de regarder ma bibliothèque FLENS . Je l'ai conçu pour exactement ce genre de tâches. Cependant, il nécessite un compilateur conforme à C ++ 11 (par exemple, gcc 4.7 ou clang).

FLENS vous offre exactement les mêmes performances que l’implémentation BLAS sous-jacente. Quelques repères (plutôt anciens) montrent cela

La même chose peut être dite à propos de FLENS-LAPACK, il vous donne simplement les mêmes performances que LAPACK de Netlib si la même implémentation BLAS est utilisée.

En ce qui concerne les nouveaux points de repère, permettez-moi d'entrer plus dans les détails ...

Il y a quelque temps, j'ai demandé à Clint Whaley (l'auteur d'ATLAS) ce qu'il pensait des indices de référence publiés sur le site Eigen. Il vient de confirmer mon soupçon que ces repères ne sont probablement pas fiables. Entre-temps, d'autres repères réalisés, comme Clint l'a suggéré. Les détails peuvent être trouvés sur le site ATLAS et la liste de diffusion Eigen. Les repères ne sont pas bien présentés dans les graphiques, mais ils montrent qu'ATLAS est toujours environ 40% plus rapide que Eigen. Cela contredit les repères du site Eigen mais confirme d’autres repères (par exemple ceux de blaze-lib).

Notez que pour l'algèbre linéaire numérique dense, les produits matrice-matrice sont les plus pertinents. Personnellement, je me fiche de savoir si Eigen ou ATLAS est plus rapide. Si Eigen était plus rapide que ATLAS, j'utiliserais alors Eigen comme BLAS-backend.

Disclaimer: Oui, FLENS est mon bébé! Cela signifie que j'en ai codé environ 95% et que chaque ligne de code en valait la peine :-)


Bonjour Michael, bienvenue dans Scicomp. Votre URL ne fonctionne pas pour moi, y a-t-il un problème avec votre serveur?
Aron Ahmadia

Merci pour l'allusion. L'URL est correcte mais il semble que le service de mathématiques pose un problème avec le serveur de fichiers. Juste à temps pour le week-end ...
Michael Lehn

1
Ok, je viens de créer une nouvelle documentation à partir du dépôt Git
Michael Lehn le



1

Quelle serait la meilleure bibliothèque de matrices pour traiter les matrices de petite taille, couramment utilisées, par exemple, lors de l’assemblage de matrices à éléments finis, pour effectuer des opérations de tenseur, etc.

J'utilise déjà PETSc pour la solution des grands systèmes linéaires clairsemés apparaissant dans mon application, mais j'utilise actuellement ma propre bibliothèque simple pour gérer ces matrices / vecteurs ... J'envisage de passer à une bibliothèque plus rapide. comme ceux mentionnés ci-dessus.

Quel serait le meilleur choix de coupler avec PETSc? Eigen? Tatou? BOOST :: uBlas? MTL4? J'utilise certaines choses de BOOST, alors, j'ai d'abord pensé à utiliser BOOST :: uBlas, mais il n'y a pas beaucoup de documentation, d'exemples, etc.


2
Je recommande fortement de ne pas utiliser uBlas, car il est connu pour être d'un ordre de grandeur plus lent que les routines BLAS optimisées. Je pense que Eigen brille le plus pour les très petites matrices en raison d’astuces astucieuses.
Jack Poulson

1
C'est probablement mieux pour une question distincte. Je sais que Eigen, MTL4 et Armadillo ont tous des astuces pour résoudre des systèmes de petite taille, mais je pense que vous demandez comment assembler des matrices, et pour cela, je ne sais pas. J'assemble généralement des matrices élément par élément. Je ne suis pas sûr que les bibliothèques mentionnées soient bonnes à coupler avec PETSc; Je ne suis pas encore un utilisateur PETSc. Je partage le commentaire de Jack à propos de Boost :: uBlas, car il est lent.
Geoff Oxberry


0

Surpris, personne n'a encore mentionné TooN . Je l'utilise avec bonheur depuis presque 3 ans maintenant.

C'est très similaire à Eigen mais pas aussi complet. Cependant, je pense qu'il a la syntaxe plus agréable à certains égards.

Il est également fourni avec des classes permettant de modéliser les transformations courantes fréquemment rencontrées dans Graphics et Vision, en fonction des groupes de Lie (spécial euclidien / orthogonal en 2 et 3 dimensions, etc.) et des algèbres de Lie associées.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.