Desempenho otimizado

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.

Imagem de um cérebro flutuante rodeado por símbolos e números brilhantes em um fundo amarelo, representando conceitos de matemática e computação.

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.

Acesse a versão completa
Sair da versão mobile