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.

15voto

jfm3 Punkte 35554

Es gibt nichts über die Sprachen Fortran und C, was das eine für bestimmte Zwecke schneller macht als das andere. Es gibt Dinge über spezifische Kompilierer für jede dieser Sprachen, die einige für bestimmte Aufgaben besser geeignet machen als andere.

Viele Jahre lang gab es Fortran-Compiler, die Ihre numerischen Routinen mit schwarzer Magie bearbeiteten und viele wichtige Berechnungen wahnsinnig schnell machten. Die heutigen C-Compiler konnten das nicht so gut. Infolgedessen wuchs eine Reihe großartiger Code-Bibliotheken in Fortran. Wenn Sie diese gut getesteten, ausgereiften, wunderbaren Bibliotheken verwenden wollen, müssen Sie den Fortran-Compiler hervorholen.

Meine informellen Beobachtungen zeigen, dass die Leute heutzutage ihre rechenintensiven Aufgaben in jeder beliebigen Sprache programmieren, und wenn es eine Weile dauert, finden sie Zeit in einem billigen Computer-Cluster. Moore's Law macht uns alle zu Narren.

15voto

Kluge Punkte 3447

Etwaige Geschwindigkeitsunterschiede zwischen Fortran und C sind eher eine Funktion der Compiler-Optimierungen und der zugrunde liegenden mathematischen Bibliothek, die von dem jeweiligen Compiler verwendet wird. Es gibt nichts, was Fortran von Haus aus schneller machen würde als C.

Wie auch immer, ein guter Programmierer kann Fortran in jeder Sprache schreiben.

13voto

Markus Dutschke Punkte 6917

Schnell und einfach: Beide sind gleich schnell, aber Fortran ist einfacher. Was am Ende wirklich schneller ist, hängt vom Algorithmus ab, aber es gibt ohnehin keinen nennenswerten Geschwindigkeitsunterschied. Das habe ich 2015 in einem Fortran-Workshop im Stuttgarter Höchstleistungsrechenzentrum gelernt. Ich arbeite sowohl mit Fortran als auch mit C und teile diese Meinung.

Erläuterung:

C wurde entwickelt, um Betriebssysteme zu schreiben. Daher hat es mehr Freiheiten als nötig, um leistungsstarken Code zu schreiben. Im Allgemeinen ist dies kein Problem, aber wenn man nicht sorgfältig programmiert, kann man den Code leicht verlangsamen.

Fortran wurde für die wissenschaftliche Programmierung entwickelt. Aus diesem Grund unterstützt es das Schreiben von schnellem Code in Bezug auf die Syntax, da dies der Hauptzweck von Fortran ist. Im Gegensatz zur öffentlichen Meinung ist Fortran keine überholte Programmiersprache. Ihr aktueller Standard ist von 2010 und es werden regelmäßig neue Compiler veröffentlicht, da der meiste Hochleistungscode in Fortran geschrieben wird. Fortran unterstützt außerdem moderne Funktionen als Compiler-Direktiven (in C-Pragmas).

Exemple : Wir wollen einer Funktion (Fortran: Subroutine) eine große Struktur als Eingangsargument übergeben. Innerhalb der Funktion wird das Argument nicht verändert.

C unterstützt sowohl den Aufruf per Referenz als auch den Aufruf per Wert, was eine praktische Funktion ist. In unserem Fall könnte der Programmierer versehentlich call by value verwenden. Dies verlangsamt die Abläufe erheblich, da die Struktur erst in den Speicher kopiert werden muss.

Fortran arbeitet nur mit Call by Reference, was den Programmierer zwingt, die Struktur von Hand zu kopieren, wenn er wirklich eine Call by Value-Operation will. In unserem Fall wird Fortran automatisch genauso schnell wie die C-Version mit call by reference.

12voto

grzkv Punkte 2561

Ich habe einige Jahre lang umfangreiche mathematische Arbeiten mit FORTRAN und C durchgeführt. Aus eigener Erfahrung kann ich sagen, dass FORTRAN manchmal wirklich besser ist als C, aber nicht wegen der Geschwindigkeit (man kann C so schnell wie FORTRAN machen, wenn man den richtigen Codierungsstil verwendet), sondern eher wegen der sehr gut optimierten Bibliotheken wie LAPACK und wegen der großartigen Parallelisierung. Meiner Meinung nach ist FORTRAN wirklich umständlich zu bedienen, und seine Vorteile sind nicht gut genug, um diesen Nachteil aufzuwiegen, so dass ich jetzt C+GSL für Berechnungen verwende.

10voto

Pramod Punkte 8680

Ich habe nicht gehört, dass Fortan wesentlich schneller ist als C, aber es wäre denkbar, dass es in bestimmten Fällen schneller ist. Und der Schlüssel liegt nicht in den vorhandenen Sprachmerkmalen, sondern in denen, die (normalerweise) nicht vorhanden sind.

Ein Beispiel sind C-Zeiger. C-Zeiger werden so gut wie überall verwendet, aber das Problem mit Zeigern ist, dass der Compiler in der Regel nicht erkennen kann, ob sie auf die verschiedenen Teile desselben Arrays zeigen.

Wenn Sie zum Beispiel eine strcpy-Routine geschrieben haben, die wie folgt aussieht:

strcpy(char *d, const char* s)
{
  while(*d++ = *s++);
}

Der Compiler muss von der Annahme ausgehen, dass d und s sich überschneidende Arrays sein könnten. Er kann also keine Optimierung durchführen, die zu anderen Ergebnissen führen würde, wenn sich die Arrays überschneiden. Wie zu erwarten, schränkt dies die Art der Optimierungen, die durchgeführt werden können, erheblich ein.

[Ich sollte anmerken, dass C99 ein "restrict"-Schlüsselwort hat, das den Compilern explizit mitteilt, dass sich die Zeiger nicht überschneiden. Beachten Sie auch, dass Fortran ebenfalls Zeiger hat, deren Semantik sich von der von C unterscheidet, aber die Zeiger sind nicht allgegenwärtig wie in C.]

Aber um auf die Frage C vs. Fortran zurückzukommen: Es ist denkbar, dass ein Fortran-Compiler in der Lage ist, einige Optimierungen durchzuführen, die für ein (einfach geschriebenes) C-Programm nicht möglich wären. Ich wäre also nicht allzu überrascht über diese Behauptung. Allerdings erwarte ich, dass der Leistungsunterschied nicht allzu groß ist. [~5-10%]

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