Recommandations pour un solveur d'algèbre linéaire dense / sans installation basé sur C ou C ++

9

La plupart de mes programmes sont des codes de recherche uniques en C pour mon propre usage. Je n'ai jamais distribué de code à des collaborateurs proches. J'ai développé un algorithme que je publie dans une revue scientifique. Je veux fournir le code source et peut-être le code exécutable dans le supplément en ligne de l'article. Un collègue m'a demandé de faire une généralisation à l'algorithme qui m'a obligé à écrire en C ++ (ack!) Et qui nécessite de résoudre de petits systèmes linéaires denses. Si je réussis à obtenir une base d'utilisateurs pour l'algorithme, ce sera en partie parce que la barre d'entrée pour l'utiliser est faible (comme au sol). Les utilisateurs potentiels n'installeront pas de bibliothèques, etc. pour utiliser le code. Je veux que le code soit entièrement autonome et libre de toute licence. Je pourrais simplement écrire mon propre solveur en retirant quelque chose de Golub et van Loan mais je préfère utiliser un solveur vanille que quelqu'un d'autre a déjà écrit s'il y en a. Suggestions appréciées. Merci!

jep
la source
Cher jep, bienvenue sur le forum. Votre question est très similaire à celle ici: scicomp.stackexchange.com/questions/351/…
GertVdE
Les solveurs de bibliothèque ont tendance à être complexes et volumineux pour des raisons de robustesse, d'efficacité et de généralité. Si vos problèmes sont très petits et raisonnablement bien conditionnés, je vous suggère d'écrire votre propre mini-implémentation.
Stefano M
@GertVdE, merci pour la réponse rapide à cette question. Je suis mal à l'aise de faire le lien avec la question "Recommandations ..." car la question et la réponse du haut sont trop générales pour fournir une aide dans des situations comme celles-ci. Si vous souhaitez en discuter davantage, je vous suggère de l'emmener dans la salle de chat scicomp .
Aron Ahmadia
@AronAhmadia: Je pense que la seule façon de commencer à régler certains de ces débats est de commencer à implémenter une chrestomathie de programmation en science informatique qui dépend à la fois du langage et de la bibliothèque. Si le code est clair et que les problèmes de configuration peuvent être résolus (en utilisant un script shell, Chef ou Puppet), les débats sur les performances peuvent être traités (ou concrétisés) en exécutant simplement le code et en le chronométrant sur un machine de référence. Les débats sur la clarté peuvent être résolus (ou du moins, rendus plus concrets) en consultant le code. Sinon, nous continuerons d'avoir les mêmes arguments.
Geoff Oxberry

Réponses:

7

Je suggérerais de dupliquer exactement l'interface Lapack avec la fonction dont vous avez besoin, probablement vous avez juste besoin dgesv. De cette façon, les personnes qui ont installé Lapack peuvent simplement s'y connecter et cela fonctionnera simplement. Pour les personnes qui n'ont pas installé Lapack, vous fournissez votre propre implémentation simple de cette fonction, ou éventuellement l'implémentez en utilisant Eigen ou FLENS comme d'autres l'ont suggéré.

Dans le pays de Fortran, la bibliothèque Lapack est un tel standard, que la plupart des gens l'utilisent simplement et c'est tout, au lieu de fournir leurs propres implémentations.

Ondřej Čertík
la source
+1 Ajoutez à cela le fait que la plupart des distributions Linux (au moins basées sur Debian) ont des paquets binaires dans le référentiel et que toutes les bibliothèques mathématiques fournies par le fournisseur (MKL, SunPerf, ACML, ESSL etc.) le portent. Vous devriez toujours utiliser des bibliothèques standard autant que possible, mais si vous êtes sur Windows / Mac, vous pourriez être mieux avec quelque chose basé sur C, car l'installation d'un compilateur Fortran gratuit (gfortran) sur eux est une certaine quantité de travail ou du moins j'ai entendu dire.
stali
J'ai utilisé lapack plusieurs fois mais je ne suis pas actuellement en fortran land. Je m'attends à ce que la distribution statistique des plates-formes sur lesquelles ma base d'utilisateurs fonctionne soit similaire à celle du monde en général, ce qui signifie principalement les fenêtres, un pourcentage plus faible de macs et un pourcentage encore plus petit de * nix. Mon expérience avec Windows est minime et je préfère que cela reste ainsi. C'est la raison pour laquelle je veux un code C ++ autonome. Je pense que je vais devoir aider certains de mes utilisateurs à obtenir le code à compiler et à exécuter. Je dois minimiser le travail requis pour ce faire.
2012
Si votre base d'utilisateurs est Windows / Mac, vous êtes mieux avec une implémentation simple basée sur C (peut-être même la vôtre). Un paquet qui est difficile à installer ou qui dépend de 5 autres bibliothèques, spécialement quand il n'y a pas de référentiel de paquet binaire de première classe (comme Debian), arrêtera vos utilisateurs pendant longtemps. N'oubliez pas que la plupart des utilisateurs de Windows / Mac sont habitués à l'installation en un clic. La facilité d'utilisation l'emporte sur tout le reste.
stali
5

Une erreur très précoce que beaucoup de gens commettent en se lançant dans l'informatique scientifique suppose que vous devez écrire tout votre code dans le même langage. Je pense que cela est dû en grande partie à des raisons historiques, quand il n'était pas clair comment faire communiquer les programmes compilés entre eux à travers des versions paires du même compilateur. Cela dit, dans ce cas, si vous utilisez de toute façon C ++, il existe plusieurs très bonnes bibliothèques de modèles en-tête C ++ qui pourraient répondre à vos besoins.

Comme vous distribuez votre code pour des raisons académiques et que vous souhaitez intégrer un solveur d'algèbre linéaire dense dans votre code, je vous recommande fortement de considérer Eigen . Eigen est sous licence Mozilla Public License et est une bibliothèque uniquement en-tête. Cela signifie que vous pouvez distribuer Eigen avec votre code sous forme source (cela n'impose aucune restriction de licence à votre code) et vous aurez accès à ses capacités générales, y compris des solveurs linéaires denses extrêmement efficaces. Comme le mentionne GertVdE, vous avez plusieurs autres options .

Aron Ahmadia
la source
J'espérais un seul fichier. Je fais de la programmation scientifique depuis un bon moment. J'ai un peu de langages mixtes comme C et fortran mais pour ce projet, je veux vraiment juste un fichier contenant tout mon code source. Je suppose que je pourrais mettre un solveur C dans le code C ++ qui ne serait pas un gros problème. Je veux surtout garder le code aussi simple que possible. LU avec pivotement devrait être adéquat. Je vais regarder Eigen. Merci!
2012
@jep, vous pouvez également essayer de choisir les routines dont vous avez besoin dans CLAPACK si vous ne vous souciez pas du tout des performances.
Aron Ahmadia
Il y a de bonnes raisons d'écrire tout le code dépendant dans le même langage, en particulier dans les environnements HPC, vous avez des problèmes de compilation / liaison étranges et des problèmes d'interface 32/64 bits. Par exemple, comment puis-je connaître la largeur d'un entier pour les bibliothèques intégrées? Comment savoir avec certitude quel compilateur a été utilisé pour une bibliothèque intégrée et puis-je établir un lien avec celle-ci avec cet autre compilateur? Tout avoir dans une seule langue simplifie bon nombre de ces problèmes. Et oui, il devrait y avoir de la documentation fournie par les mainteneurs du cluster, mais la plupart du temps ce n'est pas le cas.
Victor Liu
@VictorLiu - Les problèmes auxquels vous faites référence sont plus étroitement liés aux implémentations qu'aux langages. L'espace de commentaires est un mauvais endroit pour entamer une discussion sérieuse, mais je suis heureux de vous engager dans un chat ou ailleurs si vous souhaitez que j'élargisse mes réflexions à ce sujet.
Aron Ahmadia
4

Si vous voulez un solveur fiable pour les systèmes d'équations linéaires, je recommanderais FLENS . Il contient une réimplémentation exacte de LAPACK (il reproduit même les mêmes erreurs d'arrondi que LAPACK si une implémentation BLAS à un seul thread est utilisée). Cela est vrai pour toutes les fonctions FLENS-LAPACK (avec les fonctions utilitaires environ 100 routines).

FLENS est sous licence BSD et permet donc d'être intégré dans des produits propriétaires.

FLENS est uniquement en-tête et si vous n'avez besoin que d'un sous-ensemble de FLENS, je peux vous donner une version allégée contenant uniquement les fonctions dont vous avez besoin. FLENS est livré avec sa propre implémentation BLAS de référence. Mais en option, vos utilisateurs peuvent se lier à des bibliothèques BLAS optimisées comme ATLAS, OpenBLAS ou GotoBALS. Pour les grandes matrices, cela donne un gain de performances d'environ 40% par rapport à Eigen.

Et oui, Eigen utilise également la suite de tests LAPACK pour vérifier leurs résultats. Ils le font pour 3 fonctions (Lu, Cholesky et Eigenvalues ​​/ -vectors d'une matrice symétrique). Cependant, leur calcul des valeurs / vecteurs propres d'une matrice non symétrique échouerait à la suite de tests LAPACK.

Avertissement: 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.

Michael Lehn
la source
1
Michael - Veuillez considérer cela comme un avertissement amical selon lequel vous devez suivre la règle de la FAQ concernant la divulgation de l'affiliation .
Aron Ahmadia
Bien sûr, mais vous pouvez également reformuler vos messages de "Je vous recommande fortement de considérer Eigen" en quelque chose comme "il y a par exemple Eigen". Dans ce cas, je supprime mes remarques sur Eigen (bien qu'elles se soient toutes avérées vraies), y compris celle-ci.
Michael Lehn
1
Vos remarques sur Eigen ne sont pas en cause ici (bien qu'elles me semblent hors sujet). Vous êtes un développeur principal de FLENS, si vous allez le recommander dans une réponse ici, vous devez divulguer votre affiliation en tant que développeur du projet.
Aron Ahmadia
Ah, ok alors. Je pensais que c'était implicitement clair par '... je peux vous donner ...'. La divulgation sous cette forme est-elle correcte?
Michael Lehn
2
Je veux juste dire merci pour cela; J'avais des plans similaires pour réimplémenter une grande partie de Lapack en C ++. Cependant, il semble que pour la plupart des routines avancées (valeurs propres), vous vous contentez de faire appel à Lapack, c'est donc un peu de fausse publicité de dire que vous réimplémentez le tout. D'un autre côté, j'ai en fait porté la source ZGEEV sur C ++ en RNP , bien que certaines parties soient toujours en indexation 1 à partir de la conversion automatique.
Victor Liu