Modernes C ++ im wissenschaftlichen Rechnen?


22

Ich bin auf der Suche nach Büchern, Artikeln, Blog-Posts oder allgemein veröffentlichtem Material, das sich speziell mit der Verwendung moderner C ++ - Funktionen (Bewegungssemantik, STL, Iteratoren, verzögerte Auswertung usw.) im wissenschaftlichen Rechnen befasst. Kannst du welche vorschlagen?

Ich denke, dass diese neuen Funktionen das Schreiben von effizientem Code erleichtern werden, aber ich habe keine wirklichen Beispiele gefunden. Die meisten Referenzen, die ich gelesen habe, beziehen sich auf allgemeine Verwendungen von C ++ und enthalten keine Beispiele für wissenschaftliches Rechnen. Ich suche also nach Beispielen (müssen keine Beispiele für Produktionscodes sein, sondern nur pädagogische Beispiele auf der Ebene von beispielsweise numerischen Rezepten) für wissenschaftlichen Computercode mit modernen C ++ - Funktionen.

Beachten Sie, dass ich nicht nach Bibliotheken frage, die diese Funktionen verwenden. Ich frage nach Artikeln / Büchern / usw., in denen erklärt wird, wie ich diese Funktionen im wissenschaftlichen Rechnen nutzen kann.


2
Fragen Sie nach "modern" im Sinne von "Best Practice" (vor 20 Jahren) oder "modern" im Sinne von C ++ 11/14?
Kirill

2
@Kirill Ich denke, es ist beides. Meistens etwas, das C ++ 11/14 verwendet, aber Best Practices befolgt.
Becko

Antworten:


11

Zwei Beispiele für Bibliotheken, die moderne C ++ - Konstrukte verwenden:

  • Sowohl die Eigen- als auch die Gürteltierbibliothek (lineare Algebra) verwenden mehrere moderne C ++ - Konstrukte. Beispielsweise verwenden sie beide Ausdrucksvorlagen, um arithmetische Ausdrücke zu vereinfachen, und können manchmal einige temporäre Ausdrücke eliminieren:

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (Präsentation zu Ausdrucksvorlagen in Armadillo)

  • Die CGAL-Bibliothek (Computational Geometry) verwendet viele moderne C ++ - Funktionen (es werden häufig Vorlagen und Spezialisierungen verwendet):

http://www.cgal.org

Hinweis:

Moderne C ++ - Konstrukte sind sehr elegant und können sehr unterhaltsam sein. Es ist sowohl eine Stärke als auch eine Schwäche: Wenn Sie sie verwenden, ist es so verlockend, mehrere Ebenen von Vorlagen / Spezialisierungen / Lambdas hinzuzufügen, dass Sie am Ende manchmal mehr "Administration" als effektiven Code im Programm erhalten (mit anderen Worten, Ihr Programm "spricht" mehr über das Problem als über die Beschreibung der Lösung. Das richtige Gleichgewicht zu finden ist sehr subtil. Schlussfolgerung: Man muss die Entwicklung des "Signal / Rausch" -Verhältnisses im Code verfolgen, indem man misst :

  • Wie viele Codezeilen im Programm?
  • Wie viele Klassen / Vorlagen?
  • Laufzeit ?
  • Speicherverbrauch?

Alles, was die ersten beiden erhöht, kann als Kosten betrachtet werden (weil es das Programm möglicherweise schwieriger zu verstehen und zu warten macht), alles, was die letzten beiden verringert, ist ein Gewinn .

Beispielsweise kann das Einführen einer Abstraktion (einer virtuellen Klasse oder einer Vorlage) den Code faktorisieren und das Programm vereinfachen ( gain ). Wenn sie jedoch niemals nur einmal abgeleitet / instanziiert wird, entstehen Kosten für keinen damit verbundenen Gewinn (wiederum ist dies der Fall) subtil, weil der Gewinn später in der zukünftigen Entwicklung des Programms eintreten kann, daher gibt es keine "goldene Regel").

Der Komfort des Programmierers ist auch ein wichtiger Faktor, der beim Kosten-Nutzen-Verhältnis berücksichtigt werden muss: Bei zu vielen Vorlagen kann sich die Kompilierungszeit erheblich verlängern und das Parsen von Fehlermeldungen erschweren.

Siehe auch

Inwieweit ist generische und Metaprogrammierung mit C ++ - Vorlagen in der Computerwissenschaft nützlich?


2
Gleiches gilt für Armadillo und Eigen, nein?
dr.blochwave

Ja, Sie haben Recht (ich habe gerade Armadillos Dokumentation eingecheckt, bin weniger vertraut damit). Ich bearbeite den Beitrag.
BrunoLevy

1
Längere Übersetzungszeiten sind ebenfalls erwähnenswert.
Kirill

@Kirill, ja guter Punkt (bearbeitet den Beitrag, um es zu erwähnen), danke.
BrunoLevy

10

Ich würde vorschlagen, sich Deal.II anzuschauen. Es verwendet die STL, eigene Iteratoren, gemeinsame Zeiger usw.

Die verschiedenen linearen Löser können die verschiedenen Matrizen aufgrund ihres Aufbaus verwenden. Ich habe keine Verwendung der Bewegungssemantik gefunden, aber das bedeutet nicht, dass sie nicht vorhanden sind. Hier ist ein Link.


Auch OpenFOAM - ziemlich umfangreicher Gebrauch von Vorlagen.
tpg2114

1
deal.II verwendet keine Verschiebungssemantik (weil es auf die Verwendung von C ++ 11-Sprachfeatures verzichtet - aber es verwendet C ++ 11-Bibliotheksfeatures, für die es in BOOST Ersetzungen für ältere Compiler gibt). Es werden jedoch so ziemlich alle anderen C ++ - Sprachfunktionen verwendet, einschließlich aller in der ursprünglichen Frage gestellten.
Wolfgang Bangerth

Es scheint nicht einfach zu sein, eine große Bibliothek im Detail zu betrachten.
Michael

7

Die HPX- Bibliothek nutzt eine Reihe von C ++ 11-Funktionen wie Move-Konstruktoren und strebt eine vollständige Implementierung von N4409 (Working Draft, Technische Spezifikation für C ++ - Erweiterungen für Parallelität) an.

Sie haben eine Liste von Veröffentlichungen auf ihrer Website, die eine Reihe von Beispielen für die Verwendung der Bibliothek zur Beschleunigung der wissenschaftlichen Berechnung enthält. Es gibt auch eine so interessante Diskussion über die Bibliothek und ihre Verwendung von modernem C ++ in dieser CppCast-Episode .


Willkommen bei scicomp.se! Wenn Sie Links hinzufügen oder einige Artikel / Bücher / Blog-Beiträge zitieren, in denen diese Bibliothek für wissenschaftliche Berechnungen behandelt wird, stimme ich Ihrer Antwort gerne zu!
Hardmath

5

Ich schlage vor, einen Blick auf Scientific and Engineering C ++ zu werfen: Eine Einführung mit fortgeschrittenen Techniken und Beispielen von Barton und Nackmann .

Die Tatsache, dass dieses Buch 1994 veröffentlicht wurde, scheint Ihr Kriterium der "modernen Techniken" zu verletzen. Barton und Nackmann waren jedoch auf dem neuesten Stand der Möglichkeiten, die mit C ++ - Vorlagen zu dieser Zeit möglich waren, und die innovativen Techniken, die sie für eine gute Leistung entwickelten, werden in den neuesten C ++ - Klassenbibliotheken immer noch verwendet.


4

Neben deal.ii (das hier bereits vorgeschlagen wurde) können Sie sich auch die Dune- Bibliothek ansehen, die einige erweiterte C ++ - Funktionen wie Template-Metaprogrammierung, Iteratorbereiche, intelligente Zeiger usw. ausführlich nutzt. Es gibt auch einen aktuellen Preprint von Joachim Schöberl, der die Verwendung von C ++ 11-Funktionen, wie zum Beispiel Lambda-Funktionen, zur Vereinfachung der Implementierung der Finite-Elemente-Methoden in NGSolve kommentiert. BoostAußerdem gibt es einige Bibliotheken, die sich mit wissenschaftlicher Programmierung befassen, wie uBLAS, Graph usw. Ich denke, in den meisten dieser Bibliotheken finden Sie gute Beispiele für die Verwendung von modernem C ++. Beachten Sie jedoch, dass Sie möglicherweise auch auf schlechte Beispiele für die Verwendung von Advanced / Modern C ++ stoßen. In einigen Fällen hatte ich beim Lesen des Codes / der Dokumentation das Gefühl, dass die Dinge gelegentlich stark verallgemeinert sind, um fortgeschrittene Fähigkeiten wie TMP zu demonstrieren, wobei für 99% aller potenziellen Anwendungen auch eine einfachere Implementierung das tun würde Job.


3

Das Buch "Leitfaden zum wissenschaftlichen Rechnen in C ++" von Pitt-Francis & Whiteley wurde geschrieben, um genau diese Fragen zu beantworten (Verwendung von STL, Iteratoren usw.). Es ist über Amazon oder als E-Book beim Verlag erhältlich .

Offenlegung - Ich arbeite in der gleichen Forschungsgruppe wie die Autoren, denke aber immer noch, dass es eine sehr gute Ressource dafür ist!


1

Ich denke, dass dieses Buch wie ich perfekt für Sie ist: Discovering Modern C ++: Ein Intensivkurs für Wissenschaftler, Ingenieure und Programmierer (C ++ In-Depth) von Peter Gottschling, insbesondere wenn es in Verbindung mit Programmierprinzipien und der Anwendung von Übungen verwendet wird C ++ 2nd Edition Bjarne Stroustrup. Der Erfinder von C ++. Beide sollten einen festen Boden zum Stehen bieten.


0

Die Blaze-Bibliothek für lineare Algebra nutzt C ++ 14 in Form von abgeleiteten und nachgestellten Rückgabetypen. Andere moderne C ++ - Funktionen, die verwendet werden constexpr, sind Alias-Vorlagen und eine ganze Reihe von Vorlagen-Metaprogrammierungen mit dem Ausdruck SFINAE.

Sie können auch Initialisierungslisten für Ihre Vektoren und Matrizen verwenden, z

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

Weitere Details finden Sie auf der Einstiegsseite .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.