lapack python




Qual é a relação entre BLAS, LAPACK e ATLAS? (3)

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

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


O ATLAS já está bastante desatualizado. Ele foi desenvolvido em uma época em que se pensava que otimizar o BLAS para várias plataformas estava além da capacidade dos humanos e, como resultado, a autogeração e o autotuning eram o caminho a percorrer.

No início dos anos 2000, veio Kazushige Goto, que mostrou como implementações altamente eficientes podem ser codificadas manualmente. Você pode gostar de 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-keeps.html .

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

As idéias por trás do GotoBLAS foram refatoradas em uma nova implementação, a estrutura BLAS (similar ao BLAS) ( https://github.com/flame/blis ), que implementa os mesmos algoritmos, mas estrutura o código de forma que menos precisa ser implementado de maneira personalizada para uma nova arquitetura. O 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.


O BLAS é uma coleção de operações aritméticas de matriz e vetores 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 alto nível. Coisas como fatorações de matriz (LU, LLt, QR, SVD, Schur, etc) que são usadas para fazer coisas como “encontrar os autovalores 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 do 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 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 de qual plataforma você está usando. Você não vai muito errado com "use ATLAS + LAPACK", no entanto.


Enquanto atrás, quando comecei a fazer alguma álgebra linear em C , me ocorreu uma surpresa ver que há tão poucos tutoriais para BLAS , LAPACK e outras API fundamentais, apesar do fato de que eles são de alguma forma os pilares de muitas outras bibliotecas. . Por essa razão, comecei a coletar todos os exemplos / tutoriais que pude encontrar na Internet para BLAS , CBLAS , LAPACK , CLAPACK , LAPACKE , ATLAS , OpenBLAS ... neste OpenBLAS Github .

Bem, devo avisá-lo que, como engenheiro mecânico, tenho pouca experiência em gerenciar um repositório git ou GitHub. Primeiro vai 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 aqueles que não compilam eu mencionei. Eu modifiquei muitos deles para serem compiláveis ​​com os GNU compilers ( gcc , g++ e gfortran ). Eu fiz MakeFile s que você pode ler para aprender como você pode chamar rotinas individuais Fortran/FORTRAN em um programa C ou C++ . Eu também coloquei algumas instruções de instalação para mac e linux (desculpe caras do windows!). Eu também fiz alguns arquivos .sh bash para compilação automática de algumas dessas bibliotecas.

Mas indo para sua outra pergunta: BLAS e LAPACK são API e não SDK específicos. Eles são apenas uma lista de especificações ou extensões de linguagem, em vez de implementações ou bibliotecas. Com isto dito, existem implementações originais do Netlib no FORTRAN 77 , que a maioria das pessoas se refere (confusamente!) Ao falar sobre BLAS e LAPACK . Então, se você vê um monte de coisas estranhas ao usar estes API é porque você estava realmente chamando rotinas FORTRAN em C e não bibliotecas e funções. ATLAS e OpenBLAS são algumas das melhores implementações de BLAS e LACPACK , tanto quanto eu sei. Eles estão em conformidade com a API original, embora, no meu conhecimento, eles sejam implementados em C/C++ partir do zero (não tenho certeza!). Existem implementações GPGPU das API usando OpenCL : CLBlast , clBLAS , clMAGMA , ArrayFire e ViennaCL para mencionar alguns. Há também implementações específicas de fornecedores otimizadas para hardware ou plataforma específicos, o que desencorajo fortemente qualquer pessoa a usá-las.

Minha recomendação para quem quer aprender usando BLAS e LAPACK em C é aprender primeiro a programação mista FORTRAN-C . O primeiro capítulo do repo mencionado é dedicado a este assunto e lá eu coletei muitos exemplos diferentes.

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





atlas