476 Stimmen

Ist Fortran für umfangreiche Berechnungen leichter zu optimieren als C?

Von Zeit zu Zeit lese ich, dass Fortran bei schweren Berechnungen schneller ist oder sein kann als C. Ist das wirklich so? Ich muss zugeben, dass ich Fortran kaum kenne, aber der Fortran-Code, den ich bisher gesehen habe, hat nicht gezeigt, dass die Sprache Funktionen hat, die C nicht hat.

Wenn dies der Fall ist, sagen Sie mir bitte, warum. Bitte sagen Sie mir nicht, welche Sprachen oder Libs gut für Number Crunching sind, ich habe nicht vor, eine App oder Lib zu schreiben, um das zu tun, ich bin nur neugierig.

31voto

jakobengblom2 Punkte 5241

Ich denke, der wichtigste Punkt, der für Fortran spricht, ist, dass es eine Sprache ist, die sich etwas besser für die Darstellung von vektor- und array-basierter Mathematik eignet. Das oben erwähnte Problem der Zeigeranalyse ist in der Praxis real, da portabler Code nicht wirklich davon ausgehen kann, dass man einem Compiler etwas sagen kann. Es ist IMMER von Vorteil, Berechnungen auf eine Weise auszudrücken, die dem Aussehen der Domäne näher kommt. C hat eigentlich gar keine Arrays, wenn man genau hinsieht, nur etwas, das sich so verhält. Fortran hat echte Arrays. Das macht es einfacher, bestimmte Arten von Algorithmen zu kompilieren, insbesondere für parallele Maschinen.

In Dingen wie dem Laufzeitsystem und den Aufrufkonventionen sind sich C und modernes Fortran so ähnlich, dass es schwer zu erkennen ist, was den Unterschied ausmachen würde. Beachten Sie, dass es sich bei C hier wirklich um Base C handelt: C++ ist ein völlig anderes Thema mit sehr unterschiedlichen Leistungsmerkmalen.

29voto

T.E.D. Punkte 42630

Es gibt keine Sprache, die schneller ist als eine andere, die richtige Antwort lautet also keine .

Die eigentliche Frage lautet: "Ist der mit Fortran-Compiler X kompilierte Code schneller als der entsprechende Code, der mit C-Compiler Y kompiliert wurde?" Die Antwort auf diese Frage hängt natürlich davon ab, welche beiden Compiler Sie auswählen.

Eine andere Frage, die man stellen könnte, wäre in etwa: "Welcher Compiler würde bei gleichem Optimierungsaufwand in den beiden Compilern schnelleren Code erzeugen?" Die Antwort auf diese Frage wäre in der Tat Fortran . Fortran-Compiler haben gewisse Vorteile:

  • Fortran musste damals mit Assembly konkurrieren, als einige schworen, niemals Compiler zu verwenden, und wurde daher auf Geschwindigkeit ausgelegt. C wurde entwickelt, um flexibel zu sein.
  • Die Nische von Fortran war das Number Crunching. In diesem Bereich ist Code jamais schnell genug. Es bestand also immer ein großer Druck, die Sprache effizient zu halten.
  • Der größte Teil der Forschung im Bereich der Compiler-Optimierung wird von Leuten betrieben, die daran interessiert sind, Fortran-Zahlencode zu beschleunigen. Daher ist die Optimierung von Fortran-Code ein viel bekannteres Problem als die Optimierung jeder anderen kompilierten Sprache, und neue Innovationen tauchen zuerst in Fortran-Compilern auf.
  • Biggie : C fördert die Verwendung von Zeigern in viel stärkerem Maße als Fortran. Dadurch erhöht sich der potenzielle Umfang eines jeden Datenelements in einem C-Programm drastisch, was die Optimierung erheblich erschwert. Beachten Sie, dass Ada auch in diesem Bereich viel besser ist als C und eine viel modernere OO-Sprache ist als das weit verbreitete Fortran77. Wenn Sie eine OO-Sprache suchen, die schnelleren Code als C erzeugen kann, ist dies eine Option für Sie.
  • Auch hier gilt, dass die Kunden von Fortran-Compilern aufgrund der Nische der Zahlenverarbeitung mehr Wert auf Optimierung legen als die Kunden von C-Compilern.

Es gibt jedoch nichts, was jemanden davon abhält, eine Menge Aufwand in die Optimierung seines C-Compilers zu stecken und ihn dazu zu bringen, besseren Code zu erzeugen als der Fortran-Compiler seiner Plattform. In der Tat macht der größere Umsatz, den C-Compiler generieren, dieses Szenario durchaus realisierbar

21voto

Es gibt noch einen weiteren Punkt, in dem sich Fortran von C unterscheidet - und potenziell schneller ist. Fortran hat bessere Optimierungsregeln als C. In Fortran ist die Auswertungsreihenfolge eines Ausdrucks nicht definiert, was dem Compiler erlaubt, ihn zu optimieren - wenn man eine bestimmte Reihenfolge erzwingen will, muss man Klammern verwenden. In C ist die Reihenfolge viel strenger, aber mit den "-fast"-Optionen ist sie lockerer und "(...)" wird ebenfalls ignoriert. Ich denke, Fortran hat einen Weg, der gut in der Mitte liegt (IEEE macht das Leben schwieriger, da bestimmte Änderungen der Auswertungsreihenfolge erfordern, dass keine Überläufe auftreten, was entweder ignoriert werden muss oder die Auswertung behindert).

Ein weiterer Bereich mit intelligenteren Regeln sind komplexe Zahlen. Nicht nur, dass es bis C 99 dauerte, bis C sie hatte, auch die Regeln, die sie regeln, sind in Fortran besser; da die Fortran-Bibliothek von gfortran teilweise in C geschrieben ist, aber die Fortran-Semantik implementiert, gewann GCC die Option (die auch mit "normalen" C-Programmen verwendet werden kann):

-fcx-fortran-Regeln Komplexe Multiplikation und Division folgen den Fortran-Regeln. Die Bereichsreduzierung wird als Teil der komplexen Division durchgeführt, aber es wird nicht geprüft, ob das Ergebnis einer komplexen Multiplikation oder Division "NaN + I*NaN" ist, und es wird versucht, die Situation in diesem Fall zu retten.

Die oben erwähnten Alias-Regeln sind ein weiterer Bonus und auch - zumindest im Prinzip - die whole-array-Operationen, die, wenn sie vom Optimierer des Compilers richtig berücksichtigt werden, zu schnellerem Code führen können. Auf der Gegenseite steht, dass bestimmte Operationen mehr Zeit benötigen, z.B. wenn man eine Zuweisung an ein allokierbares Array vornimmt, sind viele Überprüfungen notwendig (reallocate? [Fortran 2003 feature], hat das Array strides, etc.), die die einfache Operation hinter den Kulissen komplexer machen - und damit langsamer, aber die Sprache leistungsfähiger. Andererseits machen es die Array-Operationen mit flexiblen Grenzen und Strides einfacher, Code zu schreiben - und der Compiler kann den Code normalerweise besser optimieren als ein Benutzer.

Insgesamt denke ich, dass C und Fortran etwa gleich schnell sind; die Wahl sollte eher sein, welche Sprache man mehr mag oder ob die Ganzarray-Operationen von Fortran und seine bessere Portabilität nützlicher sind - oder die bessere Anbindung an System- und Grafik-Benutzerschnittstellen-Bibliotheken in C.

15voto

Ich vergleiche die Geschwindigkeit von Fortran, C und C++ mit dem klassischen Levine-Callahan-Dongarra-Benchmark von netlib. Die mehrsprachige Version, mit OpenMP, ist http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors Das C ist hässlicher, da es mit automatischer Übersetzung begann, plus Einfügung von Restrict und Pragmas für bestimmte Compiler. C++ ist einfach nur C mit STL-Vorlagen, wo dies möglich ist. Meiner Ansicht nach ist die STL eine gemischte Sache, was die Verbesserung der Wartbarkeit angeht.

Es gibt nur eine minimale Übung mit automatischem Funktions-Inlining, um zu sehen, inwieweit es die Optimierung verbessert, da die Beispiele auf der traditionellen Fortran-Praxis basieren, wo wenig Vertrauen in Inlining gesetzt wird.

Dem C/C++-Compiler, der bei weitem am häufigsten verwendet wird, fehlt die Auto-Vektorisierung, auf die sich diese Benchmarks stark verlassen.

Zum vorherigen Beitrag: Es gibt eine Reihe von Beispielen, in denen Klammern in Fortran verwendet werden, um eine schnellere oder genauere Auswertungsreihenfolge vorzugeben. Bekannte C-Compiler haben keine Optionen, um die Klammern zu beachten, ohne wichtigere Optimierungen zu deaktivieren.

15voto

ker2x Punkte 410

Ich bin ein Hobby-Programmierer und bin in beiden Sprachen "durchschnittlich". Ich finde es einfacher, schnellen Fortran-Code zu schreiben als C- (oder C++-) Code. Sowohl Fortran als auch C sind "historische" Sprachen (nach heutigem Standard), werden stark genutzt und haben gut unterstützte freie und kommerzielle Compiler.

Ich weiß nicht, ob es eine historische Tatsache ist, aber Fortran fühlt sich so an, als sei es dafür gebaut, parallel/verteilt/vektorisiert/was-auch-immer-viele-Kerne-zu-sein. Und heute ist es so ziemlich die "Standard-Metrik", wenn wir über Geschwindigkeit sprechen: "skaliert es?"

Für reines Cpu Crunching liebe ich Fortran. Für alles, was mit IO zu tun hat, finde ich es einfacher, mit C zu arbeiten (es ist in beiden Fällen sowieso schwierig).

Für parallelen, mathematikintensiven Code wollen Sie wahrscheinlich Ihre GPU verwenden. Sowohl C als auch Fortran haben eine Menge mehr oder weniger gut integrierter CUDA/OpenCL-Schnittstellen (und jetzt auch OpenACC).

Meine einigermaßen objektive Antwort lautet: Wenn man beide Sprachen gleich gut/schlecht beherrscht, dann denke ich, dass Fortran schneller ist, weil ich es einfacher finde, parallelen/verteilten Code in Fortran zu schreiben als in C. (sobald man verstanden hat, dass man "freeform" Fortran schreiben kann und nicht nur strengen F77-Code)

Hier ist eine 2. Antwort für diejenigen, die mich abwerten wollen, weil ihnen die 1. Antwort nicht gefällt: Beide Sprachen haben die erforderlichen Funktionen, um Hochleistungscode zu schreiben. Es hängt also von dem Algorithmus ab, den Sie implementieren (rechenintensiv ? io-intensiv ? speicherintensiv?), von der Hardware (Single-CPU ? Multi-Core ? verteilter Supercomputer ? GPGPU ? FPGA ?), von Ihren Fähigkeiten und letztendlich vom Compiler selbst. Sowohl C als auch Fortran haben großartige Compiler. (Ich bin wirklich erstaunt, wie fortschrittlich Fortran-Compiler sind, aber das sind C-Compiler auch).

PS: Ich bin froh, dass Sie Libs ausdrücklich ausgeschlossen haben, denn ich habe viel Schlechtes über Fortran-GUI-Libs zu sagen :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X