Bibliotecas de Álgebra Lineal
Introducción
BLAS (Basic Linear Algebra Subprograms) y LAPACK (Linear Algebra PACKage) son rutinas que proporcionan bloques de compilación estándar para rendimiento en un intervalo ancho de operaciones de álgebra linear. Existen aplicaciones de referencia estables desde Netlib escritos en Fortran, con interfaces C disponibles (invocados CBLAS y LAPACKE respectivamente), así como varias implementaciones optimizadas proporcionando subconjuntos rápidos de estas API.
Implementaciones disponibles
-
blas,lapack– Implementación de referencie Netlib de interfaces Fortran y C. -
atlas– Software de Álgebra Lineal para Ajuste Automático. -
blis- Marco de software de instanciación de bibliotecas similar a BLAS. -
openblas- OpenBLAS, un BLAS optimizado basado en GotoBLAS2.
ATLAS, BLIS y OpenBLAS proporcionan BLAS y un subconjunto de LAPACK. Ambos BLIS y OpenBLIS proporcionan varios sabores: una versión secuencial, una con hilo, y otra con mantenimiento OpenMP (todo ello con o sin mantenimiento para enteros de 64-bit).
Debido a las diferencias de implementación, es importante que todos los componentes de una pila de software particular se enlacen a la misma implementación de BLAS/LAPACK. Además, los usuarios pueden optar por una implementación que mejor se adapte a sus necesidades en tiempo de ejecución. Esta guía proporciona una estructura que permite la implementación de la primera mientras permita la segunda, además de proporcionar un mecanismo de respaldo transparente a la implementación de referencia de Netlib para los símbolos no incluidos en el backend seleccionado a través de FlexiBLAS.
Cobertura de BLAS/LAPACK
FlexiBLAS es un framework que integra las API de BLAS y LAPACK en una única biblioteca. Los consumidores de BLAS/LAPACK deben enlazar con FlexiBLAS, y este envoltorio puede redirigir las invocaciones a un backend optimizado seleccionado con una sobrecarga despreciable. También proporciona un respaldo transparente a la implementación de referencia de Netlib si un símbolo determinado no está presente en el backend seleccionado. Estas son las principales características:
-
Proporciona un 100% de compatibilidad con el ABI/API de BLAS y LAPACK, con interfaces para ambos enteros de 32- y 64-bit.
-
Backend BLAS y LAPACK intercambiable en tiempo de ejecución sin recompilación a través de una variable de entorno.
-
Integración de bibliotecas BLAS propiedad del usuario sin privilegios de administrador, incluso en programas instalados en todo el sistema.
-
Funciona con OpenBLAS, ATLAS y BLIS, así como alternativas no libres como Intel MKL, ACML…
-
Archivos de configuración flexibles por sistema/usuario/host.
-
Soporte básico de creación de perfiles.
|
Fedora incluye |
Embalaje de paquetes dependientes de BLAS/LAPACK
Consumidores de cualquier subconjunto de BLAS y/o LAPACK DEBE compilar frente a FlexiBLAS (a no ser que no está admitido; consulte a continuación).
|
Excepciones
|
Requisitos de compilación
Primero, solo el paquete de desarrollo de FlexiBLAS DEBE estar listado en BuildRequires:
BuildRequires: flexiblas-devel
lo cual proporciona todos los archivos de desarrollo necesarios, ambos para el de 32-bit (el más usual) y el entero de 64-bit del interfaz.
|
Si el paquete sólo admite la interfaz para enteros de 64-bit, entonces DEBEN excluirse las arquitecturas de 32-bit (consulte Arch-Specific Runtime and Build-Time Dependencies). |
Configuración
El empaquetador DEBE especificar flexiblas o flexiblas64 (para la interfaz de 32- o 64-bit, respectivamente) como nombres de biblioteca BLAS y LAPACK, donde corresponda, y los paquetes que utilicen pkg-config obtendrán automáticamente los indicadores adecuados para los encabezados y las bibliotecas. De igual forma, los proyectos basados en CMake que utilicen FindBLAS detectarán y configurarán automáticamente los indicadores adecuados para FlexiBLAS (a partir de CMake v3.19), sin que el la acción sea requerida más desde el empaquetador.
Desafortunadamente, muchos proyectos upstream presentan formas heterogéneas de acceder a estas API. En el mejor de los casos, el framework de desarrollo puede definir opciones específicas para configurar explícitamente las bibliotecas BLAS o LAPACK. Normalmente, el empaquetador DEBE asegurarse de que %{_includedir}/flexiblas y %{_libdir}/flexiblas (o %{_includedir}/flexiblas64 y %{_libdir}/flexiblas64) se inyecten como ubicaciones de encabezado y biblioteca en los indicadores y archivos de configuración adecuados, y/o que -lflexiblas (o -lflexiblas64) se proporcione al enlazador. En raras ocasiones, es necesario modificar las rutas codificadas en los archivos fuente, y es posible que se requieran parches. El empaquetador DEBERÍA colaborar con el upstream para estandarizar la forma en que se detectan y configuran estas bibliotecas.
|
Para garantizar que el programa ha sido enlazado apropiadamente contra FlexiBLAS, el empaquetador DEBE comprobar que los |
Pruebas
Los backend BLAS/LAPACK optimizados son mucho más rápidos que la implementación de referencia de Netlib, pero los resultados pueden variar ligeramente. Por lo tanto, las pruebas demasiado estrictas (con tolerancias demasiado pequeñas) pueden fallar. En estos casos, el empaquetador HABILITARÍA la implementación de referencia en la sección %check de la siguiente manera:
export FLEXIBLAS=netlib
o, alternativamente, a través de FLEXIBLAS64 para construcciones utilizando enteros de 64-bit.
Selección backend
Selección de nivel del sistema
Un paquete compilado con FlexiBLAS extrae el subpaquete flexiblas-netlib(64) correspondiente, que a su vez requiere el backend optimizado predeterminado (es decir, flexiblas-openblas-openmp(64)). Esto se configura mediante la clave "default=IMPLEMENTATION-NAME" (p.d, default=openblas-openmp), presente en el archivo de configuración principal incluido en los subpaquetes principales %{_sysconfdir}/flexiblasrc y %{_sysconfdir}/flexiblas64rc.
Para permitir la selección a nivel de sistema de otras implementaciones de BLAS/LAPACK, primero se deben instalar más backends (p.e., flexiblas-atlas, flexiblas-blis-serial…), y luego se pueden intercambiar en todo el sistema a través de la herramienta CLI flexiblas, o simplemente modificando la clave "default" en el archivo de configuración manualmente.
Selección de nivel de usuario
Selección de nivel de usuario persistente de implementación del proveedor del sistema BLAS/LAPACK puede ser hecho por vía de la herramienta CLI:
$ flexiblas set NOMBRE-IMPLEMENTACIÓN $ flexiblas64 set NOMBRE-IMPLEMENTACIÓN
proporcionó el sub-paquete para NOMBRE-IMPLEMENTACIÓN está instalado.
Selección de nivel-usuario no persistente puede ser disparado por medio de una variable del entorno:
$ FLEXIBLAS=NOMBRE-IMPLEMENTACIÓN ./yourapp $ FLEXIBLAS64=NOMBRE-IMPLEMENTACIÓN ./yourapp64
La selección a nivel de usuario de bibliotecas BLAS/LAPACK propiedad del usuario se puede lograr simplemente cambiando IMPLEMENTATION-NAME con una ruta a cualquier biblioteca personalizada compatible con BLAS/LAPACK en los ejemplos anteriores.
Want to help? Learn how to contribute to Fedora Docs ›