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.

9voto

S.Lott Punkte 371691

Im Allgemeinen ist FORTRAN langsamer als C. C kann Zeiger auf Hardware-Ebene verwenden, so dass der Programmierer von Hand optimieren kann. FORTRAN hat (in den meisten Fällen) keinen Zugang zu Hardware-Speicheradressierungs-Hacks. (VAX FORTRAN ist eine andere Geschichte.) Ich benutze FORTRAN seit den 70er Jahren immer wieder.

Seit den 90er Jahren hat sich FORTRAN jedoch weiterentwickelt und enthält nun spezielle Sprachkonstrukte, die zu inhärent parallelen Algorithmen optimiert werden können, die auf einem Multi-Core-Prozessor wirklich schreien. Die automatische Vektorisierung ermöglicht es beispielsweise mehreren Prozessoren, jedes Element in einem Datenvektor gleichzeitig zu verarbeiten. 16 Prozessoren - 16-Element-Vektor - die Verarbeitung dauert 1/16 der Zeit.

In C müssen Sie Ihre eigenen Threads verwalten und Ihren Algorithmus sorgfältig für die Mehrfachverarbeitung entwerfen und dann eine Reihe von API-Aufrufen verwenden, um sicherzustellen, dass die Parallelität richtig funktioniert.

In FORTRAN müssen Sie Ihren Algorithmus nur sorgfältig für die Mehrprozessorverarbeitung entwerfen. Der Compiler und die Laufzeit erledigen den Rest für Sie.

Sie können ein wenig lesen über Hochleistungs-Fortran aber man findet eine Menge toter Links. Es ist besser, über parallele Programmierung zu lesen (wie OpenMP.org ) und wie FORTRAN dies unterstützt.

5voto

JPerez45 Punkte 59

Der schnellere Code ist nicht wirklich bis zu der Sprache, ist der Compiler, so können Sie die ms-vb "Compiler", die aufgeblähte, langsamer und redundante Objekt-Code, die zusammen in einem ".exe" gebunden ist, aber powerBasic erzeugt auch viel besser Code zu sehen. Objektcode, der von einem C- und C++-Compiler erzeugt wird, wird in einigen Phasen erzeugt (mindestens 2), aber die meisten Fortran-Compiler haben mindestens 5 Phasen, einschließlich High-Level-Optimierungen, so dass Fortran von vornherein die Fähigkeit hat, hoch optimierten Code zu erzeugen. Der beste Compiler, den ich kenne, ist der Intel Fortran Compiler, weil man ihn auf LINUX und Windows bekommen kann und man VS als IDE benutzen kann. Wenn man nach einem billigen Tigh Compiler sucht, kann man immer auf OpenWatcom zurückgreifen.

Mehr Informationen dazu: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html

3voto

Kai Punkte 51

Fortran kann Arrays, insbesondere mehrdimensionale Arrays, sehr gut verarbeiten. Das Zerlegen von Elementen eines mehrdimensionalen Arrays in Fortran kann viel einfacher sein als in C/C++. In C++ gibt es jetzt Bibliotheken, die diese Aufgabe übernehmen können, wie Boost oder Eigen, aber das sind alles externe Bibliotheken. In Fortran sind diese Funktionen intrinsisch.

Ob Fortran für die Entwicklung schneller oder bequemer ist, hängt hauptsächlich von der Aufgabe ab, die Sie erledigen müssen. Als Fachmann für wissenschaftliche Berechnungen in der Geophysik habe ich die meisten Berechnungen in Fortran durchgeführt (ich meine modernes Fortran, >=F90).

3voto

Zeus Punkte 1435

Fortran verfügt über bessere E/A-Routinen, z. B. die implizite do-Funktion, die eine Flexibilität bietet, mit der die Standardbibliothek von C nicht mithalten kann.

Der Fortran-Compiler verarbeitet direkt die komplexeren Syntax, und da eine solche Syntax nicht einfach auf die Form der Argumentübergabe reduziert werden kann auf die Form der Argumentübergabe reduziert werden kann, kann C sie nicht effizient implementieren.

2voto

cdcdcd Punkte 551

Mit modernen Standards und Compilern, nein!

Einige Leute hier haben behauptet, dass FORTRAN schneller ist, weil der Compiler sich nicht um Aliasing kümmern muss (und daher bei der Optimierung mehr Annahmen treffen kann). In C wird dies jedoch seit dem C99-Standard (glaube ich) mit der Aufnahme des Schlüsselworts restrict behandelt. Damit wird dem Compiler mitgeteilt, dass der Zeiger innerhalb eines bestimmten Bereichs nicht aliased ist. Darüber hinaus ermöglicht C eine korrekte Zeigerarithmetik, bei der Dinge wie Aliasing in Bezug auf Leistung und Ressourcenzuweisung sehr nützlich sein können. Obwohl ich glaube, dass neuere Versionen von FORTRAN die Verwendung von "richtigen" Zeigern ermöglichen.

Bei modernen Implementierungen übertrifft C im Allgemeinen FORTRAN (obwohl es auch sehr schnell ist).

http://benchmarksgame.alioth.debian.org/u64q/fortran.html

EDITAR:

Eine berechtigte Kritik daran scheint zu sein, dass das Benchmarking möglicherweise verzerrt ist. Hier ist eine weitere Quelle (in Bezug auf C), die das Ergebnis in einen größeren Zusammenhang stellt:

http://julialang.org/benchmarks/

Sie sehen, dass C in den meisten Fällen besser abschneidet als Fortran (siehe auch die Kritikpunkte weiter unten, die auch hier zutreffen); wie andere bereits festgestellt haben, ist Benchmarking eine ungenaue Wissenschaft, die leicht zugunsten einer Sprache beeinflusst werden kann. Aber es zeigt, dass Fortran und C eine ähnliche Leistung haben.

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