172 votes

Quelle est la relation entre BLAS, LAPACK et ATLAS ?

Je ne comprends pas comment BLAS, LAPACK et ATLAS sont liés et comment je dois les utiliser ensemble ! J'ai parcouru tous leurs manuels et j'ai une idée générale de BLAS et de LAPACK et de la façon de les utiliser avec les quelques exemples que j'ai trouvés, mais je ne trouve aucun exemple réel utilisant ATLAS pour voir comment il est lié à ces deux-là.

J'essaie de faire du travail de bas niveau sur des matrices et mon langage principal est le C. Je voulais d'abord utiliser GSL, mais il est dit que si vous voulez les meilleures performances, vous devez utiliser BLAS et ATLAS. Existe-t-il une bonne page Web qui donne de bons exemples de la façon d'utiliser ces outils (en C) ensemble ? En d'autres termes, je cherche un tutoriel sur l'utilisation de ces trois outils (ou n'importe quel sous-ensemble d'entre eux !). En bref, je suis perdu !

183voto

Stephen Canon Points 58003

BLAS est une collection d'opérations arithmétiques matricielles et vectorielles de bas niveau ("multiplier un vecteur par un scalaire", "multiplier deux matrices et ajouter à une troisième matrice", etc ...).

LAPACK est une collection d'opérations d'algèbre linéaire de haut niveau. Des choses comme les factorisations de matrices (LU, LLt, QR, SVD, Schur, etc.) qui sont utilisées pour faire des choses comme "trouver les valeurs propres d'une matrice", ou "trouver les valeurs singulières d'une matrice", ou "résoudre un système linéaire". LAPACK est construit sur la base de BLAS ; de nombreux utilisateurs de LAPACK seulement utiliser les interfaces LAPACK et ne jamais avoir besoin de connaître la BLAS. LAPACK est généralement compilé séparément du BLAS, et peut utiliser toute implémentation hautement optimisée du BLAS dont vous disposez.

ATLAS est une implémentation portable raisonnablement bonne des interfaces BLAS, qui implémente également quelques-unes des opérations LAPACK les plus couramment utilisées.

Ce que "vous devriez utiliser" dépend quelque peu des détails de ce que vous essayez de faire et de la plate-forme que vous utilisez. Vous ne vous tromperez pas trop en disant "utilisez ATLAS + LAPACK", cependant.

56voto

Foad Points 1475

Il y a longtemps, quand j'ai commencé à faire de l'algèbre linéaire en C j'ai été surpris de constater qu'il y avait si peu de tutoriels pour BLAS , LAPACK et d'autres éléments fondamentaux API malgré le fait qu'ils sont en quelque sorte les pierres angulaires de nombreuses autres bibliothèques. C'est pour cette raison que j'ai commencé à collecter tous les exemples/tutoriels que je pouvais trouver partout sur internet pour BLAS , CBLAS , LAPACK , CLAPACK , LAPACKE , ATLAS , OpenBLAS ... en ce dépôt Github .

Je dois vous prévenir qu'en tant qu'ingénieur en mécanique, j'ai peu d'expérience dans la gestion d'un tel dépôt git ou GitHub. Cela vous paraîtra d'abord comme un désordre complet. Cependant, si vous parvenez à surmonter cette structure désordonnée, vous trouverez toutes sortes d'exemples et d'instructions qui pourraient vous être utiles. J'ai essayé la plupart d'entre eux, pour être sûr qu'ils compilent. Et ceux qui ne compilent pas, je les ai mentionnés. J'ai modifié beaucoup d'entre eux pour qu'ils soient compilables avec GNU compilers ( gcc , g++ y gfortran ). J'ai fait MakeFile que vous pouvez lire afin d'apprendre comment vous pouvez appeler des Fortran/FORTRAN routines dans un C o C++ programme. J'ai aussi mis des instructions d'installation pour mac et linux (désolé les gars de Windows !). J'ai aussi fait quelques bash .sh pour la compilation automatique de certaines de ces bibliothèques.

Mais pour en revenir à votre autre question : BLAS y LAPACK sont plutôt API s non spécifique SDK s. Ils ne sont qu'une liste de spécifications ou d'extensions de langage plutôt que des implémentations ou des bibliothèques. Cela dit, il existe des implémentations originales par Netlib en FORTRAN 77 à laquelle la plupart des gens se réfèrent (de manière confuse !) lorsqu'ils parlent de l'UE. BLAS y LAPACK . Donc, si vous voyez beaucoup de choses étranges lorsque vous utilisez ces API c'est parce que vous appeliez en fait FORTRAN routines dans C plutôt que C les bibliothèques et les fonctions. ATLAS y OpenBLAS sont parmi les meilleures mises en œuvre de BLAS y LACPACK pour autant que je sache. Ils sont conformes à l'original API même si, à ma connaissance, ils sont implémentés sur C/C++ à partir de zéro (je ne suis pas sûr !). Il existe des implémentations GPGPU de la fonction API s en utilisant OpenCL : CLBlast , clBLAS , clMAGMA , ArrayFire y VienneCL pour en citer quelques-uns. Il existe également des implémentations spécifiques aux fournisseurs, optimisées pour un matériel ou une plate-forme spécifique, et je déconseille fortement à quiconque de les utiliser.

Je recommande à tous ceux qui veulent apprendre à utiliser BLAS y LAPACK en C est d'apprendre FORTRAN-C la programmation mixte d'abord. Le premier chapitre du repo mentionné est consacré à cette question et j'y ai rassemblé de nombreux exemples différents.

P.S. J'ai travaillé sur la branche dev du référentiel de temps en temps. C'est un peu moins salissant !

35voto

ATLAS est maintenant assez dépassé. Il a été développé à une époque où l'on pensait que l'optimisation du BLAS pour diverses plates-formes était au-delà des capacités humaines, et que par conséquent l'autogénération et l'autotuning étaient la voie à suivre.

Au début des années 2000, Kazushige Goto a montré qu'il était possible de coder manuellement des implémentations très efficaces. Vous apprécierez peut-être un article intéressant du New York Times : https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human-computer-keeps.html .

D'une part, Kazushige avait une meilleure compréhension de la théorie qui sous-tend les implémentations hautes performances de la multiplication matricielle, et d'autre part, il les a mieux conçues. Son approche, qui sur les CPU actuels est généralement la plus performante, n'est pas dans l'espace de recherche qu'ATLAS autotune. Par conséquent, ATLAS est intrinsèquement inférieur. La mise en œuvre du BLAS par Kazushige est connue sous le nom de GotoBLAS. Elle a été bifurquée en OpenBLAS lorsqu'il a rejoint l'industrie.

Les idées à la base de GotoBLAS ont été refactorisées dans une nouvelle implémentation, le cadre BLIS (Library Instantiation Software) de type BLAS ( https://github.com/flame/blis ), qui met en œuvre les mêmes algorithmes, mais structure le code de manière à ce qu'il soit moins nécessaire de l'adapter à une nouvelle architecture. BLIS est codé en C.

Ce que cette discussion montre, c'est qu'il existe de nombreuses implémentations de la BLAS. Les BLAS eux-mêmes constituent une norme de facto pour l'interface. ATLAS était autrefois l'état de l'art. Il ne l'est plus.

4voto

makhlaghi Points 581

J'ai cherché et je n'ai trouvé que ces deux pages web avec quelques exemples simples. J'aimerais que plus de personnes ajoutent des exemples de codes pour utiliser ces bibliothèques.

http://www.seehuhn.de/pages/linear

http://www.lindonslog.com/programming/atlas-blas-lapack-linear-algebra-libraries/

0voto

cdcdcd Points 438

Pour autant que je sache, et après avoir travaillé sur le dépôt ATLAS, il semble qu'il comprenne une réimplémentation de BLAS en C. Il y a un peu plus que cela, mais j'espère que cela répond à la question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X