C++ in den Naturwissenschaften



  • Guten Abend!

    Informatik und die Naturwissenschaften gehen ja immer weiter zusammen und es entstehen ganze Studiengänge wie Bioinformatik und ähliches.

    Gibt es denn hier Leute, die sich mit der Programmiersprache C++ in den Naturwissenschaften auskennen? Wie geläufig ist sie hier und kann es helfen sie zu erlernen?

    Würde mich über ein paar Ratschläge freuen. 🙂


  • Mod

    In den Teilen der Naturwissenschaften, die richtig harte Numerik machen (d.h. Dinge, die mehr als ein paar CPU-Stunden brauchen), ist C++ sehr geläufig. Aber beim Studium selbst wird dir dies nicht viel nutzen, da du so etwas dort nicht machst. Man lässt keine ganzen Hörsäle voll Studenten teure Supercomputerrechenzeit verbraten. Das machst du bloß als Einzelkämpfer in einer Bachelor-/Master-/Doktorarbeit, wenn du dich für genau so ein Thema entscheidest.

    Falls du im Studium programmierst, wird das in der Programmiersprache gemacht werden, die der jeweilige Prof oder Fachbereich gerade gut findet, was so ziemlich alles sein kann, auch C++. Da ist es auch völlig egal, ob du die jeweils tollsten Tricks beherrscht, oder nur die Grundlagen. Es kann in solchen Fällen helfen, wenn man allgemein programmieren kann. Denn wenn man das erst einmal grundsätzlich kann, dann kommt man recht schnell in neue Sprachen rein.

    Vielleicht überschätzt du auch, wie viel praktisches Programmieren im Studium vorkommt. Gerade die informatisch angehauchten Studiengänge sind primär immer noch Mathematik und sonstiges Wissen des Fachgebiets. Programmieren mag da als Handwerkszeug eine gewisse Rolle spielen, aber diese ist, bis auf eventuelle Programmierkurse, nur Nebensache. Ganz besonders wenn es auch noch um Spezialwissen über bestimmte Sprachen geht.



  • Hey Seppj,

    danke für eine so schnelle und ausführliche Antwort!

    Verstehe, das macht Sinn. Es wird in den Naturwissenschaften dann wohl eher auf die allgemeinen Programmierkenntnisse ankommen.

    Welche naturwissenschaftlichen Gebiete sind es denn, die viel Numerik machen?


  • Mod

    @cpluschris sagte in C++ in den Naturwissenschaften:

    Welche naturwissenschaftlichen Gebiete sind es denn, die viel Numerik machen?

    Das gibt es in allen als Unterbereich. Gibt halt tendenziell überall Leute, die eher praktische Experimente machen, solche die eher reine Theorie machen, und solche, die mit den Theorien rechnen.

    Obiges gilt nur für die "richtigen" Naturwissenschaften. In reiner Mathematik und Informatik hat man kaum Experimente, auch keine simulierten. Das heißt, dass ironischerweise die praktische Numerik in Mathematik und Informatik gar keine so große Rolle spielt, obwohl alle numerischen Methoden diesen beiden Gebieten entspringen.



  • Auf Clustern werden drei wesentliche Techniken benutzt, um Programme zu parallelisieren: OpenMP, MPI und GPGPU Parellisierung (entweder CUDA oder OpenCL je nachdem vom welchen Hersteller die Karten sind, wobei CUDA verbreiteter ist.). OpenMP und MPI sind für die Programmiersprachen C, C++ und Fortran erhältlich, bei anderen Sprachen muss man Wrapper um das C bzw. C++ Interface herum bauen. Deshalb sind diese drei Sprachen sehr verbreitet bei den Wissenschaften, die häufig auf Clustern rechnen. Die Masse an Rechenzeit verbrauchen üblicherweise theoretische Physiker und theoretische Chemiker. Wenn es Dich interessiert, die Cluster veröffentlichen üblicherweise Jahresberichte in denen die Projekte auf dem Clustern kurz angerissen werden, damit die Investition in den Clustern begründet wird. Es lohnt sich daher mal einen Blick in so einen Bericht zu verwerfen.

    Was ich auch erlebt habe, dass es Einzelkämpfer gibt, die dann feststellen, dass ihr Programme auf dem PC/Workstation zu langsam läuft und sie dann „verzweifelt“ versuchen das Programm schneller laufen zu lassen. Beliebt in so einem Kontext ist da Matlab. Nur auf dem Cluster hat man dann das Problem, dass man zig Lizenzen für Matlab brauchen würde.

    MPI ist die Standardtechnik um Programm zwischen Cluster-Knoten zu parallelisieren. Es kommt daher bei allen Programmen vor, die auf mehr als einem Knoten arbeiten. Niemand macht da direkte Netzwerkprogrammierung, das wird alles über MPI abstrahiert. MPI hat üblicherweise auch Treiber um wahlweise über Ethernet oder Infiniband zu funktionieren. IB ist wegen der geringeren Latenz häufiger anzutreffen. Der springende Punkt ist, man muss sich in seinem Programm mit MPI Code nicht darum kümmern, was für eine Netzwerktechnologie genutzt wird.

    Nach meiner persönlichen Erfahrungen sowohl mit C, C++ und Fortran hat man bei naturwissenschaftlichen Code die schnellsten Ergebnisse, wenn man Fortran nutzt. Die Ablaufgeschwindigkeit der Programme sind i.d.R. bei allen drei Sprachen vergleichbar, wenn man weiß was man tut. C++ ist eine Alternative zu Fortran, von C würde ich persönlich für neue Projekte die Finger lassen, da schlägt man sich zu sehr mit Niederungen der Sprache herum, die beim eigentlichen Problem nicht hilfreich sind.

    Zu Fortran gibt es aktuelle Literatur:
    FORTRAN FOR SCIENTISTS & ENGINEERS; Stephan J. Chapman, Amazon versucht einem unbedingt die sehr teure Hardcover Version anzudrehen, es gibt ein günstiges Paperback für einen Bruchteil des Preises (ca. €186 das Hardback das Paperback gibt es für ca. €64 ISBN 978-1-260-08417-7 sonst findet man das fast nicht)
    Modern Fortran Explained: Incorporating Fortran 2018; Michael Metcalf

    Das Buch von Chapman ist Anfänger verträglicher.



  • @SeppJ sagte in C++ in den Naturwissenschaften:

    Das heißt, dass ironischerweise die praktische Numerik in Mathematik und Informatik gar keine so große Rolle spielt, obwohl alle numerischen Methoden diesen beiden Gebieten entspringen.

    Das finde ich interessant! Macht aber auch Sinn, wenn man bedenkt, dass in der Mathematik selber kaum Experimente durchgeführt werden.



  • @john-0 sagte in C++ in den Naturwissenschaften:

    Das Buch von Chapman ist Anfänger verträglicher.

    Vielen Dank für die Buchempfehlung! Da werde ich mal reinschauen. Fortran ist mir tatsächlich neu und da muss ich mal einen Blick drauf werfen.



  • Also in (experimentellen) HEP war lief das oft anders ab. Wir hatten das WLCG zum Rechnen. Da läuft es so, dass man nicht das Analyseprogramm selbst parallelisiert, sondern die zu prozessierenden Daten aufteilt und somit das Programm x-mal auf einem x-tel der Daten laufen lässt und am Ende die Ergbnisse zusammenjoint. Ein Prozessierungsjob wurde ins Grid submitted und lief dann auf einem der Rechenzentren, wo die Daten eben gerade lagen. Nach einiger Zeit wusste man dann schon, bei welchen Rechenzentren die Jobs eher abgebrochen wurden oder ewig in der Queue waren oder nur sehr langsam liefen - und wo es schnell und zuverlässig ging. Die Rückgabedaten waren dann hoffentlich so klein, dass man sie lokal prozessieren konnte. Es gab auch kleinere Datenskims auf dem lokalen Cluster, wo man natürlich viel schneller und zuverlässiger arbeiten konnte. Insbesondere hatte das lokale RZ die Daten, die man für die meisten Analysen benötigte - nämlich die, mit denen die lokalen Forschungsgruppen oft gearbeitet haben. Nur manchmal musste man eben in den sauren Apfel beißen und sich Daten von anderswo besorgen.

    Code war alles mit C++ und Python, aber die von @john-0 genannten Techniken haben wir dabei nicht eingesetzt. Wenn du mal einen Blick auf die Experimentsoftware haben willst: https://github.com/cms-sw/cmssw - aber keine Angst, man muss sich dann ja nur in einem Teilbereich, den man gerade bearbeitet, auskennen.

    Und die spätere Analyse, nachdem man dann einen ordentlichen Datensatz hatte, haben wir damals mit C++ und ROOT geschrieben, aber inzwischen hat Python ganz erheblich an Bedeutung gewonnen - man will sich beim Plotten und Histogrammerstellen etc. ja nicht mit Speicherlecks auseinandersetzen müssen - und außerdem ist Stringbehandlung in C++ immer nervig.

    Was ich damit sagen will: was du genau brauchst, hängt sehr stark von deinem konkreten Studiengang - und dann sogar noch der fachlichen Ausrichtung ab!



  • @wob sagte in C++ in den Naturwissenschaften:

    Also in (experimentellen) HEP war lief das oft anders ab. Wir hatten das WLCG zum Rechnen. Da läuft es so, dass man nicht das Analyseprogramm selbst parallelisiert, sondern die zu prozessierenden Daten aufteilt und somit das Programm x-mal auf einem x-tel der Daten laufen lässt und am Ende die Ergbnisse zusammenjoint.

    Der Ansatz der Trivialparallelisierung. Dann braucht man kein MPI oder OpenMP. Der Code läuft zudem auch auf unterschiedlichen Systemen, weshalb keine große Anpassung an die Hardware erfolgt. Daher wird auch kein SIMD Code genutzt.

    Und die spätere Analyse, nachdem man dann einen ordentlichen Datensatz hatte, haben wir damals mit C++ und ROOT geschrieben, aber inzwischen hat Python ganz erheblich an Bedeutung gewonnen - man will sich beim Plotten und Histogrammerstellen etc. ja nicht mit Speicherlecks auseinandersetzen müssen - und außerdem ist Stringbehandlung in C++ immer nervig.

    Auf dem Desktop wird NumPy immer wichtiger, aber da sind die wichtigen PlugIns auch in C++ geschrieben.

    P.S. Bei wir war's DFT mit selbstgeschriebenem Code von Prof. In der Uni wurde auch WIEN2k und imho auch cp2k eingesetzt. Die Chemiker haben oftmals Gaussian genutzt, und noch etwas anderes dessen Name ich vergessen habe.



  • @wob sagte in C++ in den Naturwissenschaften:

    Code war alles mit C++ und Python

    Genau, Python ist mir in der Uni bereits untergekommen. Interessant, dass C++ damit in manchen Fällen wohl auch kombiniert wird.



  • Das beste Schachprogramm der Welt, nämlich Stockfish 12 ist in C++ programmiert.
    https://github.com/official-stockfish/Stockfish

    ... und auch Teile von lc0, dem zweitbesten.
    https://github.com/LeelaChessZero/lc0



  • @cpluschris sagte in C++ in den Naturwissenschaften:

    uten Abend!
    Informatik und die Naturwissenschaften gehen ja immer weiter zusammen und es entstehen ganze Studiengänge wie Bioinformatik und ähliches.
    Gibt es denn hier Leute, die sich mit der Programmiersprache C++ in den Naturwissenschaften auskennen? Wie geläufig ist sie hier und kann es helfen sie zu erlernen?
    Würde mich über ein paar Ratschläge freuen.

    Ich denke, wenn du C++ verstehst, verleiht es dir mehr Glaubwürdigkeit, und ich glaube auch, dass die Leute in der Bioinformatik dazu tendieren, sich für R/Phython zu entscheiden. Ich denke, wenn man als echter Programmierer betrachtet werden will, muss man C++ verstehen können.



  • @Estra sagte in C++ in den Naturwissenschaften:

    Ich denke, wenn man als echter Programmierer betrachtet werden will, muss man C++ verstehen können.

    Das ist Quatsch mit Soße. Ich kenne viele gute Programmierer, die noch nie was mit C++ gemacht haben und C++ auch nicht versehen (müssen). Dies betrifft einen Großteil der Webentwickler.



  • Ja ich denke das , was die meisten hier gesagt haben ist, dass man die Grundzüge des Programmierens kennen sollte. Je nach Anwendungsgebiet variiert dann auch die Programmiersprache und in manchen Fällen kann das dann C++ sein.


Anmelden zum Antworten