Categorias
Tecnologia

Introdução ao BLAS e suas implementações: OpenBLAS, FlexiBLAS e além

Entenda a importância do BLAS, uma especificação de álgebra linear usada em computação de alto desempenho. Explore suas implementações, como OpenBLAS e FlexiBLAS, e como elas otimizam operações com matrizes.

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

Imagem abstrata de computação quântica com linhas vermelhas e texto 'Quantum Computing' em destaque no centro.

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.

Por Emanuel Negromonte

Fundador do SempreUPdate. Acredita no poder do trabalho colaborativo, no GNU/Linux, Software livre e código aberto. É possível tornar tudo mais simples quando trabalhamos juntos, e tudo mais difícil quando nos separamos.

Sair da versão mobile