Os Basic Linear Algebra Subprograms (BLAS) surgiram nos anos 70 e 80, como uma especificação desenvolvida por acadêmicos de instituições públicas dos EUA. O objetivo era padronizar e aumentar a velocidade das operações básicas de álgebra linear. Inicialmente, isso se limitava às operações de vetores (Nível 1), mas com o tempo o BLAS evoluiu para suportar algoritmos mais complexos, como operações de vetor-matriz (Nível 2) e, posteriormente, operações de matriz-matriz (Nível 3).
Um ótimo ponto de partida para explorar o BLAS é o Netlib Quick Reference Guide, que oferece uma visão geral detalhada e cita três artigos fundamentais que embasam a especificação. Jack Dongarra é um dos principais nomes nesse campo, sendo mencionado com frequência. Esses artigos estão disponíveis publicamente e são uma referência importante para quem deseja entender a fundo essa especificação.
Operações com matrizes
Uma parte essencial da especificação BLAS envolve operações com matrizes simétricas, hermitianas e triangulares. Essas variações podem otimizar significativamente o desempenho computacional. Um dos exemplos mais relevantes é o GEMM (General Matrix-Matrix Multiplication):
xGEMM ( TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC )
Essa função realiza a seguinte operação:
C <= alpha * op(A) * op(B) + beta * C
Onde A
, B
e C
são matrizes retangulares, e op
refere-se à transposição ou conjugação das matrizes A
e B
. A definição genérica dessa operação permite realizar tanto somas quanto multiplicações de matrizes, bastando ajustar os parâmetros corretamente, como definir BETA=0
para uma multiplicação de matrizes sem somas.
A especificação BLAS quebra operações de nível superior em operações menores, possibilitando que partes da matriz caibam em caches menores (L3-L1), otimizando a velocidade computacional.
Netlib e as implementações de BLAS
As primeiras implementações do BLAS foram escritas em Fortran, uma linguagem muito utilizada em computação científica e de alto desempenho. Com o tempo, surgiram camadas adicionais, como o LAPACK, que utiliza BLAS para realizar operações mais complexas, como resolução de sistemas lineares e cálculo de autovalores. Tanto o BLAS quanto o LAPACK podem ser encontrados no site da Netlib.
Essa separação de responsabilidades permitiu ao BLAS especializar-se em operações com matrizes, otimizando o uso das arquiteturas de hardware subjacentes. Já o LAPACK foca em domínios matemáticos mais específicos.
OpenBLAS
Nos anos 2000, Kazushige Goto desenvolveu o GotoBLAS, uma implementação do BLAS com código em assembly, o que trouxe uma grande melhora de desempenho. Em 2011, Zhang Xianyi, da UT Austin, fez um fork do GotoBLAS2, criando o OpenBLAS, que continua sendo mantido e atualizado para suportar novas arquiteturas de processadores, incluindo o RISC-V.
Ao longo dos anos, o OpenBLAS se destacou por alcançar benchmarks muito próximos aos do Intel MKL (Math Kernel Library), uma biblioteca famosa da Intel. Em 2020, o MKL foi renomeado para oneMKL para se alinhar à especificação oneAPI, que define uma API agnóstica ao hardware, com suporte a CPU e aceleradores.
FlexiBLAS
O FlexiBLAS, criado por Martin Kohler e Jens Saak, aborda alguns problemas das bibliotecas de álgebra linear, como o LAPACK, PLASMA e MAGMA. Esses problemas incluem dependências de bibliotecas, dificuldades de depuração e incompatibilidades diversas. O FlexiBLAS permite a troca entre diferentes implementações de BLAS durante a execução do programa, utilizando variáveis de ambiente ou arquivos de configuração. Ele faz isso por meio das funções POSIX dlopen
e dlsym
.
Para instalar o FlexiBLAS no Fedora e listar as bibliotecas disponíveis, use os seguintes comandos:
dnf install flexiblas
flexiblas list
O FlexiBLAS também oferece recursos de profiling e depuração, permitindo uma visão detalhada do desempenho das operações. Saiba mais detalhes no Fedora Docs.
Exemplos de Implementação
Um exemplo simples de multiplicação de matrizes em C pode ser encontrado a seguir, onde duas matrizes são multiplicadas e o tempo de execução é medido em diferentes configurações. A performance pode ser drasticamente melhorada utilizando ferramentas como OpenMP e FlexiBLAS. Abaixo, um exemplo de código usando OpenBLAS para acelerar a multiplicação:
#include "flexiblas/cblas.h"
#define N 5000
double A[N][N], B[N][N], C[N][N];
int main() {
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, N, N, N, 1,
&A[0][0], N, &B[0][0], N, 0, &C[0][0], N);
}
Esse código utiliza a interface CBLAS do FlexiBLAS, que chama diretamente as funções otimizadas de multiplicação de matrizes. O tempo de execução pode ser reduzido drasticamente em comparação com uma implementação simples sem otimizações.
Conclusão
O BLAS se estabeleceu como uma especificação fundamental para operações de álgebra linear, sendo amplamente utilizado em computação científica e de alto desempenho. Ao longo dos anos, evoluiu e se integrou com outras bibliotecas, como LAPACK e FlexiBLAS, oferecendo desempenho otimizado em diferentes arquiteturas de hardware. A capacidade de alternar entre diferentes backends BLAS, especialmente com FlexiBLAS, proporciona flexibilidade e desempenho, atendendo às necessidades de uma vasta gama de aplicações, desde simulações químicas até análise de grandes dados.