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 openblas-openmp como backend predeterminado para todo el sistema.

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
  • Aunque se planea la compatibilidad con LAPACKE, los pocos paquetes que utilizan esta interfaz aún no son compatibles con FlexiBLAS (v3.1.2). Estos paquetes DEBEN enlazar con OpenBLAS, o con lapack si las rutinas utilizadas no son compatibles con este backend. Las excepciones actuales de este tipo incluyen opencv, scamp y sextractor.

  • En raras ocasiones, un paquete puede usar una característica excepcional presente en un backend específico y no puede adaptarse a FlexiBLAS de ninguna manera. En tales casos, el paquete DEBE enlazar con este backend. Las excepciones actuales de este tipo incluyen julia (enlazada con OpenBLAS) y psfex (enlazada con ATLAS).

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 Requisitos sean correctos, es decir, que libflexiblas esté en la lista, pero no libblas, liblapack o cualquier otro backend.

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.