C ++ moderno em computação científica?

22

Estou procurando por livros ou artigos, posts de blog ou qualquer material publicado em geral, que abordem especificamente os usos dos recursos modernos do C ++ (semântica de movimentos, STL, iteradores, avaliação lenta etc.) na computação científica. Você pode sugerir alguma?

Eu acho que esses novos recursos facilitarão a criação de código eficiente, mas não encontrei exemplos reais. A maioria das referências que li são sobre usos genéricos de C ++ e não contêm exemplos de computação científica. Portanto, estou procurando exemplos (não precisam ser exemplos de código de produção, apenas exemplos pedagógicos, no nível de, digamos, Receitas Numéricas) de código de computação científica usando recursos modernos de C ++.

Observe que não estou perguntando sobre bibliotecas que usam esses recursos. Estou perguntando sobre artigos / livros / etc, explicando como posso explorar esses recursos na computação científica.

becko
fonte
2
Você está perguntando sobre "moderno" no sentido do que se entende ser a melhor prática hoje em dia (vs 20 anos atrás) ou "moderno" no sentido especificamente de C ++ 11/14?
22415 Kirill
2
@ Kirill Eu acho que são os dois. Principalmente algo que usa C ++ 11/14, mas segue as melhores práticas.
Becko

Respostas:

11

Dois exemplos de bibliotecas que usam construções modernas em C ++:

  • As bibliotecas eigen e tatu (álgebra linear) usam várias construções modernas em C ++. Por exemplo, eles usam os dois modelos de expressão para simplificar expressões aritméticas e às vezes podem eliminar alguns temporários:

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (apresentação sobre modelos de expressão em Armadillo)

  • A biblioteca CGAL (geometria computacional) usa muitos recursos modernos do C ++ (usa fortemente modelos e especializações):

http://www.cgal.org

Nota:

construções modernas em C ++ são muito elegantes e podem ser muito divertidas de usar. É um ponto forte e um ponto fraco: ao usá-los, é tão tentador adicionar várias camadas de modelos / especializações / lambdas que, no final, você às vezes recebe mais "administração" do que código efetivo no programa (em outras palavras, seu programa "fala" mais sobre o problema do que descrever a solução). Encontrar o equilíbrio certo é muito sutil. Conclusão: é necessário rastrear a evolução da relação "sinal / ruído" no código medindo :

  • quantas linhas de código no programa?
  • quantas classes / modelos?
  • tempo de execução ?
  • consumo de memória?

Tudo o que aumenta os dois primeiros pode ser considerado como um custo (porque pode dificultar a compreensão e a manutenção do programa), tudo o que diminui os dois últimos é um ganho .

Por exemplo, a introdução de uma abstração (uma classe virtual ou um modelo) pode fatorar o código e tornar o programa mais simples ( ganho ), mas, se nunca for derivado / instanciado apenas uma vez, introduz um custo para nenhum ganho associado (novamente sutil porque o ganho pode vir mais tarde na evolução futura do programa; portanto, não existe uma "regra de ouro").

O conforto do programador também é um fator importante a ser levado em consideração no equilíbrio custo / ganho: com muitos modelos, o tempo de compilação pode aumentar significativamente e as mensagens de erro se tornam difíceis de analisar.

Veja também

Até que ponto é genérica e metaprogramação usando modelos C ++ útil em ciência da computação?

BrunoLevy
fonte
2
O mesmo vale para Tatu e Eigen, não?
dr.blochwave
Sim, você está certo (acabei de verificar a documentação do Armadillo, estou menos familiarizado com ela). Estou editando a postagem.
BrunoLevy
11
Tempos de compilação mais longos são outro custo que vale a pena mencionar.
28415 Kirill
@ Kirill, sim, bom ponto (editado o post para mencioná-lo), obrigado.
BrunoLevy
10

Eu sugeriria dar uma olhada no Deal.II. Ele usa o STL, iteradores próprios, ponteiros compartilhados, etc.

Os vários solucionadores lineares podem usar as várias matrizes devido à forma como foram projetados. Não encontrei nenhum uso de semântica de movimento, mas isso não significa que eles não estejam lá. Aqui está um link.

fred
fonte
Também OpenFOAM - uso bastante extenso de modelos.
tpg2114
11
O deal.II não usa a semântica de movimentação (porque evita usar os recursos da linguagem C ++ 11 - mas usa os recursos da biblioteca C ++ 11 para os quais há substituições no BOOST para compiladores mais antigos). No entanto, ele usa praticamente todos os outros recursos da linguagem C ++, incluindo todos os solicitados na pergunta original.
9609 Wolfgang Bangerth
Não parece fácil olhar para uma grande biblioteca em detalhes.
Michael
7

A biblioteca HPX faz uso pesado de uma variedade de recursos do C ++ 11, como os construtores de movimentação, e também pretende ser uma implementação completa do N4409 (rascunho de trabalho, especificação técnica de extensões do C ++ para paralelismo).

Eles têm uma lista de publicações em seu site, que inclui vários exemplos de uso da biblioteca para acelerar a computação científica. Também há uma discussão interessante da biblioteca e seu uso do C ++ moderno neste episódio do CppCast .

SteveL
fonte
Bem-vindo ao scicomp.se! Se você adicionar links ou citar alguns artigos / livros / postagens de blog que discutem esta biblioteca para computação científica, eu votarei feliz em sua resposta!
hardmath 25/07/2015
5

Sugiro dar uma olhada em Scientific and Engineering C ++: Uma introdução com técnicas avançadas e exemplos de Barton e Nackmann .

O fato de este livro ter sido publicado em 1994 parece violar seu critério de "técnicas modernas". No entanto, Barton e Nackmann estavam na vanguarda do que era possível com os modelos C ++ na época e as técnicas inovadoras que eles criaram para obter um bom desempenho ainda são usadas nas bibliotecas de classes C ++ mais recentes.

Bill Greene
fonte
4

Além do deal.ii (que já foi sugerido aqui), você também pode dar uma olhada na biblioteca do Dune , que faz uso extensivo de alguns recursos avançados do C ++, como metaprogramação de modelos, intervalos de iteradores, ponteiros inteligentes etc. Há também uma pré-impressão recente de Joachim Schöberl, que comenta o uso dos recursos do C ++ 11, como, por exemplo, funções lambda, para simplificar a implementação dos métodos de elementos finitos no NGSolve. Impulsotambém possui algumas bibliotecas relacionadas à programação científica, como uBLAS, Graph, etc. Acho que na maioria dessas bibliotecas você encontrará bons exemplos de uso moderno de C ++. No entanto, esteja ciente de que você também pode encontrar exemplos ruins do uso de C ++ avançado / moderno. Em alguns casos, ao ler o código / documentação, tive a sensação de que, ocasionalmente, as coisas são amplamente generalizadas para mostrar habilidades avançadas como o TMP, onde para 99% de todos os aplicativos em potencial uma implementação mais direta também faria o trabalho.

Christian Waluga
fonte
3

O livro "Guide to Scientific Computing in C ++", de Pitt-Francis & Whiteley, foi escrito para responder exatamente a esse tipo de coisa (uso de STL, iteradores etc.) que está disponível na Amazon ou como um e-Book da editora .

Divulgação - Eu trabalho no mesmo grupo de pesquisa que os autores, mas ainda acho que é um recurso muito bom para isso!

mirams
fonte
1

Acho que este livro é perfeito para você, como fez para mim: Descobrindo o C ++ moderno: um curso intensivo para cientistas, engenheiros e programadores (C ++ em profundidade) de Peter Gottschling, especialmente se usado em conjunto com os princípios de programação e a prática de uso C ++ 2ª Edição Bjarne Stroustrup. O inventor do próprio C ++. Ambos devem fornecer um terreno sólido para se apoiar.

Ramy Elkady
fonte
0

A biblioteca do Blaze para álgebra linear faz uso intenso do C ++ 14 na forma de tipos de retorno deduzido e à direita. Outros recursos modernos do C ++ em uso são constexpr, modelos de alias e muita metaprogramação de modelos com a expressão SFINAE.

Você também pode usar listas de inicializadores para seus vetores e matrizes, por exemplo

blaze::DynamicVector<int> x{ 4, -1, 3 };

Para mais detalhes, consulte a página de introdução .

Henri Menke
fonte