C ++ vs Fortran für HPC

56

In meinem PhD-Programm für Computerwissenschaften arbeiten wir fast ausschließlich in C ++ und Fortran. Es scheint, als würden einige Professoren einander vorziehen. Ich frage mich, welches "besser" ist oder ob eines unter bestimmten Umständen besser ist als das andere.

drjrm3
quelle
12
Eine Mischung aus High- und Low-Level-Sprache ist meiner Meinung nach besser, als beides ausschließlich zu verwenden. Ich benutze zB Python + C ++.
Faheem Mitha
2
Die Antworten auf diese Frage sind fast rein subjektiv und daher bin ich mir nicht sicher, ob diese Frage angemessen ist.
Jeff

Antworten:

61

Wie so oft hängt die Wahl von (1) dem Problem ab, das Sie lösen möchten, (2) den Fähigkeiten, die Sie haben, und (3) den Personen, mit denen Sie zusammenarbeiten (es sei denn, es handelt sich um ein Solo-Projekt). Ich werde (3) für den Moment beiseite lassen, weil es von der individuellen Situation eines jeden abhängt.

Problemabhängigkeit: Fortran zeichnet sich durch Array-Verarbeitung aus. Wenn sich Ihr Problem mit einfachen Datenstrukturen und insbesondere Arrays beschreiben lässt, ist Fortran gut geeignet. Fortran-Programmierer verwenden Arrays auch in nicht offensichtlichen Fällen (z. B. zur Darstellung von Diagrammen). C ++ eignet sich besser für komplexe und hochdynamische Datenstrukturen.

Fähigkeitsabhängigkeit: Um gute C ++ - Programme zu schreiben, ist viel mehr Programmiererfahrung erforderlich als um gute Fortran-Programme zu schreiben. Wenn Sie mit wenig Programmiererfahrung anfangen und nur so viel Zeit haben, um diesen Aspekt Ihres Jobs zu erlernen, erhalten Sie wahrscheinlich eine bessere Rendite für das Erlernen von Fortran als für das Erlernen von C ++. Vorausgesetzt natürlich, Ihr Problem passt zu Fortran.

Die Programmierung umfasst jedoch mehr als nur Fortran und C ++. Ich würde jedem empfehlen, der sich mit Computerwissenschaften beschäftigt, um mit einer dynamischen Hochsprache wie Python zu beginnen. Denken Sie immer daran, dass Ihre Zeit wertvoller ist als die CPU-Zeit!

khinsen
quelle
17
"Denken Sie immer daran, dass Ihre Zeit wertvoller ist als die CPU-Zeit!" Als jemand, der in HPC arbeitet, bin ich mit diesem Teil nicht einverstanden; Alles andere ist genau richtig.
Levi Morrison
19
"Denken Sie immer daran, dass Ihre Zeit wertvoller ist als die CPU-Zeit!" Als jemand, der in der wissenschaftlichen Forschung arbeitet, konnte ich diesem Teil nicht mehr zustimmen.
Decvalts
3
"Denken Sie immer daran, dass Ihre Zeit wertvoller ist als die CPU-Zeit!" - Ich würde gerne meine 2 Cent einwerfen - die Verwendung von mehreren hundert Knoten mit jeweils mehr als 10 Kernen, um ein Programm für mehrere Wochen auszuführen, kann als schreckliche Verschwendung einer äußerst kostbaren Ressource angesehen werden, wenn ein paar weitere Wochen zu einer Verschwendung führen könnten Code, der in nur wenigen Tagen ausgeführt wird. Diese HPC-Cluster sind eine seltene und teure gemeinsame Ressource.
Dani_l
"Denken Sie immer daran, dass Ihre Zeit wertvoller ist als die CPU-Zeit!", Code für eine Woche, aber einen Monat lang, das ist ganz normal, Sir!
Fronthem
6
"Denken Sie immer daran, dass Ihre Zeit wertvoller ist als die CPU-Zeit!", Ich würde lieber einen Monat lang programmieren und in einer Woche laufen! - mehr kann getan werden, sobald der Code geschrieben ist, und andere werden den Code, den Sie schreiben, auch nützlicher finden.
Charles
37

Ich denke, dass sowohl C ++ als auch Fortran gut genug sind und gut funktionieren.

Ich denke jedoch, dass Fortran besser für numerisches wissenschaftliches Rechnen geeignet ist , für Algorithmen, die mithilfe von Arrays ausgedrückt werden können und keine anderen komplexen Datenstrukturen benötigen, also in Bereichen wie finiten Differenzen / Elementen, PDE-Lösern und elektronischen Strukturberechnungen. Fortran ist eine domänenspezifische Sprache. Insbesondere denke ich, dass es einfacher ist, schnelle Programme in Fortran als in C ++ zu schreiben , und zwar von einem Wissenschaftler (nicht unbedingt einem Informatik-Experten).

C ++ ist eine Allzwecksprache, daher kann man jeden Algorithmus darin ausdrücken, und es ist definitiv besser für Algorithmen, die nicht mit Arrays ausgedrückt werden können, aus dem HPC-Feld, wahrscheinlich einige Graphen, Netzgeneratoren, symbolische Manipulationen und so weiter.

Es ist auch möglich, Array-Algorithmen in C ++ zu schreiben, aber meiner Erfahrung nach erfordert dies viel mehr Informatikkenntnisse und im Allgemeinen mehr Arbeit (dh man muss Klassen für die Array-Manipulation erstellen oder wiederverwenden und die Speicherverwaltung von Hand oder unter Verwendung einiger Methoden handhaben Bibliothek wie Teuchos von Trilinos). Nicht-Experten neigen dazu, ziemlich gute Fortran-Programme zu schreiben, aber schreckliche C ++ - Programme (aus eigener Erfahrung).

Haftungsausschluss: Ich persönlich mag Fortran sehr und ich bevorzuge es für numerische Berechnungen gegenüber C ++. Ich habe über 2 Jahre lang täglich in C ++ programmiert und fast ein Jahr lang täglich im modernen Fortran (im Bereich der finiten Elemente). Ich benutze auch viel Python und Cython.

Ondřej Čertík
quelle
1
Eins, bis die erste Antwort ausgeglichen ist. Ich denke, C ++ und Fortran sind bei weitem nicht die einzigen Möglichkeiten in der heutigen HPC. Ich denke, es ist gut, die Stärken und Schwächen zu kennen, wenn Sie sich für Fortran, C ++ oder Python (oder was auch immer Sie mögen) entscheiden. Ich habe 20.000 Linien von Fortran in einer einzigen Datei gesehen, die über einige Jahrzehnte organisch gewachsen sind. Ich persönlich würde nichts anderes als isoliertes Heavy-Array-Computing verwenden. Nicht einmal für irgendetwas, was mit Ausgabe zu tun hat. Soweit zu einem voreingenommenen Kommentar.
Shuhalo
6
Ich konnte dieser Antwort nicht mehr widersprechen. Unser Finite-Elemente-Code hätte in Fortran nicht geschrieben werden können. Tatsächlich begann es vor 15 Jahren als Mischung aus einfachem C und Fortran (letzteres für die zahlenintensiven Teile der Methode) und wechselte im Laufe mehrerer Jahre allmählich zu reinem C und dann zu C ++. Der Code wurde durchweg kürzer, schneller und verständlicher und war nach jeder Iteration leistungsfähiger. Ich stimme anderen zu, die darauf hinweisen, dass C ++ Ihnen viel Seil gibt, mit dem Sie sich selbst erschießen können. Wählen Sie die Sprache aus, mit der Sie sich am wohlsten fühlen.
Bill Barth
6
Bill, haben Sie das moderne Fortran (90 und spätere Ergänzungen?) Verwendet. Dies ist sehr wichtig (ich hätte diesbezüglich ausführlicher antworten sollen). Natürlich ist "20.000 Zeilen von Fortran" oder f77 normalerweise nicht besser als gut geschriebenes C ++.
Ondřej Čertík
1
@ OndřejČertík: Ich denke, wenn Sie glauben, dass moderne Finite-Elemente-Programme "einfache" Datenstrukturen verwenden, haben Sie sich in letzter Zeit keine davon angesehen. Versuchen Sie, adaptive finite Elemente, HP-Methoden oder Multigrid auf unstrukturierten Netzen mit einfachen Datenstrukturen zu implementieren. Bill ist genau richtig und ich glaube, ich kann für ihn sprechen, indem ich sage, dass die Verwendung von "modernem Fortran" kaum mehr als einen kleinen Unterschied gemacht hätte.
Wolfgang Bangerth
6
@WolfgangBangerth, siehe zum Beispiel Phaml ( math.nist.gov/phaml ) für eine Fortran-Implementierung von so ziemlich allem, was Sie erwähnt haben.
Ondřej Čertík
31

Ich werfe auch meine zwei Cent in letzter Zeit, aber ich habe gerade erst diesen Thread gesehen und ich habe das Gefühl, dass es für die Nachwelt ein paar Punkte gibt, die dringend hervorgehoben werden müssen.

Beachten Sie im Folgenden, dass ich über C und nicht über C ++ sprechen werde. Warum? Ansonsten ist es Äpfel und Orangen, eine vollwertige dynamisch typisierte objektorientierte Sprache mit etwas so Statischem wie Fortran zu vergleichen. Ja, einige moderne Implementierungen der neuesten Fortran-Standards können mehr als nur das, aber nur sehr wenige Menschen verwenden sie tatsächlich. Wenn wir also von Fortran sprechen, denken wir an einfache, statische und zwingende Sprache. Hier ist auch C, daher ersetze ich C durch C ++ für Folgendes.

Erstens ist jede Diskussion darüber, ob Fortran / C bessere Compiler hat, umstritten. Engagierte C / Fortran-Compiler gehören der Vergangenheit an. Sowohl gcc / gfortran als auch icc / ifc sind nur verschiedene Frontends für dasselbe Backend, dh Ihr Programm wird vom Frontend in eine abstrakte Beschreibung umgewandelt und dann vom Backend optimiert und zusammengestellt. Wenn Sie semantisch denselben Code in Fortran oder C schreiben, erzeugt der Compiler in beiden Fällen dieselbe Assembly, die genauso schnell ausgeführt wird.

Das führt jetzt zu meinem zweiten Punkt: Warum sehen wir immer noch Unterschiede? Das Problem ist, dass die meisten Vergleiche von Fortran-Programmierern angestellt werden, die etwas in C versuchen oder umgekehrt. Haben Sie jemals bemerkt, wie die meisten Autoren oder Dichter es vorziehen, in ihrer Muttersprache zu schreiben? Möchten Sie Gedichte in einer Sprache schreiben, in der Sie sich nicht ganz sicher oder zu Hause fühlen? Natürlich nicht ... Ich selbst betrachte C als meine "native" Programmiersprache. Ich habe jedoch auch drei Jahre in einer Gruppe gearbeitet, in der nur Fortran verwendet wurde und in der ich ein gewisses Maß an Geläufigkeit erreicht habe. In Fortran würde ich jedoch niemals alleine etwas schreiben, da ich mit C besser zurechtkomme und der resultierende Code infolgedessen besser ist , wie auch immer Sie das definieren.

Der Hauptunterschied liegt also im Programmierer, nicht in der Sprache. Es gibt also keine Unterschiede? Nicht ganz. Hier einige Beispiele:

  • SIMD: Ob SSE, SSE3 oder AltiVec, wenn Sie sie in Fortran verwenden möchten, hoffen Sie besser und beten Sie, dass der Compiler genau das errät , was Sie wollen, und tun Sie es. Viel Glück. In C haben Sie im Allgemeinen intrinsische Funktionen für jede Architektur oder in jüngerer Zeit allgemeine SIMD-Vektortypen in gcc . Die meisten Fortran-Compiler verwenden SIMD-Anweisungen nur zum Auflösen von Schleifen. Wenn Sie jedoch einen Kernel haben, der auf nicht offensichtliche Weise mit kurzen Vektoren von Daten arbeitet, wird dieser vom Compiler höchstwahrscheinlich nicht angezeigt.

  • Unterschiedliche Hardwarearchitekturen: Die gesamte CUDA-Architektur basiert auf Kernels in C. Ja, die Portland Group verfügt jetzt auch über einen CUDA-fähigen Fortran-Compiler , der jedoch kommerziell ist und vor allem nicht von NVIDIA stammt. Gleiches gilt für OpenCL, für das das Beste, was ich finden konnte, ein aktuelles Projekt ist, das nur einige grundlegende Aufrufe unterstützt.

  • Parallele Programmierung: Ja, sowohl MPI als auch OpenMP funktionieren problemlos mit C und Fortran. Wenn Sie jedoch eine echte Kontrolle über Ihre Threads wünschen, dh wenn Sie über eine vollständig dynamische Shared-Memory-Berechnung verfügen, sind Sie mit Fortran in der Kälte. In C haben Sie die Standard-PThreads, die Sie zwar nicht warm und flockig, aber dennoch durch den Sturm bringen. Im Allgemeinen sind die meisten Berechnungen, die auf dem Zugriff auf das Betriebssystem basieren, z. B. Threads, Prozesse, Dateisysteme usw., besser für C. Oh, und versuchen Sie nicht, Ihr eigenes Netzwerk mit Fortran aufzubauen.

  • Benutzerfreundlichkeit: Fortran ist näher an Matlab als C. Wenn Sie alle Schlüsselwörter und das Deklarieren von Variablen verstanden haben, sieht der Rest des Codes wie Matlab aus und ist für Benutzer mit eingeschränkter Programmiererfahrung leichter zugänglich.

  • Interoperabilität: Wenn Sie eine Struktur in C erstellen, ist das Layout der tatsächlichen Daten einfach und deterministisch. Wenn Sie in Fortran Zeigerarrays oder strukturierte Daten verwenden, ist das tatsächliche Layout der Daten stark vom Compiler abhängig, nicht direkt und in der Regel vollständig undokumentiert. Sie können C von Fortran aus aufrufen und umgekehrt, aber denken Sie nicht, dass es möglicherweise so einfach ist, mehr als ein statisches Array von einem zum anderen und zurück zu übergeben.

Das ist alles ein bisschen abgefahren, aber es handelt sich um High-Performance-Computing, oder? Wenn Sie nicht daran interessiert sind, wie Sie die zugrunde liegenden Hardware-Paradigmen am besten nutzen können, dh Algorithmen implementieren und / oder entwickeln, die sich am besten für gemeinsam genutzten / verteilten Speicher, Threads, SIMD-Vektorisierung, GPUs mit SIMT usw. eignen Ich mache nur Mathe auf einem Computer.

Das ist viel länger als alles, was ich vorhatte. Hier ist eine Zusammenfassung - eine Reihe von Mitbringseln:

  • Sie erhalten den besten Code schreiben Sie in der Sprache können die Sie am besten kennen.
  • Es gibt keinen Unterschied in der Qualität des Codes, der von zwei Compilern erstellt wird, die dasselbe Back-End verwenden - wir sind es , die fehlerhaften Code in der einen oder anderen Sprache schreiben.
  • Fortran ist eine Abstraktion auf höchstem Niveau, mit der Sie nicht direkt auf bestimmte Hardware- / Betriebssystemfunktionen zugreifen können, z. B. SIMD, Threads, Netzwerke usw.
Pedro
quelle
5
Gute Antwort. Ich denke jedoch nicht, dass Ihre abschließende Bemerkung unbedingt wahr ist. Ich selbst bin ein C-Programmierer, aber Sie erhalten durch gute Programmierpraktiken Zugang zu einfachen Dingen in Fortran. Der ideale Weg, um Dinge wie SIMD ops zu nutzen, besteht darin, Code zu schreiben, der stark darauf hindeutet (z. B. das Blockieren von Schleifen), und den Compiler dies für Sie tun zu lassen. Verwenden Sie zum Threading einfach openMP (pthreads können auch mit einigem Aufwand verwendet werden). Fortran hat all die Dinge, die Sie nicht erwähnen, nur auf einer Ebene, die für den typischen Benutzer von Bedeutung ist: numerisch.
Reid.Atcheson
@ Reid.Atcheson: Nun, wenn Sie alles so blockieren, dass der Compiler es abfängt, funktioniert es sowohl in C als auch in Fortran automatisch. Das Problem ist jedoch, wie weit möchten Sie Ihrem Compiler vertrauen? Und warum möchten Sie ihm vertrauen müssen, wenn Sie genau wissen , was Sie tun möchten? OpenMP führt Threading durch, aber blockweise. Sie können es täuschen, verschiedene Thread-Pools zu veranlassen, verschiedene Dinge zu tun, aber das ist nur ein Missbrauch von OpenMP. Pthreads für Fortran sind nur Wrapper für die C-Funktionen. Ich stimme jedoch zu, dass Fortran einfacher ist, wenn Sie nicht auf die Details eingehen.
Pedro
1
Sicher, Sie werden nicht die volle 99-prozentige Spitzeneffizienz erreichen, wenn Sie sich auf den Compiler verlassen, aber Sie können sich ganz leicht annähern. Darüber hinaus müssen Sie entweder Intrinsics oder Inline-ASM verwenden. Irgendwo muss man Zugeständnisse machen, um die Effizienz der Programmierer zu verbessern. Deshalb gibt es in erster Linie Programmiersprachen. In dem Stadium, in dem Sie tatsächlich verrückt genug sind, um sich mit den Details von Intrinsics oder ASM zu befassen (ich war ein paar Mal), ist Fortran keine Krücke. Sie wissen sowieso, wie Sie Ihren zusammengestellten handoptimierten Code einbinden.
Reid.Atcheson
@ Reid.Atcheson: Nun, ich würde argumentieren, dass man für parallele HPC-Anwendungen möglicherweise weit unter 99% Spitzenwirkungsgrad landen kann ... Und die GCC-Vektortypen machen die Verwendung von Intrinsics zu einem unproblematischen Problem :)
Pedro
1
@Pedro, Brillianter Beitrag. Absolut brilliant. Vielen Dank für die Veröffentlichung. Ich habe es gerade gefunden, als ich zufällig durch interessante Themen gestöbert habe.
Inquest
16

Aus meinen 15 Jahren des Nachdenkens über wissenschaftliche Software: Wenn Ihr Code 25% schneller läuft, weil Sie ihn in Fortran schreiben, aber Sie 4-mal so lange brauchen, um ihn zu schreiben (keine STL, Schwierigkeiten beim Implementieren komplexer Datenstrukturen usw.), dann Fortran Gewinnt nur, wenn Sie einen erheblichen Teil Ihres Tages damit verbringen, mit den Daumen zu drehen und darauf zu warten, dass Ihre Berechnungen abgeschlossen sind. Angesichts der Tatsache, dass für fast alle von uns das Wertvollste unsere eigene Zeit ist, lautet die Schlussfolgerung: Verwenden Sie die Sprache, mit der Sie Ihren Code am schnellsten entwickeln, debuggen und testen können Du hast es in Fortran geschrieben.

Wolfgang Bangerth
quelle
13

Mein Ansatz war es, C ++ für alles andere als für Rechenkerne zu verwenden, die normalerweise am besten in Assembler geschrieben werden. Auf diese Weise erhalten Sie die gesamte Leistung des herkömmlichen HPC-Ansatzes, können jedoch die Benutzeroberfläche vereinfachen, z. B. indem Rechenkerne wie SGEMM / DGEMM / CGEMM / ZGEMM in einer einzigen Routine, z. B. Gemm, überladen werden. Die Abstraktionsstufe kann deutlich angehoben werden, indem rohe Zeiger vermieden und auf undurchsichtige Klassen umgeschaltet werden. Dies ist jedoch ein guter erster Schritt.

Der größte Nachteil von C ++ ist meines Erachtens die Verlängerung der Kompilierungszeit, aber meiner Erfahrung nach machen die Einsparungen bei der Entwicklungszeit dies mehr als wett. Ein weiterer Nachteil ist, dass Hersteller-C ++ - Compiler tendenziell mehr Fehler aufweisen als Hersteller-C- und Fortran-Compiler. Ich glaube, ich bin im letzten Jahr auf fast zehn Fehler in C ++ - Compilern gestoßen.

Trotzdem denke ich, dass das Rückgängigmachen von wissenschaftlichen Paketen, die in einfachen Sprachen (und Fortran) geschrieben sind, die Zurückhaltung ist, praktische Schnittstellen für anspruchsvolle Datenstrukturen bereitzustellen: Die meisten Menschen sind mit der Fortran BLAS-Schnittstelle zufrieden, da dies nur erforderlich ist Zeiger und führende Dimensionen zur Beschreibung von Matrizen, aber nur wenige Leute würden argumentieren, dass die übliche 40-Integer-Fortran-Sparse-Direct-Solver-Schnittstelle alles andere als praktisch ist (vgl. UHM, SuperLU, PETSc und Trilinos).

Zusammenfassend argumentiere ich, dass Assembly für Low-Level-Rechenkerne verwendet wird, für alles andere jedoch höhere Sprachen, insbesondere wenn nicht-triviale Datenstrukturen verwendet werden.

Beachten Sie, dass dieser Beitrag zu einem Vergleich der Leistung von C und Fortran auf dem Kernely:=αx+y .

Jack Poulson
quelle
2
Warum würden Sie keinem Standard-C-Compiler vertrauen, der die entsprechende Optimierung für das Kompilieren kleiner Kernel aktiviert hat? Auf dieser Ebene der Codegröße und -komplexität ist der Unterschied, was ein Compiler daraus ziehen könnte, unklar.
Peter Brune
1
Ich habe mit mehreren Leuten gesprochen, die mir gesagt haben, dass ihr Fortran trotz entsprechender Einschränkung der Verwendung für einige Operationen wie eine explizite Matrixtransponierung immer noch schneller war als ihr C- und / oder C ++ - Code. Ich sage nicht, dass es unmöglich ist, den C- oder C ++ - Code so schnell zu machen, aber dass der Fortran-Compiler dazu neigt, bessere Arbeit zu leisten.
Jack Poulson
Ich habe die gleiche Erfahrung mit dem Schlüsselwort "einschränken" (mein einfacher Fortran-Code war immer etwas schneller). Mein Fachwissen ist jedoch begrenzt, und ich habe einfach keine Zeit, um die generierte Assembly von gcc zu verstehen. Also benutze ich einfach Fortran, es ist einfach und es ist schnell.
Ondřej Čertík
@ JackPoulson: Das Compiler-Argument ist etwas, das ich ziemlich oft von der Fortran-Community höre. Leider verwenden die meisten Compiler, z. B. gcc oder ifc / icc, unterschiedliche Sprach-Frontends für dasselbe Backend. Die Maschinerie, die die Optimierung und Codegenerierung durchführt, ist identisch und daher sind die Unterschiede in den Ergebnissen höchstwahrscheinlich auf Unterschiede in der Vertrautheit des Programmierers mit der zugrunde liegenden Sprache zurückzuführen ...
Pedro
1
Nur um einen kleinen Überblick über die oft wiederholte, selten bestätigte Behauptung zu geben, dass Fortran auf numerischen Kerneln schneller ist: Vor einiger Zeit stellten wir fest, dass die Multiplikation des spärlichen Matrixvektors in Trilinos 'Epetra-Paket 30% langsamer war als in deal.II. Ersteres wurde in direktem Fortran 77 geschrieben, letzteres in direktem C ohne die Verwendung von "einschränken". Beide hatten ungefähr 10-15 Codezeilen. Heute verwendet Trilinos den Code aus deal.II. Ich bin sicher, man kann viele Fälle finden, in denen F77 schneller als C ist. Der Punkt ist, dass es heute nicht mehr so ​​allgemein ist.
Wolfgang Bangerth
8

Da ich neu hier bin, habe ich alte Fragen durchgesehen und diese gefunden. Es ist hoffentlich kein Tabu, alte Fragen zu beantworten!

Da dies sonst niemand erwähnt hat, dachte ich mir. Fortran 2003 wird von den meisten großen Compilern (Intel, IBM, Cray, NAG, PCG) fast vollständig unterstützt . Fortran 2003 (und 2008) ist eine objektorientierte Sprache, wenn auch etwas ausführlicher als C ++. Eines der Dinge, die ich an Fortran für gut halte, ist die Tatsache, dass das wissenschaftliche Rechnen des Standardkomitees als Hauptpublikum angesehen wird (ich danke Damian Rouson, der mich neulich darauf aufmerksam gemacht hat).

Ich erwähne dies alles nicht, damit C ++ - Programmierer zu Fortran-Programmierern werden, sondern damit Fortran-Benutzer wissen, dass sie jetzt mehr Optionen haben als nur auf C ++ umzusteigen oder objektorientierte Konzepte in Fortran 90/95 zu emulieren.

Eine Einschränkung, die ich hinzufügen möchte, ist, dass es Kosten verursacht, auf dem neuesten Stand zu sein, was in den Compilern implementiert ist. Wenn Sie gerade ein großes Projekt in Fortran 2003 durchführen, werden Sie über Fehler stolpern und müssen Ihren Compiler ständig aktualisieren (insbesondere, wenn Sie gcc verwenden), obwohl dies in den letzten Monaten erheblich besser geworden ist!

Jeremy Kozdon
quelle
7

Das Problem mit C ++ besteht darin, dass Sie zahlreiche Möglichkeiten haben, die Leistung zu beeinträchtigen, beispielsweise durch blindes Verwenden von STL, Ausnahmen, Klassen (virtueller Overhead plus Ausrichtungsprobleme), Überladen von Operatoren (redundantes Neu / Löschen) oder Vorlagen (endloses Kompilieren und kryptische Fehler) scheinen gütig, aber Sie können Stunden auf diese Weise verschwenden).

Je mehr Sie jedoch erhalten, desto besser sind die allgemeinen Bibliotheken und möglicherweise die bessere Sichtbarkeit Ihres Codes (obwohl dies stark vom Feld abhängt und Sie immer noch über reines C verfügen). Und Sie können immer noch die mangelnde Flexibilität des Fortran ausgleichen, indem Sie seinen Code in eine Skriptsprache wie R, Lush, Matlab / Scilab oder sogar Python, Ruby oder Lua schreiben.

mbq
quelle
1
Es ist im Allgemeinen eine schlechte Idee, einfache Techniken in höheren Sprachen anzuwenden. Beispielsweise ist die STL so konzipiert, dass sie auf einer sehr abstrakten Ebene arbeitet. Man muss sich dessen bewusst sein, wofür das Interface entwickelt wurde, es für diese Aufgabe verwenden und dann dem Compiler aus dem Weg gehen.
Shuhalo
2
Ich halte die Punkte von mbq und Martin für unfair. Ja, es gibt Möglichkeiten, sich in den Fuß zu schießen, wenn Sie versuchen, mit std :: list <double> einen numerischen Vektor für Zwecke der linearen Algebra zu implementieren. Aber das ist ein dummes Argument: Zumindest C ++ hat eine verknüpfte Listenklasse, die Sie verwenden können, Fortran nicht. Es ist so, als würde man sagen: "Autos fahren so schnell, dass man gegen eine Mauer stoßen und sich verletzen kann. Stattdessen sollte man Pferdekutschen benutzen." Es ist nur eine dumme Idee , eine höhere Programmiersprache in dem Papierkorb, der auch Low-Level - Material (zB C ++) für unterstützt mit High-Level - Funktionen.
Wolfgang Bangerth
@WolfgangBangerth Nein, jetzt tust du Fortran weh - es ist so "low-level" wie Bakterien "weniger entwickelt" sind als Menschen. Wenn Sie eine Auto-Analogie wollen, sollte es eher heißen: "Sie können sowohl Jeep als auch Lexus verwenden, um eine sumpfige Nebenstraße zu überqueren, aber die erste tut weniger weh."
mbq
1
Ich schätze Ihre Meinung, aber ich behaupte, dass Fortran nicht so entwickelt ist wie C ++ :-)
Wolfgang Bangerth
7

Drei Tatsachen:

  • F77-artige n-dimensionale Arrays in C: Kein Problem mit CnD ( zugegebenermaßen ein schamloser Stecker)

  • Das Modulsystem von F90 ist schlecht konzipiert und für die Erstellung von Umgebungen nicht geeignet. (Der Name eines Moduls muss nicht mit dem Dateinamen übereinstimmen, zB)

  • Fortran unterstützt Refactoring nicht gut. Um ein bisschen Funktionalität aus einer Funktion herauszuholen, müssen Sie vier Stellen berühren: Tatsächlicher Code, Variablendeklarationen, Argumentdeklarationen und Argumentliste. C kommt mit zwei zu berührenden Stellen aus. Dies verstärkt den Effekt des Versagens, Daten gut zu verwalten (siehe unten): Da Modularität in kleinem Maßstab so schmerzhaft ist, schreibt fast jeder gigantische Unterprogramme.

Ein persönlicher Eindruck:

  • Fortran eignet sich nicht gut zum Verwalten von Daten. Versuchen Sie, in F77 oder F90 einen Zeiger auf eine benutzerundurchlässige Datenstruktur zurückzugeben. ( transfer()hier kommen wir)
Andreas Klöckner
quelle
Hallo Andreas! CnD ist interessant, ich wusste nichts davon. Ah, du hast es geschrieben. :) (f90 unterstützt auch Slicing, das für Arrays zuweisbar ist, und vor allem die Array-Syntax für Multiplikation, Addition usw.) Ich verwende CMake mit Fortran und es funktioniert hervorragend mit Modulen. Was genau ist "Argumentliste"? Ich glaube nicht, dass ich diese verwende, so dass nur 3 Stellen zum Ändern benötigt werden. In C müssen Sie in der Regel den tatsächlichen Code, die Parameter und eine Header-Datei ändern, sodass es auch 3 Stellen gibt (am definitivsten in C ++). Ja, transfer () ist nicht besonders nett, aber normalerweise brauchen Sie es in der Praxis nicht.
Ondřej Čertík
3
Das Refactoring von modernem Fortran ist mit geeigneten IDEs, wie Photran in Eclipse, trivial.
2
"Der Name eines Moduls muss nicht mit dem Dateinamen übereinstimmen, zB" Sie müssen Spaß machen, Sie können viele Module in einer Datei haben. Einige von ihnen überspannen nur ein paar Zeilen. Sie sind viel einfacher zu erstellen, wenn Sie nicht für jede Datei eine eigene Datei erstellen müssen.
Vladimir F
1
Ich wollte nur hinzufügen, was @ user389 sagte, dass Photran zwar großartig ist und die einzige Fortran-IDE ist, die Refactorings zulässt, der Parser jedoch immer fehlschlägt. Auf der anderen Seite besteht kein Grund, die Tatsache zu kommentieren, dass Eclipse speicherhungrig ist.
Astrojuanlu
5

Fortran ist für Array- / Matrix-Berechnungen optimiert und ist für jede Art von Textanalyse eine echte Herausforderung. C und C ++ stimmen möglicherweise nicht mit Fortran im numerischen Rechnen überein (es ist eng), aber ich finde es viel einfacher, Text zu verarbeiten und Daten (dh benutzerdefinierte Datenstrukturen) mit C / C ++ zu organisieren.

Wie andere bereits erwähnt haben, zählen Sie dynamisch interpretierte Sprachen nicht mit (Python et al.). Sie bieten möglicherweise nicht die atemberaubende Geschwindigkeit von Fortan, aber sie ermöglichen es Ihnen, sich mehr auf die Lösung Ihres Computerproblems zu konzentrieren als auf alle Details der Implementierung. Oft können Sie eine Lösung in Python implementieren und, wenn die Leistung nicht akzeptabel ist, ein Profil erstellen, die Problembereiche identifizieren und entweder den Code mit Cython optimieren oder das gesamte Programm in einer kompilierten Sprache erneut implementieren. Sobald Sie die Problemlösungslogik ausgearbeitet haben, ist der Rest nur noch die Implementierung und sollte sich mit einem guten Verständnis der Computergrundlagen problemlos in einer Vielzahl von Programmiersprachen darstellen lassen.

Daniel Standage
quelle
Stimmt. Zum Parsen von Texten benutze ich auch Python.
Ondřej Čertík
Sie können auch einen Teil eines Python-Skripts in einer kompilierten Sprache, z. B. C ++, implementieren und einbinden. ZB Boost Python, Swig usw.
Faheem Mitha
4

Ich arbeite derzeit in einem der nationalen Labors. Die meisten Leute um mich herum sind Maschinenbauer. Unterhalten Sie sich mit einigen Leuten in den HPC-Gruppen, meistens mit Linux und meistens mit C ++. Die Gruppe, in der ich mich gerade befinde, beschäftigt sich hauptsächlich mit Desktop-Anwendungen. Wir verwenden Windows und in absteigender Reihenfolge: C #, FORTRAN, Python, VBA und VB (6, nicht .NET). Einige der von uns verwendeten Simulations-Engines wurden in anderen nationalen Labors in FORTRAN geschrieben.

Tangurena
quelle
4

Es tut mir leid, dass ich einen alten Faden ausgegraben habe, aber es scheint, dass Fortran auch im Jahr 2015 viel benutzt wird.

Ich bin gerade auf diese Liste (alternativer Link ) gestoßen, bei der es sich im Grunde genommen um eine Liste von 13 Codes handelt, die von der DOE-OCLF-Einrichtung für die Ausführung auf der 300-petaFLOPS-Summit-Maschine genehmigt wurden, die den Forschern 2018 zur Verfügung gestellt wird. Ich habe versucht, die Hauptsprache zu finden für den Code (basierend auf einer schnellen Google-Suche) und hier ist, was ich gefunden habe:

XGC Fortran

SPECFEM Fortran

ACME Fortran (Bunch of climate codes)

DIRAC Fortran (Mostly)

FLASH Fortran

GTC Fortran

HACC C/C++

LS-DALTON Fortran (some C)

NAMD C/C++

NUCCOR Fortran

NWCHEM Fortran

QMCPACK C++

RAPTOR Fortran

Von 13 Codes scheinen also mindestens 10 (basierend auf meiner Schnellsuche) in Fortran geschrieben zu sein. Nicht schlecht für eine 50-jährige Sprache.

ANMERKUNG: Mir ist klar, dass Sprachvergleiche nutzlos sind, aber angesichts der Anzahl der Leute (insbesondere von C ++ - Benutzern), die Fortran schlecht gelaunt haben, hielt ich es möglicherweise für sinnvoll, sie zu erwähnen.

stali
quelle
3
Ich bin anderer Meinung, weil meine Erfahrung in den nationalen Labors eher das Gegenteil war. Die meisten der neuen Projekte, die ich bei Lawrence Livermore sehe, sind in C ++ geschrieben, und die meisten der neuen (oder aktiv gewarteten) Open-Source-Bibliotheken auf dem neuesten Stand der Technik in ODE-Lösern, FEM-Diskretisierungen und universellen wissenschaftlichen Computer-Bibliotheken scheinen in C oder C ++ zu sein. Fortran scheint hauptsächlich in Projekten verwendet zu werden, die vorhandene / ältere Bibliotheken verwenden. Ich sehe nicht viele große, neue Projekte mit Fortran, unabhängig davon, was ich von der Sprache halte.
Geoff Oxberry
Einige Dichtefunktionaltheorie-Codes, die auch in Fortran geschrieben wurden, umfassen VASP und CASTEP , obwohl, wie @GeoffOxberry hervorhebt, neue Projekte möglicherweise in Richtung C ++ tendieren.
dr.blochwave
@blochwave Wie Sie dem Link entnehmen können, sind die Projekte für eine neue Maschine (mit Beschleunigern usw.) vorgesehen, die 2018 online sein wird. Es ist also nicht so, als würden sie einen 25-Jahres-Code nehmen und ihn kompilieren, in der Hoffnung, dass er gut läuft Performance. Ich bin mir ziemlich sicher, dass große Teile der Codes in der obigen Liste wie in neuem Code umgeschrieben wurden oder wurden. Auch in Fortran gibt es eine Reihe "neuer" Klimacodes, die von vielen Agenturen in einer Reihe von Ländern verwendet werden.
Stali
0

Ich denke, Jack P. versucht zu sagen, dass Sie mischen und zusammenpassen sollten. Ein gutes Stück Software wird sorgfältig geschichtet. Verschiedene Ebenen können natürlicher oder effizienter auf verschiedene Sprachen abgebildet werden. Sie sollten für jede Ebene die am besten geeignete Sprache auswählen. Sie sollten auch wissen, wie Sprachen zusammenarbeiten können. Dies kann sich darauf auswirken, welche Sprache Sie für welche Ebene auswählen.

Eine bessere Frage ist, welche Beispiele für exzellent gestaltete Software es gibt, die es wert sind, studiert zu werden, um zu lernen, wie man geschichtete Software entwirft.

Robert van de Geijn
quelle