C ++ moderne en informatique scientifique?

22

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.

Becko
la source
2
Demandez-vous «moderne» dans le sens de ce qui est considéré comme la meilleure pratique de nos jours (vs il y a 20 ans), ou «moderne» dans le sens spécifique de C ++ 11/14?
Kirill
2
@Kirill, je suppose que c'est les deux. Surtout quelque chose qui utilise C ++ 11/14, mais en suivant les meilleures pratiques.
Becko

Réponses:

11

Deux exemples de bibliothèques qui utilisent des constructions C ++ modernes:

  • Les bibliothèques propres et tatou (algèbre linéaire) utilisent plusieurs constructions C ++ modernes. Par exemple, ils utilisent les deux modèles d'expression pour simplifier les expressions arithmétiques et peuvent parfois éliminer certains temporaires:

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)

  • La bibliothèque CGAL (géométrie informatique) utilise de nombreuses fonctionnalités C ++ modernes (elle utilise fortement des modèles et des spécialisations):

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 :

  • combien de lignes de code dans le programme?
  • combien de classes / modèles?
  • temps de course?
  • consommation de mémoire?

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?

BrunoLevy
la source
2
Il en va de même pour Armadillo et Eigen, non?
dr.blochwave
Oui, vous avez raison (je viens de vérifier la documentation d'Armadillo, je la connais moins). J'édite le post.
BrunoLevy
1
Des temps de compilation plus longs sont un autre coût qui mérite d'être mentionné.
Kirill
@Kirill, oui bon point (édité le post pour le mentionner), merci.
BrunoLevy
10

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.

Fred
la source
OpenFOAM également - utilisation assez étendue des modèles.
tpg2114
1
deal.II n'utilise pas la sémantique de déplacement (car il s'abstient d'utiliser les fonctionnalités du langage C ++ 11 - mais il utilise les fonctionnalités de la bibliothèque C ++ 11 pour lesquelles il existe des remplacements dans BOOST pour les anciens compilateurs). Il utilise à peu près toutes les autres fonctionnalités du langage C ++, y compris toutes celles posées dans la question d'origine.
Wolfgang Bangerth
Il ne semble pas facile de regarder une grande bibliothèque en détail.
Michael
7

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 .

SteveL
la source
Bienvenue sur scicomp.se! Si vous ajoutez des liens ou citez des articles / livres / articles de blog qui traitent de cette bibliothèque pour le calcul scientifique, je voterai avec plaisir votre réponse!
hardmath
5

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 ++.

Bill Greene
la source
4

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.

Christian Waluga
la source
3

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!

mirams
la source
1

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.

Ramy Elkady
la source
0

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 constexprmodè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

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

Pour plus de détails, consultez leur page de démarrage .

Henri Menke
la source