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.
quelle
Antworten:
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.
quelle
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 dietarget
Arrays 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.
quelle
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.
quelle
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
new
C ++. (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
exp
und / oderlog
wiederholt 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.
quelle