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

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

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

BLAS es una colección de operaciones aritméticas de matrices y vectores 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 de matriz (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 en absoluto. LAPACK generalmente se comstack por separado de BLAS y puede usar cualquier implementación BLAS altamente optimizada que tenga disponible.

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

Lo que “debe usar” depende en parte de los detalles de lo que está tratando de hacer y la plataforma que está usando. Sin embargo, no irá demasiado mal con “usar ATLAS + LAPACK”.

Hace tiempo, cuando comencé a hacer algo de álgebra lineal en C , me sorprendió ver que hay muy pocos tutoriales para BLAS , LAPACK y otras API fundamentales, a pesar del hecho de que de alguna manera son las piedras angulares de muchas otras bibliotecas. . Por esa razón, comencé a recostackr todos los ejemplos / tutoriales que pude encontrar en Internet para BLAS , CBLAS , LAPACK , CLAPACK , LAPACKE , ATLAS , OpenBLAS … en este repository de Github .

Bueno, debo advertirte que, como ingeniero mecánico, tengo poca experiencia en la gestión de un repository de Git o GitHub. Primero les parecerá un completo desastre para 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 estar seguros de que se comstackn. Y los que no comstackmos los he mencionado. He modificado muchos de ellos para comstackrlos con GNU compilers ( gcc , g++ y gfortran ). He creado MakeFile s que puedes leer para aprender cómo puedes llamar rutinas individuales de Fortran/FORTRAN en un progtwig C o C++ . También he puesto algunas instrucciones de instalación para mac y linux (¡lo siento chicos de Windows!). También he hecho algunos archivos bash .sh para la comstackción automática de algunas de estas bibliotecas.

Pero dirigiéndose a su otra pregunta: BLAS y LAPACK son más bien API s no SDK específicos. Son solo una lista de especificaciones o extensiones de lenguaje en lugar de una implementación o biblioteca. Dicho esto, hay implementaciones originales de Netlib en FORTRAN 77 , a las que la mayoría de las personas se refieren (¡de manera confusa!) Cuando se habla de BLAS y LAPACK . Entonces, si ve muchas cosas extrañas cuando usa estas API s es porque en realidad estaba llamando rutinas de FORTRAN en C en lugar de en bibliotecas y funciones de C ATLAS y OpenBLAS son algunas de las mejores implementaciones de BLAS y LACPACK , que yo sepa. Se ajustan a la API original, aunque, a mi entender, se implementan en C/C++ desde cero (¡no estoy seguro!). Existen implementaciones de GPGPU de las API utilizan OpenCL : CLBlast , clBLAS , clMAGMA , ArrayFire y ViennaCL para mencionar algunas. También hay implementaciones específicas del proveedor optimizadas para hardware o plataforma específica, por lo que desaliento a cualquier persona a que las use.

Mi recomendación para cualquiera que quiera aprender a usar BLAS y LAPACK en C es aprender primero la progtwigción mixta de FORTRAN-C . El primer capítulo del repo mencionado está dedicado a este asunto y allí he recostackdo muchos ejemplos diferentes.

PS He estado trabajando en la twig dev del repository de tiempo en tiempo. ¡Parece un poco menos desordenado!

ATLAS está bastante anticuado. Se desarrolló 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 autotuning eran el camino a seguir.

A principios de la década de 2000, apareció Kazushige Goto, quien mostró cómo las implementaciones altamente eficientes pueden codificarse 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 de matriz-matriz, y por otro lado las diseñó mejor. Su enfoque, que en las CPU actuales suele ser el de mayor rendimiento, no se encuentra en el espacio de búsqueda que ATLAS ejecuta automáticamente. Por lo tanto, ATLAS es inherentemente inferior. La implementación de Kazushige de BLAS se conoció como GotoBLAS. Fue bifurcado como el OpenBLAS cuando se unió a la industria.

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

Lo que esta discusión muestra 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.

Que yo sepa, y después de trabajar en el repository de ATLAS, parece que incluye una reimplementación de BLAS en C. Hay algo más que eso, pero espero que responda a la pregunta.

Intereting Posts