Was macht Fortran schnell?


41

Fortran hat einen besonderen Platz in der numerischen Programmierung. Sie können sicher gute und schnelle Software in anderen Sprachen erstellen, aber Fortran arbeitet trotz seines Alters sehr gut. Außerdem ist es in Fortran einfacher, schnelle Programme zu erstellen. Ich habe schnelle Programme in C ++ erstellt, aber bei Dingen wie Pointer-Aliasing muss man vorsichtiger sein. Es muss also einen Grund dafür geben, und zwar einen sehr technischen. Liegt es daran, dass der Compiler mehr optimieren kann? Ich würde gerne technische Details erfahren, wenn ich also eine andere Sprache verwende, kann ich diese Dinge berücksichtigen.

Ich weiß zum Beispiel, oder so denke ich, dass eine Sache darin besteht, dass der Standard festlegt, dass Zeiger im Speicher immer zusammenhängend sind, was einen schnelleren Speicherzugriff bedeutet. Ich glaube, Sie können dies in C ++ tun, indem Sie dem Compiler ein Flag geben. Auf diese Weise hilft es zu wissen, was Fortran gut tut, damit wir dies imitieren können, wenn wir eine andere Sprache verwenden.


7
Ich würde sagen, dass dies eine bessere Frage für den Stackoverflow ist, obwohl es meiner Meinung nach eine gute Frage ist. Eine schnelle Suche ( stackoverflow.com/search?q=fortran+fast ) führt mich zu dieser Frage, die Ihnen helfen könnte: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann

3
Sie müssen angeben, welchen Fortrantyp Sie verwenden. Es gibt einen wesentlichen Unterschied zwischen 77 und 90+. Ich gehe von mindestens 90 aus, wenn es um Zeiger geht ...
Qubyte

Ich habe immer gelesen, dass Fortran schneller ist als C. Nun, vielleicht, aber ist es schneller als 2% oder eher schneller als 50%?
Shuhalo

4
Es ist ein urbaner Mythos. Sofern der Compiler keine speziellen Anweisungen verwenden kann, können Sie nahezu jedes Programm unabhängig vom Compiler manuell optimieren, um ungefähr dieselbe Maschinensprache zu generieren.
Mike Dunlavey

Antworten:


50

Sprachdesigner haben viele Möglichkeiten. Ken Kennedy hob zwei hervor: (1) bessere Abstraktionen und (2) Code auf höherer oder niedrigerer Ebene (weniger oder mehr maschinenähnlich). Während sich funktionale Sprachen wie Haskell und Scheme auf die ersteren konzentrieren, konzentrierten sich traditionelle wissenschaftliche Computersprachen wie Fortran und C / C ++ auf die letzteren. Zu sagen, dass eine Sprache schneller ist als eine andere, ist normalerweise irreführend: Jede Sprache hat einen Problembereich, für den sie sich auszeichnet. Fortran schneidet auf dem Gebiet der Array-basierten numerischen Codes aus zwei Gründen besser ab als andere Sprachen: wegen seines Array-Modells und seiner Aussagekraft.

Array-Modell

Fortran-Programmierer führen größtenteils Array-Manipulationen durch. Dafür unterstützt Fortran mehrere Compiler-Optimierungen, die in anderen Sprachen nicht verfügbar sind. Das beste Beispiel ist die Vektorisierung: Wenn Sie das Datenlayout kennen, kann der Compiler über das Array interne Funktionen auf Assembly-Ebene aufrufen.

Sprachaussprache

Während eine einfachere Sprache "besser" zu kompilieren scheint als eine komplexere, ist dies in Wirklichkeit nicht der Fall. Wenn man in einer Assemblersprache schreibt , kann ein Compiler nicht viel: Alles, was er sieht, sind sehr feinkörnige Anweisungen. Fortran erfordert explizite Kenntnisse (daher mehr Arbeit durch den Programmierer) nur in Fällen, die für Array-based Computing echte Belohnungen bringen. Fortran verwendet einfache Datentypen, einen grundlegenden Steuerungsfluss und begrenzte Namespaces. Im Gegensatz dazu teilt es dem Computer nicht mit , wie Register geladen werden sollen (was für Echtzeit erforderlich sein kann ). Wo Fortran ist explizit, ermöglicht es Dinge wie komplette Typinferenz, die Anfänger zu beginnen hilft. Es vermeidet auch eine Sache, die C oft langsam macht:undurchsichtige Zeiger .

Fortran kann langsam sein

Fortran ist nicht für jede Aufgabe schnell: Deshalb verwenden es nicht viele Menschen zum Erstellen von GUIs oder sogar für hochgradig unstrukturiertes wissenschaftliches Rechnen. Sobald Sie die Welt der Arrays für Graphen, Entscheidungsbäume und andere Bereiche verlassen, verschwindet dieser Geschwindigkeitsvorteil schnell. In den Benchmarks für Computersprachen finden Sie einige Beispiele und Zahlen.


7
Die GUI / IO-Probleme können leicht gelöst werden, indem Fortran Crunching in einer "allgemeineren" Sprache verpackt wird. Ich benutze häufig R für diesen Zweck.
mbq

2
shootout.alioth.debian.org ist nicht mehr verfügbar! Und die neue Version hat viel weniger Informationen :(
Astrojuanlu

23

Das Design von Fortran ermöglicht es dem Compiler, in einigen Fällen stärkere Optimierungen durchzuführen, die C im Allgemeinen nicht zur Verfügung stehen.

Ein bekanntes Beispiel ist der Umgang mit Aliasing . In Fortran können Sie nur über das diesem Speicherbereich zugeordnete Symbol auf einen bestimmten Speicherbereich zugreifen. Dieses Wissen ermöglicht es dem Compiler, intelligente Tricks anzuwenden, wenn es Zeit zum Zwischenspeichern ist: Er weiß, ob sich ein Wert möglicherweise geändert hat oder nicht. Bis F90 war dies leicht zu überprüfen. Als Fortran 90 eingeführt wurde pointers, stimmte die Annahme nicht mehr: Sie konnten über zwei (oder mehr) Symbole auf denselben Speicherbereich zugreifen. Aus diesem Grund müssen Sie die targetArrays angeben , die Sie über Zeiger adressieren möchten.

Eine weitere interessante Tatsache ist, dass viele Konstrukte es dem Compiler ermöglichen, ohne Benutzereingriff eine Parallelisierung durchzuführen. Ein solcher Luxus ist aufgrund des relativen "Plattform-Agnostizismus" von Fortran als Sprache möglich.

Es gibt viele andere subtile Tricks wie diesen. Denken Sie außerdem daran, dass heute niemand mehr Fortran verwendet, außer für numerische Berechnungen. Dies bedeutet, dass das Hauptmerkmal und das Verkaufsargument von Fortran-Compilern die resultierende Codegeschwindigkeit ist. Infolgedessen konzentrierten sich die Anbieter darauf.

Trotzdem können Sie performanten Code auch mit anderen Sprachen erzeugen. Es kann jedoch besondere Sorgfalt oder menschliches Eingreifen erfordern. Der allgemeine Punkt ist jedoch, dass die Leistung kein Problem darstellt, bis es ein Problem gibt, und dass die Arbeitszeit viel teurer ist als die Computerzeit. Daher sollten sich die Programmierpraktiken auf die Zeitersparnis konzentrieren und nicht auf die Computerzeit.


2
Wenn Ihre Computer in den Bereich von> 100 Millionen US-Dollar kommen, sieht die Zeit der Studenten im Vergleich dazu nicht mehr so ​​teuer aus.
Phil Miller

6
@Novelocrat: Die Menge an Code, die auf 100 Millionen US-Dollar- Computern ausgeführt wird, wurde von unzähligen Mannstunden geschrieben, die die Marke von 100 Millionen US- Dollar sogar zum Studentenpreis deutlich übertreffen. Denken Sie daran, dass die Kosten einer Person das Doppelte ihres Einkommens betragen. Der Rest geht in Steuern und korreliert. Bei einem Computer tritt kein Abbrand auf. Eine Person macht und wird den Job wechseln.
Stefano Borini

1
@StefanoBorini Ich habe eine lange Geschichte von PCs, die ein Abbrennen erlebt haben ...
N74

1
"Denken Sie außerdem daran, dass heute niemand Fortran verwendet, außer für numerische Berechnungen." Fortran = "FORmula TRANslation". Fortran wurde immer hauptsächlich für numerische Berechnungen verwendet und entwickelt. Fortran hat einen großen Anteil an der Zeit von Hochleistungscomputern.
user21387

Fortran wird heute wie immer für den gleichen Zweck verwendet - für numerische Berechnungen.
Sequenz

12

Ich denke nicht, dass Fortran dem Metall so nahe ist (siehe andere Antwort), aber es tendiert dazu, sehr leicht zu optimieren. Schleifen sind einfach und die Sprache unterstützt problemlos Vektorisierungserweiterungen.

Es gibt auch den großen Trägheitsfaktor. In Fortran ist viel numerischer Code enthalten, daher stellen Hersteller von High-End-Servern und Supercomputern sicher, dass sie gute, optimierende Fortran-Compiler schreiben. Die Compiler sind gut (auch auf Rechnern mit relativ wenig hochwertigen Compilern), sodass die Benutzer den Fortran weiterhin verwenden und sogar neuen Code darin schreiben. Also stellen die Bauherren sicher, dass ihre nächste Generation gute Compiler usw. hat.


8

Pass auf urbane Mythen auf. Wenn zwei Compiler denselben Assemblycode generieren, haben die resultierenden Programme dieselbe Leistung.

Für jede Logik gibt es ein Programm in Assemblersprache, das die Ausführungszeit minimiert. Diesem Programm ist es egal, welcher Compiler es generiert hat.

Das heißt, kompilierte Sprachen existieren, um dem Programmierer das Leben zu erleichtern. Ein Teil der Kosten hierfür besteht darin, dass der Benutzer möglicherweise dazu verleitet wird, Funktionen zu verwenden, die nicht zu einer minimalen Ausführungszeit führen. Das beste Beispiel dafür ist newC ++. (Wie langsam könnte es sein - es sind nur drei Zeichen?) Es fordert Sie praktisch dazu auf, Speicher dynamisch zuzuweisen und die Laufzeitkosten nicht zu berücksichtigen. Wenn Sie das wollen, ist das großartig, aber Fortran könnte schneller sein, nur weil es Sie nicht dazu gebracht hat.

Aber weit darüber hinaus habe ich noch nie ein Programm gesehen, das, wie zuerst geschrieben, keinen größeren Spielraum für Leistungsverbesserungen der Art hatte, die der Compiler niemals für Sie bereinigen konnte. Als ein Beispiel, einen großen Teil der Zeit damit zu verbringen, mit dem gleichen Argument zu telefonieren expund / oder logwiederholt zu telefonieren. Ein weiteres Beispiel ist der Aufruf von DGEMM, um Matrizen zu multiplizieren und festzustellen, dass ein großer Teil der Zeit für den Aufruf von LSAME aufgewendet wird, nur um die eingegebenen Zeichenargumente zu entschlüsseln.

Dies ist zur gleichen Zeit, zu der die Leute sagen, dass Fortran durch Pointer-Aliasing oder Loop-Unrolling schneller ist. Das ist so, als würde ein Bus von Porsche sicherlich schneller sein als ein Bus von Chevrolet. Es muss ein bisschen gesunden Menschenverstand geben.


4
Ich denke nicht, dass es nur ein urbaner Mythos ist. Fortrans Unterstützung für Operationen mit ganzen Arrays, PURE / ELEMENTAL-Funktionen usw. kann Compilern helfen, auf einfache Weise zu optimieren, zu vektorisieren oder sogar zu parallelisieren. Siehe zum Beispiel thinkingparallel.com/2007/08/14/… . Was die Compiler tatsächlich tun, ist eine andere Geschichte (abhängig vom Hersteller).
Stali

@stali: Es kommt mehr darauf an als auf den Anbieter. Dies hängt vom zu kompilierenden Programm ab. Ich habe gesehen, wie die Leute von "Es gibt ein Programm, das Fortran schnell laufen lässt" zu "Fortran ist in jedem Programm schneller" verallgemeinerten. Wenn Sie darauf hinweisen, können die Leute anfangen, die Haare zu kämmen und zu hauen und zu spalten, und worauf es letztendlich ankommt, ist im Grunde nichts anderes als das, was die Leute denken wollen.
Mike Dunlavey
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.