Je recherche des livres ou des articles, ou des articles de blog, ou tout matériel publié en général, qui traitent spécifiquement des utilisations des fonctionnalités modernes C ++ (déplacer la sémantique, la STL, les itérateurs, l'évaluation paresseuse, etc.) dans le calcul scientifique. Pouvez-vous en suggérer?
Je pense que ces nouvelles fonctionnalités faciliteront l'écriture de code efficace, mais je n'ai pas trouvé de vrais exemples. La plupart des références que j'ai lues concernent les utilisations génériques de C ++ et ne contiennent pas d'exemples de calcul scientifique. Je recherche donc des exemples (ne doivent pas être des exemples de code de production, juste des exemples pédagogiques, au niveau, par exemple, des recettes numériques) de code de calcul scientifique utilisant des fonctionnalités modernes C ++.
Notez que je ne pose pas de questions sur les bibliothèques qui utilisent ces fonctionnalités. Je demande des articles / livres / etc expliquant comment je peux exploiter ces fonctionnalités dans le calcul scientifique.
la source
Réponses:
Deux exemples de bibliothèques qui utilisent des constructions C ++ modernes:
http://eigen.tuxfamily.org
http://arma.sourceforge.net/
http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (présentation sur les modèles d'expression dans Armadillo)
http://www.cgal.org
Remarque:
Les constructions C ++ modernes sont très élégantes et peuvent être très amusantes à utiliser. C'est à la fois un point fort et une faiblesse: lors de leur utilisation, il est si tentant d'ajouter plusieurs couches de modèles / spécialisations / lambdas qu'au final, vous obtenez parfois plus "d'administration" que de code efficace dans le programme (en d'autres termes, votre programme "parle" davantage du problème que de la description de la solution). Trouver le bon équilibre est très subtil. Conclusion: il faut suivre l'évolution du rapport "signal / bruit" dans le code en mesurant :
Tout ce qui augmente les deux premiers peut être considéré comme un coût (car cela peut rendre le programme plus difficile à comprendre et à maintenir), tout ce qui diminue les deux derniers est un gain .
Par exemple, l'introduction d'une abstraction (une classe virtuelle ou un modèle) peut factoriser le code et rendre le programme plus simple ( gain ), mais s'il n'est jamais dérivé / instancié une seule fois, il introduit un coût pour aucun gain associé (encore une fois, il est subtile car le gain peut venir plus tard dans l'évolution future du programme, il n'y a donc pas de "règle d'or").
Le confort du programmeur est également un facteur important à prendre en compte dans l'équilibre coût / gain: avec trop de modèles, le temps de compilation peut augmenter considérablement et les messages d'erreur deviennent difficiles à analyser.
Voir également
Dans quelle mesure les génériques et la méta-programmation utilisant des modèles C ++ sont-ils utiles en science informatique?
la source
Je suggère de jeter un œil à Deal.II. Il utilise la STL, ses propres itérateurs, pointeurs partagés, etc.
Les différents solveurs linéaires peuvent utiliser les différentes matrices en raison de la façon dont il a été conçu. Je n'ai rencontré aucune utilisation de la sémantique des mouvements, mais cela ne signifie pas qu'ils ne sont pas là. Voici un lien.
la source
La bibliothèque HPX fait un usage intensif d'une gamme de fonctionnalités C ++ 11 telles que les constructeurs de déplacement et vise également à être une implémentation complète de N4409 (Working Draft, Technical Specification for C ++ Extensions for Parallelism).
Ils ont une liste de publications sur leur site qui comprend un certain nombre d'exemples d'utilisation de la bibliothèque pour accélérer le calcul scientifique. Il y a aussi une discussion très intéressante sur la bibliothèque et son utilisation du C ++ moderne dans cet épisode CppCast .
la source
Je suggère de jeter un œil au C ++ scientifique et d'ingénierie: une introduction avec des techniques avancées et des exemples de Barton et Nackmann .
Le fait que ce livre ait été publié en 1994 donne l'impression qu'il viole votre critère des «techniques modernes». Cependant, Barton et Nackmann étaient à la pointe de ce qui était possible avec les modèles C ++ à l'époque et les techniques innovantes qu'ils ont conçues pour obtenir de bonnes performances sont toujours utilisées dans les dernières bibliothèques de classes C ++.
la source
Outre deal.ii (qui a déjà été suggéré ici), vous pouvez également consulter la bibliothèque Dune qui utilise largement certaines fonctionnalités avancées C ++ comme la métaprogrammation de modèles, les plages d'itérateurs, les pointeurs intelligents, etc. Il existe également une préimpression récente de Joachim Schöberl, qui commente l'utilisation des fonctionnalités C ++ 11, comme par exemple les fonctions lambda, pour simplifier la mise en œuvre des méthodes des éléments finis dans NGSolve. Renforcera également quelques bibliothèques liées à la programmation scientifique comme uBLAS, Graph, etc. Je suppose que dans la plupart de ces bibliothèques, vous trouverez de bons exemples d'utilisation moderne de C ++. Cependant, sachez que vous pouvez également rencontrer de mauvais exemples d'utilisation de C ++ avancé / moderne. Dans certains cas, en lisant le code / la documentation, j'ai eu le sentiment que parfois les choses sont largement trop généralisées pour montrer des compétences avancées comme TMP, où pour 99% de toutes les applications potentielles, une implémentation plus simple ferait également le emploi.
la source
Le livre "Guide to Scientific Computing in C ++" de Pitt-Francis & Whiteley a été écrit pour répondre exactement à ce genre de choses (utilisation de STL, itérateurs, etc.), il est disponible via Amazon , ou en tant que livre électronique de l'éditeur .
Divulgation - Je travaille dans le même groupe de recherche que les auteurs, mais je pense toujours que c'est une très bonne ressource pour cela!
la source
Je pense que ce livre est parfait pour vous, comme il l'a fait pour moi: Discovering Modern C ++: An Intensive Course for Scientists, Engineers, and Programmers (C ++ In-Depth) by Peter Gottschling particulièrement s'il est utilisé en conjonction avec les principes de programmation et la pratique de l'utilisation C ++ 2nd Edition Bjarne Stroustrup. L'inventeur du C ++ lui-même. Les deux devraient fournir un terrain solide pour se tenir debout.
la source
La bibliothèque Blaze pour l'algèbre linéaire fait un usage intensif de C ++ 14 sous la forme de types de retour déduits et finaux. Les autres fonctionnalités C ++ modernes utilisées sont les
constexpr
modèles d'alias et de nombreux métaprogrammations de modèles avec l'expression SFINAE.Vous pouvez également utiliser des listes d'initialisation pour vos vecteurs et matrices, par exemple
Pour plus de détails, consultez leur page de démarrage .
la source