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 de LAPACK et de la façon de les utiliser avec les très rares exemples que je trouve, mais je ne trouve aucun exemple réel utilisant ATLAS pour voir en quoi il est lié. ces deux.
J'essaie de travailler sur des matrices de bas niveau et ma langue principale est le C. Tout d'abord, je voulais utiliser GSL, mais il est dit que si vous voulez la meilleure performance, vous devez utiliser BLAS et ATLAS. Existe-t-il une bonne page Web donnant quelques exemples intéressants de la façon de les utiliser ensemble (en C)? En d'autres termes, je cherche un tutoriel sur l'utilisation de ces trois (ou de tout sous-ensemble d'entre eux!). Bref je suis confus!
BLAS est un ensemble d'opérations arithmétiques matricielles et vectorielles de bas niveau («multiplier un vecteur par un scalaire», «multiplier deux matrices et les ajouter à une troisième matrice», etc.).
LAPACK est un ensemble d'opérations d'algèbre linéaire de niveau supérieur. 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", "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 seulement / utilisent les interfaces LAPACK et n'ont jamais besoin de connaître le BLAS. LAPACK est généralement compilé séparément du BLAS et peut utiliser n'importe quelle implémentation BLAS hautement optimisée disponible.
ATLAS est une bonne implémentation portable des interfaces BLAS, qui implémente également certaines des opérations LAPACK les plus couramment utilisées.
Ce que vous devez utiliser dépend un peu des détails de ce que vous essayez de faire et de la plate-forme que vous utilisez. Vous n'allez toutefois pas vous tromper avec «utiliser ATLAS + LAPACK».
Lorsque j’ai commencé à utiliser l’algèbre linéaire dans C
, j’ai eu la surprise de constater qu’il y avait si peu de tutoriels pour BLAS
, LAPACK
et d’autres fondamentaux API
s, en dépit du fait qu’ils sont en quelque sorte les pierres angulaires de nombreuses autres bibliothèques. Pour cette raison, j'ai commencé à rassembler tous les exemples/tutoriels que je pouvais trouver partout sur Internet pour BLAS
, CBLAS
, LAPACK
, CLAPACK
, LAPACKE
, ATLAS
, OpenBLAS
... dans ce repo Github .
Eh bien, je devrais 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 semblera d’abord comme un désordre complet pour vous les gars. Cependant, si vous parvenez à surmonter la structure en désordre, vous trouverez toutes sortes d'exemples et d'instructions qui pourraient vous aider. J'ai essayé la plupart d'entre eux, pour être sûrs de les compiler. Et ceux qui ne compilent pas, j'ai mentionné. J'ai modifié beaucoup d'entre eux pour être compilables avec GNU compilers
(gcc
, g++
et gfortran
). J'ai créé MakeFile
s que vous pouvez lire pour savoir comment appeler des routines Fortran/FORTRAN
individuelles dans un programme C
ou C++
. J'ai également mis quelques instructions d'installation pour mac et linux (désolé les gars Windows!). J'ai également créé des fichiers bash
.sh
pour la compilation automatique de certaines de ces bibliothèques.
Mais passez à votre autre question: BLAS
et LAPACK
sont plutôt des API
s non spécifiques SDK
s. Ils ne sont qu'une liste de spécifications ou d'extensions de langage plutôt qu'une implémentation ou une bibliothèque. Cela dit, il y a des implémentations originales de Netlib dans FORTRAN 77
, auxquelles la plupart des gens font référence (avec confusion!) Quand on parle de BLAS
et LAPACK
. Donc, si vous voyez beaucoup de choses étranges lorsque vous utilisez ces API
s, c'est parce que vous appeliez des routines FORTRAN
dans les bibliothèques et fonctions C
plutôt que C
. ATLAS
et OpenBLAS
font partie des meilleures implémentations de BLAS
et LACPACK
pour autant que je sache. Ils sont conformes à la version originale API
, même si, à ma connaissance, ils sont implémentés dans C/C++
à partir de zéro (pas sûr!). Il existe des implémentations GPVP du API
s utilisant OpenCL
: CLBlast , clBLAS , clMAGMA , ArrayFire et ViennaCL to en mentionner quelques-uns. Il existe également des implémentations spécifiques à chaque fournisseur optimisées pour un matériel ou une plate-forme spécifique, et je déconseille fortement à quiconque de les utiliser.
Ma recommandation à quiconque voudrait apprendre à utiliser BLAS
et LAPACK
dans C
est d’apprendre FORTRAN-C
programmation mixte en premier. Le premier chapitre du rapport mentionné est consacré à cette question et j’ai rassemblé de nombreux exemples.
P.S. J'ai travaillé sur la branche dev du référentiel de temps en temps. Cela semble un peu moins compliqué!
ATLAS est maintenant tout à fait dépassé. Il a été développé à un moment où on pensait qu'optimiser le système BLAS pour différentes plates-formes dépassait les capacités de l'homme. Par conséquent, la génération et le réglage automatiques étaient la solution.
Au début des années 2000, Kazushige Goto est apparu, qui a montré comment des implémentations extrêmement 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 idée de la théorie derrière les implémentations hautes performances de la multiplication matrice-matrice et, d'autre part, les améliorait. Son approche, qui sur les processeurs actuels est généralement la plus performante, n’est pas dans l’espace de recherche d’ATLAS. Par conséquent, ATLAS est intrinsèquement inférieur. La mise en œuvre de BLAS par Kazushige est devenue connue sous le nom de GotoBLAS. Il a été baptisé OpenBLAS lorsqu’il a rejoint l’industrie.
Les idées à la base de GotoBLAS ont été refactorisées dans une nouvelle implémentation, le framework BLIS (Library Instantiation Software) (semblable à BLAS) ( https://github.com/flame/blis ), qui implémente les mêmes algorithmes, mais structure le code afin qu’il soit nécessaire d’implémenter moins de personnalisation 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 sont eux-mêmes un standard de facto pour l’interface. ATLAS était autrefois l’état de la technique. Ce n'est plus.
Autant que je sache, et après avoir travaillé dans le référentiel ATLAS, il semble qu'il inclue une nouvelle implémentation de BLAS en C. Il y a un peu plus que cela mais j'espère que cela répond à la question.