¿Cuál es la relación entre BLAS, LAPACK y ATLAS?

143

¡No entiendo cómo BLAS, LAPACK y ATLAS están relacionados y cómo debería usarlos juntos! He estado revisando todos sus manuales y tengo una idea general de BLAS y LAPACK y cómo usarlos con los muy pocos ejemplos que encuentro, pero no puedo encontrar ningún ejemplo real usando ATLAS para ver cómo se relaciona con estos dos.

Estoy tratando de hacer un trabajo de bajo nivel en matrices y mi idioma principal es C. Primero quería usar GSL, pero dice que si desea el mejor rendimiento, debe usar BLAS y ATLAS. ¿Hay alguna buena página web que dé algunos buenos ejemplos de cómo usarlos (en C) todos juntos? En otras palabras, estoy buscando un tutorial sobre el uso de estos tres (¡o cualquier subconjunto de ellos!). En resumen, estoy confundido!

makhlaghi
fuente
3
Ver también scicomp.stackexchange.com/questions/8052/…
High Performance Mark

Respuestas:

156

BLAS es una colección de operaciones aritméticas matriciales y vectoriales de bajo nivel ("multiplicar un vector por un escalar", "multiplicar dos matrices y agregar a una tercera matriz", etc.).

LAPACK es una colección de operaciones de álgebra lineal de nivel superior. Cosas como las factorizaciones matriciales (LU, LLt, QR, SVD, Schur, etc.) que se utilizan para hacer cosas como "encontrar los valores propios de una matriz", o "encontrar los valores singulares de una matriz", o "resolver un sistema lineal ". LAPACK está construido sobre el BLAS; muchos usuarios de LAPACK solo usan las interfaces de LAPACK y nunca necesitan conocer el BLAS. LAPACK generalmente se compila por separado del BLAS, y puede usar cualquier implementación de BLAS altamente optimizada que tenga disponible.

ATLAS es una implementación portátil razonablemente buena de las interfaces BLAS, que también implementa algunas de las operaciones LAPACK más utilizadas.

Lo que "debe usar" depende en cierta medida de los detalles de lo que está tratando de hacer y qué plataforma está utilizando. Sin embargo, no se equivocará demasiado con “use ATLAS + LAPACK”.

Stephen Canon
fuente
Gracias por las explicaciones ¿Conoces algún ejemplo de CÓMO usar ATLAS + LAPACK? ¡Necesito ver algunos ejemplos para entender cómo usarlos! Entiendo para qué sirven y la teoría de lo que hacen, pero difícilmente puedo encontrar ejemplos en C sobre cómo implementarlos en la práctica.
makhlaghi
1
@astroboy: ¿puedes darme información sobre lo que realmente estás tratando de hacer? LAPACK especialmente es una enorme biblioteca.
Stephen Canon
Para simplificar, digamos que tengo una matriz y quiero multiplicarla por un cierto valor. ¿Cómo puedo hacer esto combinando ATLAS y (LAPACK o BLAS) en C? Solo quiero ver cómo implementar cualquiera de estas funciones. ¡Hay algunos ejemplos en netlib.org/lapack/lapacke.html pero no se menciona a ATLAS!
makhlaghi
¿Hay algo como BLAS, LAPACK o MKL capaz de trabajar de forma transparente con objetos mucho más grandes que la memoria?
skan
1
@ MinhNghĩa: Hay un estándar, netlib.org/blas/blast-forum , pero (a) no hay cumplimiento, un estándar sin un conjunto de pruebas no es realmente un estándar, y (b) no creo que cualquiera implemente el conjunto completo de interfaces descrito por ese documento. Es, eh, aspiracional.
Stephen Canon
40

Mientras que hace, cuando empecé a hacer un poco de álgebra lineal en C, que me llegó como una sorpresa ver que hay tan pocos tutoriales para BLAS, LAPACKy otros fundamentales APIs, a pesar de que de alguna manera son las piedras angulares de muchas otras bibliotecas. Por eso empecé a coleccionar todos los ejemplos / tutoriales que pude encontrar en todo el Internet para BLAS, CBLAS, LAPACK, CLAPACK, LAPACKE, ATLAS, OpenBLAS... en este repo Github .

Bueno, debo advertirte que, como ingeniero mecánico, tengo poca experiencia en la gestión de un repositorio de git o GitHub. Primero les parecerá un completo desastre a ustedes. Sin embargo, si logra superar la estructura desordenada, encontrará todo tipo de ejemplos e instrucciones que podrían ser de ayuda. He probado la mayoría de ellos, para asegurarme de que compilan. Y los que no compilan he mencionado. He modificado muchos de ellos para que sean compilables con GNU compilers( gcc, g++y gfortran). He hecho MakeFiles que se puede leer para aprender cómo se puede llamar individuales Fortran/FORTRANrutinas en una Co C++programa. También he puesto algunas instrucciones de instalación para mac y linux (¡lo siento, chicos de Windows!). También he hecho algunosbash .sh archivos para la compilación automática de algunas de estas bibliotecas.

Pero yendo a su otra pregunta: BLASy LAPACKmás bien APIno son específicos SDK. Son solo una lista de especificaciones o extensiones de lenguaje en lugar de implementaciones o bibliotecas. Dicho esto, existen implementaciones originales de Netlib en FORTRAN 77que la mayoría de la gente se refiere a (confusamente!) Cuando se habla de BLASy LAPACK. Entonces, si ve muchas cosas extrañas al usar estos APIs es porque en realidad estaba llamando a FORTRANrutinas en Clugar de Cbibliotecas y funciones. ATLASy OpenBLASson algunas de las mejores implementaciones de BLASy LACPACKque yo sepa. Se ajustan al original API, aunque, a mi entender, se implementan enC/C++desde cero (¡no estoy seguro!). Hay implementaciones de GPGPU de los APIs que usan OpenCL: CLBlast , clBLAS , clMAGMA , ArrayFire y ViennaCL para mencionar algunas. También hay implementaciones específicas de proveedores optimizadas para hardware o plataforma específicos, lo que desaconsejo encarecidamente que cualquiera las use.

Mi recomendación para cualquiera que quiera aprender usando BLASy LAPACKen Caprender FORTRAN-Cprimero es la programación mixta. El primer capítulo del repositorio mencionado está dedicado a este asunto y allí he recopilado muchos ejemplos diferentes.

PD: He estado trabajando en la rama de desarrollo del repositorio de vez en cuando. ¡Parece un poco menos desordenado!

Foad
fuente
La página de Wikipedia para LAPACK comienza con "LAPACK (Linear Algebra Package) es una biblioteca de software estándar". ¿Estás diciendo que es incorrecto, ya que es una especificación de API y no una implementación?
Noah_S
1
Después de algunas investigaciones, parece que LAPACK y BLAS en realidad son implementaciones. De las preguntas frecuentes de NetLib sobre BLAS: "Los BLAS (subprogramas de álgebra lineal básica) son rutinas que proporcionan bloques de construcción estándar para realizar operaciones básicas de vectores y matrices". De la página de GitHub de LAPACK: "LAPACK es una biblioteca de subrutinas de Fortran". Basado en eso, y al leer el proyecto GitHub de LAPACK, mi impresión es que BLAS y LAPACK en realidad son implementaciones: LAPACK se basa en BLAS para proporcionar una funcionalidad más sofisticada.
Noah_S
1
@Noah_S No usaría Wikipedia como "la" referencia, pero hasta donde sé, hay varias implementaciones de LAPACK. Creo que llamarlo API es más preciso ahora. pero por favor corrígeme si me equivoco.
Foad
2
Creo que parte de la confusión es que BLAS es una API / especificación, pero también hay una "Implementación de referencia" de BLAS (de Netlib) que también se conoce como la "biblioteca BLAS". Por lo general, cuando las personas dicen BLAS, se refieren a la API, porque la implementación de referencia no está optimizada, por lo que no se usa mucho en la práctica / industria. ATLAS proporciona una implementación optimizada de algunas de las subrutinas LAPACK, y luego opcionalmente extrae el resto de ellas desde LAPACK para producir una implementación LAPACK completa en los archivos lib ATLAS integrados.
Andrew Janke
1
@Noah_S No hay contradicción, cada biblioteca tiene una API, lo que hace posible volver a implementar la funcionalidad real mientras se mantiene compatible con la API y eso es lo que sucedió con LAPACK.
Andrey
17

ATLAS ya está bastante desactualizado. Fue desarrollado en un momento en que se pensaba que la optimización de BLAS para varias plataformas estaba más allá de la capacidad de los humanos, y como resultado, la autogeneración y el autoajuste eran el camino a seguir.

A principios de la década de 2000, llegó Kazushige Goto, quien mostró cómo las implementaciones altamente eficientes se pueden codificar a mano. Puede disfrutar de un artículo interesante en el 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, por un lado, tenía una mejor comprensión de la teoría detrás de las implementaciones de alto rendimiento de la multiplicación matriz-matriz, y por otro lado, las diseñó mejor. Su enfoque, que en las CPU actuales suele ser el de mayor rendimiento, no está en el espacio de búsqueda que el autotunes ATLAS. Por lo tanto, ATLAS es inherentemente inferior. La implementación de Kazushige del BLAS se conoció como el GotoBLAS. Se bifurcó como OpenBLAS cuando se unió a la industria.

Las ideas detrás de GotoBLAS se refactorizaron en una nueva implementación, el marco del software de instanciación de bibliotecas (BLIS) similar a BLAS ( https://github.com/flame/blis ), que implementa los mismos algoritmos, pero estructura el código de modo que menos necesita ser implementado a medida para una nueva arquitectura. BLIS está codificado en C.

Lo que muestra esta discusión es que hay muchas implementaciones de BLAS. Los BLAS son un estándar de facto para la interfaz. ATLAS fue una vez el estado del arte. No es largo.

Robert van de Geijn
fuente
0

Hasta donde sé, y después de trabajar a través del repositorio ATLAS, parece que incluye una reimplementación de BLAS en C. Hay algo más que eso, pero espero que responda la pregunta.

cdcdcd
fuente