Recomendações para uma biblioteca de matrizes C ++ rápida e utilizável?


158

Alguém tem recomendações sobre uma biblioteca de matrizes C ++ rápida e utilizável?

O que quero dizer com utilizável é o seguinte:

  • Os objetos de matriz têm uma interface intuitiva (por exemplo: eu posso usar linhas e colunas durante a indexação)
  • Eu posso fazer qualquer coisa com a classe matrix que eu posso fazer com LAPACK e BLAS
  • API fácil de aprender e usar
  • É relativamente fácil de instalar no Linux (eu uso o Ubuntu 11.04 agora)

Para mim, a usabilidade é mais importante do que a velocidade ou o uso de memória no momento, para evitar a otimização prematura. Ao escrever o código, eu sempre poderia usar matrizes 1-D (ou vetores STL) e aritmética adequada de índice ou ponteiro para emular uma matriz, mas eu preferiria não fazer isso para evitar erros. Também gostaria de concentrar meu esforço mental no problema real que estou tentando resolver e programar no domínio do problema, em vez de usar parte da minha atenção finita para lembrar todos os pequenos truques de programação que usei para emular matrizes como matrizes e lembre-se dos comandos LAPACK, etc. Além disso, quanto menos código eu tenho que escrever, e quanto mais padronizado, melhor.

Denso versus escasso ainda não importa; algumas das matrizes com as quais estou lidando serão escassas, mas não todas. No entanto, se um pacote específico lida bem com matrizes densas ou esparsas, vale a pena mencionar.

A modelagem também não me interessa muito, pois trabalharei com tipos numéricos padrão e não preciso armazenar nada além de duplos, flutuadores ou ints. É legal, mas não é necessário para o que eu gostaria de fazer.


1
O uso do CUDA é uma opção?
flipchart 12/12

1
Poderia ser, mais tarde. No momento, não estou interessado em CUDA porque estou construindo uma biblioteca para um aplicativo em que a multiplicação de matrizes é a menor das minhas preocupações. A maior parte do esforço será gasta em chamar um solucionador de programa linear de número inteiro misto, portanto, o uso do CUDA seria um exagero. Depois de terminar minha tese, planejo analisar algoritmos que são mais pesados ​​na álgebra linear e menos centrados na otimização. Definitivamente, encorajo você a publicar sobre as bibliotecas da CUDA, se você tiver experiência com elas, porque tenho certeza de que outras pessoas estariam interessadas em conhecer seus pensamentos.
Geoff Oxberry

E quanto ao Intel MKL e IPP?
Royi

Respostas:


146

Reunimos o seguinte da pesquisa on-line até agora:

Eu usei o Armadillo um pouco e achei a interface bastante intuitiva, e foi fácil localizar pacotes binários para o Ubuntu (e estou assumindo outras distros do Linux). Não o compilei da fonte, mas minha esperança é que não seja muito difícil. Ele atende à maioria dos meus critérios de design e usa álgebra linear densa. Pode chamar rotinas LAPACK ou MKL. Geralmente, não é necessário compilar o Armadillo, é uma biblioteca puramente baseada em modelos: você apenas inclui o cabeçalho e o link para BLAS / LAPACK ou MKL etc.

Ouvi coisas boas sobre Eigen , mas não usei. Ele afirma ser rápido , usa modelagem e suporta álgebra linear densa. Ele não possui LAPACK ou BLAS como dependência, mas parece capaz de fazer tudo o que o LAPACK pode fazer (além de algumas coisas que o LAPACK não pode). Muitos projetos usam o Eigen, o que é promissor. Ele tem um pacote binário para o Ubuntu, mas como uma biblioteca somente de cabeçalho, é trivial usar também em outros lugares.

A versão 4 da Matrix Template Library também parece promissora e usa modelos. Ele suporta álgebra linear densa e esparsa e pode chamar UMFPACK como um solucionador esparso. Os recursos não são claros em seu site. Possui um pacote binário para o Ubuntu, disponível para download em seu site.

O PETSc , escrito por uma equipe do Laboratório Nacional de Argonne, tem acesso a solucionadores lineares esparsos e densos, por isso presumo que ele possa funcionar como uma biblioteca de matrizes. Está escrito em C, mas acho que possui ligações C ++ (e mesmo que não tenha, chamar C em C ++ não é problema). A documentação é incrivelmente completa. O pacote é um pouco exagerado para o que eu quero fazer agora (multiplicação e indexação de matrizes para configurar programas lineares com números inteiros mistos), mas pode ser útil como um formato de matriz para mim no futuro ou para outras pessoas com necessidades diferentes do que eu.

O Trilinos , escrito por uma equipe do Sandia National Laboratory, fornece interfaces C ++ orientadas a objetos para matrizes densas e esparsas através de seu componente Epetra e interfaces modeladas para matrizes densas e esparsas através de seu componente Tpetra. Ele também possui componentes que fornecem a funcionalidade linear de resolução e eigensolver. A documentação não parece ser tão polida ou proeminente quanto o PETSc; Trilinos parece o análogo Sandia do PETSc. O PETSc pode chamar alguns dos solucionadores de Trilinos. Binários para Trilinos estão disponíveis para Linux.

O Blitz é uma biblioteca orientada a objetos C ++ que possui binários Linux. Ele não parece ser mantido ativamente (29/06/2012: uma nova versão apareceu ontem!), Embora a lista de emails esteja ativa, há uma comunidade que a usa. Parece não fazer muito em termos de álgebra linear numérica além do BLAS e parece uma biblioteca de matrizes densa. Ele usa modelos.

Boost :: uBLAS é uma biblioteca orientada a objetos C ++ e parte do projeto Boost. Ele suporta álgebra linear numérica densa e de modelos. Ouvi dizer que não é particularmente rápido.

O Template Numerical Toolkit é uma biblioteca orientada a objetos C ++ desenvolvida pelo NIST. Seu autor, Roldan Pozo, parece contribuir com patches ocasionalmente, mas não parece mais estar em desenvolvimento ativo (a última atualização foi em 2010). Ele se concentra na álgebra linear densa e fornece interfaces para algumas decomposições básicas da matriz e um solucionador de autovalores.

Elemental , desenvolvido por Jack Poulson, é um pacote de software de álgebra linear denso de memória distribuída (paralela) escrito em um estilo semelhante ao FLAME . Para uma lista de recursos e antecedentes do projeto, consulte a documentação dele . O próprio FLAME possui uma biblioteca associada para álgebra linear densa de memória compartilhada e seqüencial, chamada libflame , que parece ser escrita em C. orientada a objetos. Libflame se parece muito com LAPACK, mas com uma melhor notação subjacente aos algoritmos para desenvolver o desenvolvimento numérico rápido bibliotecas de álgebra linear mais de uma ciência e menos de uma arte negra.

Existem outras bibliotecas que podem ser adicionadas à lista; se estivermos contando pacotes de álgebra linear esparsos como "bibliotecas matriciais", o melhor gratuito que conheço em C é o SuiteSparse , programado no estilo orientado a objetos. Eu usei o SuiteSparse e achei bastante fácil de pegar; depende de BLAS e LAPACK para alguns dos algoritmos que decompõem problemas esparsos em muitos subproblemas pequenos e densos de álgebra linear. O principal autor do pacote, Tim Davis, é incrivelmente útil e um ótimo cara.

As bibliotecas de sub-rotinas Harwell são famosas por suas rotinas esparsas de álgebra linear e são gratuitas para usuários acadêmicos, embora você precise passar por esse processo de preenchimento de um formulário e de receber um e-mail para cada arquivo que deseja baixar. Como as sub-rotinas geralmente têm dependências, o uso de um solucionador pode exigir o download de cinco ou seis arquivos, e o processo pode ser entediante, principalmente porque a aprovação do formulário não é instantânea.

Também existem outros solucionadores de álgebra linear esparsos, mas até onde eu sei, o MUMPS e outros pacotes estão focados principalmente na solução de sistemas lineares, e resolver sistemas lineares é a menor das minhas preocupações no momento. (Talvez mais tarde, precisarei dessa funcionalidade e poderá ser útil para outras pessoas.)


2
Eu acho que você confundiu Eigen com Elemental; Eu não trabalhei em Eigen, apesar de estar muito impressionado com o projeto. O Elementar visa principalmente máquinas de memória distribuída.
Jack Poulson

3
Eu acho que minha primeira pergunta seria: você quer executar algo em paralelo?
Matt Knepley

1
Devo mencionar o Trilinos ... embora não tenha muita visibilidade aqui (ainda), é uma alternativa viável ao PETSc, com um pacote de matriz modelada, um eigensolver e um solucionador de matriz esparsa, também possui um pacote especificamente para abstrair a contabilidade de um algoritmo, embora eu não saiba o quão bem ele funciona.
Andrew Spott 12/12

1
Eigen parece ótimo - um colega meu o usou em um contexto profissional, e ele pode colocá-lo em funcionamento com rapidez suficiente sem sacrificar o desempenho.
Qdot

7
Eu também adicionaria as seguintes bibliotecas à sua resposta: ViennaCL - biblioteca de cabeçalho C ++ baseada em OpenCL que pode interagir com Eigen e MTL. PLASMA - um redesenho baseado em UTK das bibliotecas BLAS e LAPACK, apresentando decomposições baseadas em blocos. MAGMA - outro projeto UTK que se concentra em melhorar o desempenho do LAPACK / BLAS.
Aron Ahmadia

24

Este documento foi escrito em março de 2009 para ajudar na escolha de uma biblioteca de álgebra linear para uma biblioteca científica. Avalia a portabilidade, a interface de alto nível e o licenciamento de diversas bibliotecas, entre elas Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos e uBlas. Parece gostar particularmente de Flens e Seldon . (Um dos requisitos era o suporte a modelos C ++ e matrizes esparsas.)


17

De todos os projetos listados acima, existem realmente apenas dois pesos pesados ​​que são extremamente amplamente utilizados (e por boas razões): PETSc e Trilinos. Ambos são desenvolvidos profissionalmente e têm uma grande base de desenvolvedores. Todos os outros são projetos relativamente pequenos em comparação com esses dois, e eu recomendaria acompanhá-los porque (i) eles serão suportados por muito tempo e (ii) provavelmente já terão todas as funcionalidades que você precisará em relação a álgebra linear (e muito mais além disso).


4
O PETSc não apresenta muito mais do que uma interface ligeiramente abstrata para o ScaLAPACK e o PLAPACK. Se Geoff está interessado em álgebra linear densa conveniente, eu acho que é um exagero PETSc (Eu não sei o suficiente sobre as capacidades densas das Trilinos a comentar)
Aron Ahmadia

@AronAhmadia: Nesse momento, acho que a resposta se transformou em mais um recurso wiki da comunidade, e é por isso que venho adicionando pacotes a pedido dos comentaristas.
Geoff Oxberry

3
@WolfgangBangerth: Eu acho importante mencionar objetivos de design. Se o objetivo é escrever um software que seja duradouro e destinado a ser usado por outros, e a álgebra linear é parte integrante desse software, o PETSc e o Trilinos são boas escolhas. No entanto, há casos em que opções mais leves são preferíveis e úteis, porque possuem APIs mais simples e podem realizar quase a mesma tarefa em menos linhas de código. Finalmente, o viés de seleção desempenha um papel na sobrevivência dos códigos. Se ninguém usar os códigos menores, eles não durarão ou construirão uma base como PETSc e Trilinos.
precisa

1
Para adicionar o que Geoff disse, a grande maioria das funcionalidades do PETSc e Trilinos vem de invólucros em torno de bibliotecas externas. Dizer que ninguém deve usar as referidas bibliotecas externas diretamente me parece estranho.
Jack Poulson

1
@ JackPoulson: Na verdade, eu mantenho meu comentário. Sim, o PETSc envolve muitos pacotes individuais. Mas o faz com uma interface uniforme e, portanto, é mais simples aprender isso uma vez do que aprender as peculiaridades de cada convenção e estilo de nomenclatura de pacotes. Em outras palavras, embora cada projeto individual possa igualmente usar os pacotes embrulhados, há uma sinergia resultante do uso deles sempre no PETSc.
Wolfgang Bangerth

11

Se você quiser

  • Classes de matriz com uma interface intuitiva
  • Todos os recursos LAPACK e BLAS
  • API fácil de aprender e usar
  • Fácil de instalar

Então eu recomendo que você dê uma olhada na minha biblioteca FLENS . Eu o projetei exatamente para esse tipo de tarefa. No entanto, requer um compilador em conformidade com C ++ 11 (por exemplo, gcc 4.7 ou clang).

O FLENS oferece exatamente o mesmo desempenho que a implementação BLAS subjacente. Existem alguns benchmarks (bastante antigos) mostrando isso

O mesmo pode ser dito sobre o FLENS-LAPACK, que oferece exatamente o mesmo desempenho que o LAPACK do Netlib, se a mesma implementação do BLAS for usada.

Em relação aos novos benchmarks, deixe-me entrar em mais detalhes ...

Algum tempo atrás, perguntei a Clint Whaley (o autor do ATLAS) o que ele pensa sobre os benchmarks publicados no site da Eigen. Ele acabou de confirmar meu suspeito de que esses parâmetros de referência provavelmente não são confiáveis. Enquanto isso, alguns outros realizaram benchmarks da maneira que Clint sugeria. Detalhes podem ser encontrados no site ATLAS e na lista de distribuição Eigen. Os benchmarks não são bem apresentados em gráficos, mas mostram que o ATLAS é sempre cerca de 40% mais rápido que o Eigen. Isso contradiz os benchmarks do site Eigen, mas confirma outros benchmarks (por exemplo, aqueles do blaze-lib).

Observe que, para álgebra linear numérica densa, os produtos matriz-matriz são mais relevantes. Pessoalmente, não me importo se Eigen ou ATLAS é mais rápido. Se o Eigen fosse mais rápido que o ATLAS, eu o usaria como back-end do BLAS.

Disclaimer: Sim, FLENS é meu bebê! Isso significa que codifiquei cerca de 95% e todas as linhas de código valeram a pena :-)


Olá Michael, bem-vindo ao scicomp. Seu URL não está funcionando para mim. Há algo de errado com seu servidor?
Aron Ahmadia 29/09/12

Obrigado pela dica. O URL está correto, mas parece que estamos tendo um problema no departamento de matemática com o servidor de arquivos. Apenas a tempo para o fim de semana ...
Michael Lehn

1
Ok, eu só criou nova documentação a partir do repo git atual e copiados-lo em outro servidor: apfel.mathematik.uni-ulm.de/~lehn/FLENS/index.html
Michael Lehn



1

Qual seria a melhor biblioteca de matrizes para lidar com matrizes de tamanho pequeno, que são comumente usadas, por exemplo, ao montar matrizes de elementos finitos, para executar operações de tensores e assim por diante.

Eu já estou usando o PETSc para a solução dos grandes sistemas lineares esparsos que surgem no meu aplicativo, mas atualmente estou usando minha própria biblioteca simples para lidar com essas matrizes / vetores ... Estou pensando em mudar para uma biblioteca mais rápida como os mencionados acima.

Qual seria a melhor escolha para se juntar ao PETSc? Eigen? Tatu? IMPULSO :: uBlas? MTL4? Eu uso algumas coisas do BOOST, então, primeiro pensei em usar o BOOST :: uBlas, mas não há muita documentação, exemplos e assim por diante ...


2
Eu recomendo fortemente o uso do uBlas, pois é conhecido por uma ordem de magnitude mais lenta que as rotinas BLAS otimizadas. Eu acho que Eigen brilha mais por matrizes muito pequenas devido a truques de modelos inteligentes.
Jack Poulson

1
Provavelmente é melhor para uma pergunta separada. Eu sei que Eigen, MTL4 e Armadillo têm truques para resolver sistemas de tamanho pequeno, mas acho que você está perguntando como montar matrizes e, por isso, não sei. Normalmente, montei matrizes elemento por elemento. Não tenho certeza se alguma das bibliotecas mencionadas é boa para se conectar ao PETSc; Ainda não sou usuário do PETSc. Eu repito o comentário de Jack sobre o Boost :: uBlas, porque é lento.
Geoff Oxberry

1

Armadillo, Boost e outros agora incluídos como parte do Ceemple, um ambiente rápido de computação técnica em C ++ baseado em JIT. Disponível (gratuito) em http://www.ceemple.com .


0

Surpreendido, ninguém mencionou TooN até agora. Felizmente, usá-lo há quase 3 anos.

É muito semelhante ao Eigen, embora não seja tão abrangente. No entanto, acho que tem a melhor sintaxe de algumas maneiras.

Ele também vem com classes que ajudam a modelar transformações comuns que são frequentemente encontradas em Gráficos e Visão, baseadas em Grupos de Mentiras (Euclidiano Especial / Ortogonal em 2 e 3 dimensões, etc.) e Álgebras de Mentiras associadas.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.