Pergunta

Eu estou escrevendo um software para equações diferenciais parciais hiperbólicas em C ++. Quase todas as notações são vetoriais e matriciais queridos. Em cima disso, eu preciso do solver álgebra linear. E sim, os do vetor e tamanhos de matriz pode variar consideravelmente (de por exemplo 1000 a tamanhos que podem ser resolvidos apenas pela memória computação distribuída, os clusters por exemplo. Ou arquitetura similar). Se eu tivesse vivido em utopia, eu tinha tido linear solver que dimensiona ótimo para clusters, GPUs e multicores.

Ao pensar sobre a estrutura de dados que devem representar as variáveis, eu vim accros os boost.ublas e MTL4. Ambas as bibliotecas são blas nível 3 compatíveis, MTL4 implementos escassa solver e é muito mais rápido do que ublas. Ambos não têm implementado o suporte para vários núcleos processadores, para não paralelização menção para cálculos de memória distribuída. Por outro lado, o desenvolvimento de MTL4 depende único esforço de 2 desenvolvedores (pelo menos que eu entendi), e tenho certeza que há uma razão que os ublas está na biblioteca impulso. Além disso, a biblioteca mkl da Intel inclui o exemplo para a ligação com a sua estrutura ublas. Eu gostaria de ligar os meus dados e software para a estrutura de dados que irá ser sólida rocha, desenvolvido e mantido por um longo período de tempo.

Finalmente, a questão. Qual é a sua experiência com o uso de ublas e / ou mtl4, e o que você recomendaria?

thanx, mightydodol

Foi útil?

Solução

Com suas necessidades, eu provavelmente ir para boost :: uBLAS . Na verdade, uma boa implantação de uBLAS deve ser mais ou menos a par com MTL4 sobre velocidade.

A razão é que existem ligações para ATLAS (paralelização de memória compartilhada, portanto, que você pode eficientemente otimizar o seu computador), e também implementações fornecedores afinado como o Intel Math Kernel Biblioteca ou HP MLIB .

Com estas ligações, uBLAS com uma biblioteca ATLAS / BLAS bem afinado fazer a matemática deve ser rápido o suficiente. Se você ligar com um determinado BLAS / ATLAS, você deve ser mais ou menos a par com MTL4 ligada contra os mesmos BLAS / ATLAS usando o sinalizador do compilador -DMTL_HAS_BLAS , e muito provavelmente mais rápido do que o MTL4 sem BLAS acordo com sua própria observação (exemplo Consulte aqui , onde GotoBLAS Supera MTL4).

Para resumir, a velocidade não deve ser o seu fator decisivo, desde que você está disposto a usar alguma biblioteca BLAS. Usabilidade e suporte é mais importante. Você tem que decidir, se MTL ou uBLAS é mais adequado para você. I tendem para uBLAS dado que é parte do impulso, e MTL4 atualmente suporta apenas BLAS seletivamente . Você também pode encontrar este ligeiramente datado de C ++ científica pacotes interessante .

Um grande MAS: para as suas necessidades (extremamente grandes matrizes), eu provavelmente iria ignorar as uBLAS "açúcar sintático" ou MTL, e chamar o "metal" de interface C de Blas / LAPACK diretamente. Mas isso é apenas me ... Outra vantagem é que ele deve ser mais fácil do que para mudar para ScaLAPACK (distribuído LAPACK memória, nunca usei) para problemas maiores. Só para ficar claro:. Para problemas casa-hold, eu não iria sugerir chamando uma biblioteca BLAS diretamente

Outras dicas

Se você está vetores de programação, matrizes e álgebra linear em C ++, eu olhar para Eigen:

http://eigen.tuxfamily.org/

É mais rápido do que uBLAS (não tenho certeza sobre MTL4) e sintaxe mais limpa muito.

Para novos projetos, provavelmente é melhor ficar longe de uBlas de impulso. O uBlas FAQ ainda tem este aviso desde o final de 2012:

Q: Devo usar uBLAS para novos projetos? ... a última grande melhoria da uBLAS foi em 2008 e nenhuma mudança significativa foi cometido desde 2009. ... Desempenho? Existem alternativas mais rápidas. Ponta? uBLAS é mais de 10 anos e perdeu todo o novo material do C ++ 11.

Há uma biblioteca C ++ faltando nesta lista: Flens

http://flens.sf.net

Disclaimer: Sim, este é meu bebê

  • É somente cabeçalho
  • Vem com um simples, não-performance, genérico (isto é modelada) implemenation C ++ referência de BLAS.
  • Se estiver disponível, você pode usar uma implementação BLAS otimizado como backend. Neste caso é como usar BLAS diretamente ( alguns benchmark devo atualizar ).
  • Você pode usar operadores sobrecarregados em vez de chamando funções BLAS .
  • Ele vem com seu próprio stand-alone, genérico re-implemenation de um monte de funções LAPACK. Chamamos esta porta Flens-LAPACK .
  • Flens-LAPACK tem exatamente a mesma precisão e desempenho como LAPACK de Netlib. E na minha experiência (FLENS-) LAPACK + ATLAS ou (FLENS-) LAPACK + OpenBLAS dá-lhe o mesmo desempenho que ACML ou MKL.
  • Flens tem uma política diferente em relação a criação de vetor temporário / matrizes na avaliação de expressões de álgebra linear. A política Flens é: nunca criá-los !!!. No entanto, em um -modo de depuração especial que permitem a criação de temporários "quando necessário". Este "quando necessário" coisa política é o padrão em outras bibliotecas como Eigen ou Armadillo ou em Matlab.

Você pode ver as diferenças de desempenho diretamente aqui: http://www.osl.iu.edu/research/ MTL / mtl4 / doc / performance.php3

Ambos são bibliotecas razoáveis, para utilizar em termos de suas interfaces, eu não acho que por causa uBLAS passou pelo processo de revisão impulso que é necessariamente muito mais robusto. Eu tive a minha quota de pesadelos com efeitos colaterais unobvious e consequências não intencionais de uBLAS implementações.

Isso não quer dizer uBLAS é ruim, é realmente bom, mas eu acho que dadas as performances dramáticas diferenças para MTL nos dias de hoje, vale a pena usá-lo em vez de uBLAS mesmo que é sem dúvida um pouco becuase mais arriscado do que é "apenas 2 desenvolvedor "grupo de apoio.

No final do dia, é sobre a velocidade com uma biblioteca matriz, ir com MTL4.

De minha própria experiência, MTL4 é muito mais rápido do que uBLAS e também é mais rápido do que Eigen.

Existe uma versão paralela de MTL4. Basta dar uma olhada simunova

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top