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!
Réponses:
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».
la source
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 pourBLAS
,LAPACK
et d' autres fondamentauxAPI
s, 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 pourBLAS
,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++
etgfortran
). J'ai créé desMakeFile
s que vous pouvez lire pour savoir comment appeler desFortran/FORTRAN
routines individuelles dans un programmeC
orC++
. 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:
BLAS
et neLAPACK
sontAPI
pas desSDK
articles 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 dansFORTRAN 77
, auxquelles la plupart des gens se réfèrent (de manière déroutante!) Lorsqu'ils parlent deBLAS
etLAPACK
. Donc, si vous voyez beaucoup de choses étranges lorsque vous utilisez cesAPI
s, c'est que vousFORTRAN
appeliez en fait des routinesC
plutôt que desC
bibliothèques et des fonctions.ATLAS
etOpenBLAS
sont quelques-unes des meilleures implémentations deBLAS
etLACPACK
pour autant que je sache. Ils sont conformes à l'originalAPI
, 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 desAPI
s utilisantOpenCL
: 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
BLAS
etLAPACK
enC
est d'apprendre d'FORTRAN-C
abord 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!
la source
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.
la source
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.
la source