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.
fonte
Respostas:
Dois exemplos de bibliotecas que usam construções modernas em C ++:
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)
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 :
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?
fonte
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.
fonte
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 .
fonte
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.
fonte
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.
fonte
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!
fonte
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.
fonte
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
Para mais detalhes, consulte a página de introdução .
fonte