Qual a relação entre BLAS, LAPACK e ATLAS

142

Não entendo como BLAS, LAPACK e ATLAS estão relacionados e como devo usá-los juntos! Venho pesquisando todos os manuais e tenho uma idéia geral do BLAS e LAPACK e como usá-los com os poucos exemplos que encontro, mas não consigo encontrar nenhum exemplo real usando o ATLAS para ver como ele está relacionado. Estes dois.

Estou tentando fazer algum trabalho de baixo nível em matrizes e meu idioma principal é C. Primeiro, eu queria usar o GSL, mas diz que se você deseja o melhor desempenho, deve usar o BLAS e o ATLAS. Existe alguma boa página da Web que dê alguns bons exemplos de como usá-los (em C) todos juntos? Em outras palavras, estou procurando um tutorial sobre como usar esses três (ou qualquer subconjunto deles!). Em resumo, estou confuso!

makhlaghi
fonte
3
Consulte também scicomp.stackexchange.com/questions/8052/…
High Performance Mark

Respostas:

156

BLAS é uma coleção de operações aritméticas de matriz e vetor de baixo nível (“multiplique um vetor por um escalar”, “multiplique duas matrizes e adicione a uma terceira matriz”, etc ...).

LAPACK é uma coleção de operações de álgebra linear de nível superior. Coisas como fatorações matriciais (LU, LLt, QR, SVD, Schur, etc) que são usadas para fazer coisas como “encontrar os valores próprios de uma matriz” ou “encontrar os valores singulares de uma matriz” ou “resolver um sistema linear ”. O LAPACK é construído sobre o BLAS; muitos usuários do LAPACK usam apenas as interfaces LAPACK e nunca precisam estar cientes do BLAS. O LAPACK geralmente é compilado separadamente do BLAS e pode usar qualquer implementação BLAS altamente otimizada disponível.

O ATLAS é uma implementação razoavelmente boa e portátil das interfaces BLAS, que também implementa algumas das operações LAPACK mais usadas.

O que você deve usar depende um pouco dos detalhes do que você está tentando fazer e da plataforma que está usando. Você não errará muito com "use ATLAS + LAPACK", no entanto.

Stephen Canon
fonte
Obrigado pelas explicações. Você conhece algum exemplo de COMO usar o ATLAS + LAPACK? Eu preciso ver alguns exemplos para entender como usá-los! Entendo para que servem e a teoria do que fazem, mas mal consigo encontrar exemplos em C sobre como implementar na prática.
makhlaghi
1
@astroboy: você pode me dar algumas informações sobre o que realmente está tentando fazer? O LAPACK é especialmente uma enorme biblioteca.
Stephen Canon
Para simplificar, digamos que eu tenho uma matriz e quero multiplicá-la por um determinado valor. Como posso fazer isso combinando ATLAS e (LAPACK ou BLAS) em C? Eu só quero ver como implementar qualquer uma dessas funções. Existem alguns exemplos em netlib.org/lapack/lapacke.html, mas não há menção ao ATLAS!
makhlaghi
Existe algo como BLAS, LAPACK ou MKL capaz de trabalhar de forma transparente com objetos muito maiores que a memória?
skan
1
@ MinhNghĩa: Existe um padrão, netlib.org/blas/blast-forum , mas (a) não há imposição - um padrão sem uma suíte de testes não é realmente um padrão - e (b) não acho que alguém implemente o conjunto completo de interfaces descritas por esse documento. É aspiracional.
Stephen Canon
40

Tempo atrás, quando comecei a fazer alguma álgebra linear C, ele veio a mim como uma surpresa para ver que há tão poucos tutoriais para BLAS, LAPACKe outros fundamentais APIs, apesar do fato de que eles são de alguma forma os pilares de muitas outras bibliotecas. Por essa razão eu comecei a recolher todos os exemplos / tutoriais que eu poderia encontrar por toda a internet para BLAS, CBLAS, LAPACK, CLAPACK, LAPACKE, ATLAS, OpenBLAS... no presente repo Github .

Bem, devo avisar que, como engenheiro mecânico, tenho pouca experiência em gerenciar um repositório git ou GitHub. Primeiro parecerá uma bagunça completa para vocês. No entanto, se você conseguir superar a estrutura confusa, encontrará todos os tipos de exemplos e instruções que podem ajudar. Eu tentei a maioria deles, para ter certeza de que eles compilam. E os que não compilam eu mencionei. Eu modifiquei muitos deles para serem compiláveis ​​com GNU compilers( gcc, g++e gfortran). Fiz MakeFiles que você pode ler para aprender como chamar Fortran/FORTRANrotinas individuais em um Cou C++programa. Também coloquei algumas instruções de instalação para mac e linux (desculpe pessoal do windows!). Eu também fiz algunsbash .sh arquivos para compilação automática de algumas dessas bibliotecas.

Mas indo para sua outra pergunta: BLASe não LAPACKsão APIs específicos SDK. Eles são apenas uma lista de especificações ou extensões de idioma, em vez de implementações ou bibliotecas. Com isso dito, existem implementações originais do Netlib in FORTRAN 77, às quais a maioria das pessoas se refere (confusamente!) Ao falar sobre BLASe LAPACK. Portanto, se você vê muitas coisas estranhas ao usar esses APIs, é porque estava realmente chamando FORTRANrotinas em Cvez de Cbibliotecas e funções. ATLASe OpenBLASsão algumas das melhores implementações BLASe LACPACKaté onde eu sei. Eles estão em conformidade com o original API, embora, ao meu conhecimento, sejam implementados emC/C++a partir do zero (não tenho certeza!). Existem implementações GPGPU dos APIs usando OpenCL: CLBlast , clBLAS , clMAGMA , ArrayFire e ViennaCL para mencionar alguns. Também existem implementações específicas de fornecedor otimizadas para hardware ou plataforma específica, o que desencorajo fortemente qualquer pessoa a usá-las.

Minha recomendação para quem quer aprender usando BLASe LAPACKem Cé aprender FORTRAN-Cprogramação mista em primeiro lugar. O primeiro capítulo do repositório mencionado é dedicado a esse assunto e lá colecionei muitos exemplos diferentes.

PS: Eu tenho trabalhado no ramo dev do repositório de tempos em tempos. Parece um pouco menos bagunçado!

Foad
fonte
A página da Wikipedia para LAPACK começa com "LAPACK (Linear Algebra Package) é uma biblioteca de software padrão". Você está dizendo que isso está incorreto, pois é uma especificação de API e não uma implementação?
Noah_S
1
Após algumas pesquisas, parece que o LAPACK e o BLAS são realmente implementações. Do FAQ do NetLib no BLAS: "Os BLAS (Subprogramas de Álgebra Linear Básica) são rotinas que fornecem blocos de construção padrão para a execução de operações básicas de vetores e matrizes". Na página GitHub do LAPACK: "LAPACK é uma biblioteca de sub-rotinas Fortran". Com base nisso, e lendo o projeto GitHub do LAPACK, minha impressão é que o BLAS e o LAPACK realmente são implementações - o LAPACK se baseia no BLAS para fornecer funcionalidades mais sofisticadas.
Noah_S 17/08/19
1
@Noah_S Eu não usava a Wikipedia como "a" referência, mas, para meu conhecimento limitado, existem várias implementações do LAPACK. Acho que chamá-lo de API é mais preciso agora. mas por favor me corrija se eu estiver errado.
Foad
2
Eu acho que parte da confusão é que o BLAS é uma API / especificação, mas também existe uma "Implementação de Referência" do BLAS (do Netlib) que também é chamada apenas de "biblioteca BLAS". Geralmente, quando as pessoas dizem BLAS, elas querem dizer a API, porque a Implementação de Referência não é otimizada, portanto, não é muito usada na prática / setor. O ATLAS fornece uma implementação otimizada de algumas das sub-rotinas LAPACK e, opcionalmente, extrai o restante delas do próprio LAPACK para produzir uma implementação completa do LAPACK nos arquivos lib ATLAS criados.
Andrew Janke
1
@Noah_S Não há contradição, cada biblioteca possui uma API, o que possibilita reimplementar a funcionalidade real enquanto permanece compatível com a API e foi o que aconteceu com o LAPACK.
Andrey
17

O ATLAS já está bastante desatualizado. Foi desenvolvido em um momento em que se pensava que otimizar o BLAS para várias plataformas estava além da capacidade dos seres humanos e, como resultado, a geração automática e o ajuste automático eram o caminho a seguir.

No início dos anos 2000, surgiu Kazushige Goto, que mostrou como implementações altamente eficientes podem ser codificadas manualmente. Você pode apreciar um artigo interessante no New York Times: https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human- computer-keep.html .

As de Kazushige, por um lado, tiveram melhores insights sobre a teoria por trás das implementações de alto desempenho da multiplicação matriz-matriz e, por outro lado, as projetaram melhor. Sua abordagem, que nas CPUs atuais geralmente tem o melhor desempenho, não está no espaço de pesquisa que o ATLAS ajusta automaticamente. Portanto, o ATLAS é inerentemente inferior. A implementação do BLAS por Kazushige ficou conhecida como GotoBLAS. Foi bifurcado como o OpenBLAS quando ele ingressou na indústria.

As idéias por trás do GotoBLAS foram refatoradas para uma nova implementação, a estrutura BLIS (Library Instantiation Software) do tipo BLAS ( https://github.com/flame/blis ), que implementa os mesmos algoritmos, mas estrutura o código para que menos precisa ser implementado de forma personalizada para uma nova arquitetura. BLIS é codificado em C.

O que esta discussão mostra é que existem muitas implementações do BLAS. Os próprios BLAS são um padrão de fato para a interface. ATLAS já foi o estado da arte. Não é mais.

Robert van de Geijn
fonte
0

Tanto quanto sei, e depois de trabalhar no repositório ATLAS, parece que ele inclui uma reimplementação do BLAS no C. Há um pouco mais do que isso, mas espero que ele responda à pergunta.

cdcdcd
fonte