Quelle est la relation entre BLAS, LAPACK et ATLAS

143

Je ne comprends pas comment BLAS, LAPACK et ATLAS sont liés et comment je devrais les utiliser ensemble! J'ai parcouru tous leurs manuels et j'ai une idée générale de BLAS et LAPACK et comment les utiliser avec les très rares exemples que je trouve, mais je ne trouve pas d'exemples réels utilisant ATLAS pour voir comment cela est lié à ces deux.

J'essaie de faire un travail de bas niveau sur les matrices et mon langage principal est C. Premièrement, je voulais utiliser GSL, mais il dit que si vous voulez les meilleures performances, vous devez utiliser BLAS et ATLAS. Existe-t-il une bonne page Web donnant de beaux exemples sur la façon de les utiliser (en C) ensemble? En d'autres termes, je recherche un tutoriel sur l'utilisation de ces trois (ou de n'importe quel sous-ensemble d'entre eux!). Bref je suis confus!

makhlaghi
la source
3
Voir aussi scicomp.stackexchange.com/questions/8052/…
High Performance Mark

Réponses:

156

BLAS est un ensemble d'opérations arithmétiques vectorielles et matricielles 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 plus haut niveau. Des choses comme les factorisations matricielles (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 le BLAS; de nombreux utilisateurs de LAPACK n'utilisent les interfaces LAPACK et jamais besoin d'être au courant des BLAS du tout. LAPACK est généralement compilé séparément du BLAS et peut utiliser n'importe quelle implémentation BLAS hautement optimisée 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. Cependant, vous n'allez pas trop vous tromper avec «utiliser ATLAS + LAPACK».

Stephen Canon
la source
Merci pour les explications. Connaissez-vous des exemples d'utilisation d'ATLAS + LAPACK? J'ai besoin de voir quelques exemples pour comprendre comment les utiliser! Je comprends à quoi ils servent et la théorie de ce qu'ils font, mais je ne trouve guère d'exemples en C sur la façon de les mettre en pratique.
makhlaghi
1
@astroboy: pouvez-vous me donner des informations sur ce que vous essayez réellement de faire? LAPACK est en particulier une énorme bibliothèque.
Stephen Canon
Pour simplifier, disons que j'ai une matrice et que je veux la multiplier par une certaine valeur. Comment puis-je faire cela en combinant ATLAS et (LAPACK ou BLAS) en C? Je veux juste voir comment implémenter l'une de ces fonctions. Il y a quelques exemples dans netlib.org/lapack/lapacke.html mais il n'y a aucune mention d'ATLAS!
makhlaghi
Y a-t-il quelque chose comme BLAS, LAPACK ou MKL capable de travailler de manière transparente avec des objets beaucoup plus grands que la mémoire?
skan le
1
@ MinhNghĩa: Il existe un standard, netlib.org/blas/blast-forum , mais (a) il n'y a pas d'application - un standard sans suite de tests n'est pas vraiment un standard - et (b) je ne pense pas que n'importe qui implémente l'ensemble complet des interfaces décrites par ce document. C'est, euh, ambitieux.
Stephen Canon
40

Alors qu'il ya, quand je commencé à faire l' algèbre linéaire C, il est venu à moi comme une surprise de voir qu'il ya si peu de tutoriels pour BLAS, LAPACKet d' autres fondamentaux APIs, en dépit du fait qu'ils sont en quelque sorte la pierre angulaire de nombreuses autres bibliothèques. Pour cette raison , j'ai commencé à recueillir tous les exemples / tutoriels que je pourrais trouver tout sur Internet pour BLAS, CBLAS, LAPACK, CLAPACK, LAPACKE, ATLAS, OpenBLAS... dans ce repo Github .

Eh bien, je dois vous avertir qu'en tant qu'ingénieur en mécanique, j'ai peu d'expérience dans la gestion d'un tel référentiel git ou GitHub. Cela vous semblera d'abord un gâchis complet. Cependant, si vous parvenez à surmonter la structure désordonnée, vous trouverez toutes sortes d'exemples et d'instructions qui pourraient ê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 être compilables avec GNU compilers( gcc, g++et gfortran). J'ai créé des MakeFiles que vous pouvez lire pour savoir comment appeler des Fortran/FORTRANroutines individuelles dans un programme Cor C++. J'ai également mis quelques instructions d'installation pour Mac et Linux (désolé les gars de Windows!). J'en ai aussi faitbash .sh fichiers pour la compilation automatique de certaines de ces bibliothèques.

Mais pour revenir à votre autre question: BLASet ne LAPACKsont APIpas des SDKarticles spécifiques . Ce 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 de Netlib dans FORTRAN 77, auxquelles la plupart des gens se réfèrent (de manière déroutante!) Lorsqu'ils parlent de BLASet LAPACK. Donc, si vous voyez beaucoup de choses étranges lorsque vous utilisez ces APIs, c'est que vous FORTRANappeliez en fait des routines Cplutôt que des Cbibliothèques et des fonctions. ATLASet OpenBLASsont quelques-unes des meilleures implémentations de BLASet LACPACKpour autant que je sache. Ils sont conformes à l'original API, même si, à ma connaissance, ils sont mis en œuvre surC/C++à partir de zéro (pas sûr!). Il existe des implémentations GPGPU des APIs utilisant OpenCL: CLBlast , clBLAS , clMAGMA , ArrayFire et ViennaCL pour n'en citer que quelques-unes. Il existe également des implémentations spécifiques aux fournisseurs optimisées pour un matériel ou une plate-forme spécifique, que je déconseille fortement à quiconque de les utiliser.

Ma recommandation à tous ceux qui veulent apprendre à utiliser BLASet LAPACKen Cest d'apprendre d' FORTRAN-Cabord la programmation mixte. Le premier chapitre du repo mentionné est consacré à cette question et j'y ai rassemblé de nombreux exemples différents.

PS J'ai travaillé de temps en temps sur la branche dev du référentiel . Cela semble un peu moins salissant!

Foad
la source
La page Wikipedia pour LAPACK commence par "LAPACK (Linear Algebra Package) est une bibliothèque de logiciels standard". Êtes-vous en train de dire que c'est incorrect, puisqu'il s'agit d'une spécification d'API et non d'une implémentation?
Noah_S
1
Après quelques recherches, il semble que LAPACK et BLAS sont en fait des implémentations. De la FAQ de NetLib sur BLAS: "Les BLAS (Basic Linear Algebra Subprograms) sont des routines qui fournissent des blocs de construction standard pour effectuer des opérations vectorielles et matricielles de base". Depuis la page GitHub de LAPACK: "LAPACK est une bibliothèque de sous-programmes Fortran". Sur cette base, et en lisant le projet GitHub de LAPACK, j'ai l'impression que BLAS et LAPACK sont en fait des implémentations - LAPACK s'appuie sur BLAS pour fournir des fonctionnalités plus sophistiquées.
Noah_S
1
@Noah_S Je n'utiliserais pas Wikipédia comme "la" référence, mais à ma connaissance limitée, il existe plusieurs implémentations de LAPACK. Je pense que l'appeler une API est plus précis maintenant. mais corrigez-moi si je me trompe.
Foad
2
Je pense qu'une partie de la confusion vient du fait que BLAS est une API / spécification, mais il existe également une «implémentation de référence» de BLAS (de Netlib) qui est également appelée simplement «bibliothèque BLAS». Habituellement, lorsque les gens disent BLAS, ils parlent de l'API, car l'implémentation de référence n'est pas optimisée, elle n'est donc pas beaucoup utilisée dans la pratique / l'industrie. ATLAS fournit une implémentation optimisée de quelques-uns des sous-programmes LAPACK, puis extrait éventuellement le reste d'entre eux de LAPACK lui-même pour produire une implémentation complète de LAPACK dans les fichiers lib ATLAS construits.
Andrew Janke
1
@Noah_S Il n'y a pas de contradiction, chaque bibliothèque possède une API, qui permet de réimplémenter la fonctionnalité réelle tout en restant compatible avec l'API et c'est ce qui s'est passé avec LAPACK.
Andrey
17

ATLAS est désormais assez obsolète. Il a été développé à une époque où l'on pensait que l'optimisation du BLAS pour diverses plates-formes était au-delà de la capacité des humains, et par conséquent, l'autogénération et l'autoréglage étaient la voie à suivre.

Au début des années 2000, est arrivé Kazushige Goto, qui a montré à quel point des implémentations très efficaces peuvent être codées à la main. Vous pouvez lire un article intéressant dans le New York Times: https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human- computer-keeps.html .

Kazushige, d'une part, avait une meilleure compréhension de la théorie derrière les implémentations haute performance de la multiplication matrice-matrice, et d'autre part les a mieux conçues. Son approche, qui sur les processeurs actuels est généralement la plus performante, ne se situe pas dans l'espace de recherche qu'ATLAS effectue automatiquement. Par conséquent, ATLAS est intrinsèquement inférieur. L'implémentation du BLAS par Kazushige est devenue connue sous le nom de GotoBLAS. Il a été transformé en OpenBLAS lorsqu'il a rejoint l'industrie.

Les idées derrière le GotoBLAS ont été refactorisées dans une nouvelle implémentation, le framework BLAS-like Library Instantiation Software (BLIS) ( https://github.com/flame/blis ), qui implémente les mêmes algorithmes, mais structure le code de sorte que moins doit être mis en œuvre sur mesure pour une nouvelle architecture. BLIS est codé en C.

Ce que cette discussion montre, c'est qu'il existe de nombreuses implémentations du BLAS. Les BLAS eux-mêmes sont un standard de facto pour l'interface. ATLAS était autrefois l'état de l'art. Ce n'est plus.

Robert van de Geijn
la source
0

Autant que je sache, et après avoir travaillé sur le référentiel ATLAS, il semble qu'il inclut 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.

cdcdcd
la source