Wieso ist Fortran so schnell?



  • Nathan schrieb:

    Bei Fortan geht der Compiler davon aus output != input != matrix != n (ich mein jetzt, dass alle verschieden sind, nicht der C Ausdruck).
    Das bedeutet, der Compiler kann Code generieren, der als erstes die vier Werte aus matrix in Register lädt und dann direkt mit Registerwerten.
    In C kann der Compiler nicht davon ausgehen, d.h. ein Verändern von output könnte genauso gut input oder matrix verändern.
    Das bedeutet, dass er die Werte in jedem Schleifendurchlauf die Werte von matrix erneut einlesen muss, schließlich kann output ja gleich matrix sein und somit ein Schreiben in matrix die Werte in output verändern.

    Jetzt habe ich es verstanden. Danke!



  • An so einer "Kleinigkeit" liegt das? Wow, hätte ich nicht gedacht! Wieder was gelernt, vielen Dank!


  • Mod

    Namenloser324 schrieb:

    An so einer "Kleinigkeit" liegt das? Wow, hätte ich nicht gedacht! Wieder was gelernt, vielen Dank!

    Es ist ja auch kein großer Unterschied. In konstruierten Ausnahmefällen (die allesamt beinhalten, dass der C-Programmierer kein restrict benutzt und man es dem Compiler möglichst schwer macht) kannst du minimale Unterschiede messen.

    Zudem noch ein wichtiger Punkt: Die Performance compilierter Programme hängt sehr stark von der Qualität der Compiler ab. Fortran ist sehr viel älter als C. Als C neu war, waren die Fortrancompiler sehr ausgereift, die C-Compiler aber noch primitiv. Die Fortrancompiler haben schlicht besseren Code erzeugt. Mittlerweile sind die C-Compiler aber mindestens genau so gut, oft sogar deutlich besser. Denn C ist viel populärer und daher wird auch viel mehr für die Entwicklung der Compiler getan. Wenn du irgendein zufälliges Programm nimmst (ohne absichtlich konstruierte Aliasfälle an kritischen Stellen), einmal als C und einmal als Fortran und jeweils durch die neuesten GNU, Intel, was-auch-immer-Compiler jagst, dann würde ich, wenn ich auf das schnellere Programm wetten müsste, auf das C-Programm setzen.



  • SeppJ schrieb:

    Zudem noch ein wichtiger Punkt: Die Performance compilierter Programme hängt sehr stark von der Qualität der Compiler ab. Fortran ist sehr viel älter als C. Als C neu war, waren die Fortrancompiler sehr ausgereift, die C-Compiler aber noch primitiv. Die Fortrancompiler haben schlicht besseren Code erzeugt. Mittlerweile sind die C-Compiler aber mindestens genau so gut, oft sogar deutlich besser. Denn C ist viel populärer und daher wird auch viel mehr für die Entwicklung der Compiler getan. Wenn du irgendein zufälliges Programm nimmst (ohne absichtlich konstruierte Aliasfälle an kritischen Stellen), einmal als C und einmal als Fortran und jeweils durch die neuesten GNU, Intel, was-auch-immer-Compiler jagst, dann würde ich, wenn ich auf das schnellere Programm wetten müsste, auf das C-Programm setzen.

    Mich würde es dann noch interessieren, warum noch so viel Fortran verwendet wird und es auch noch stark weiterentwickelt wird? Liegt es daran, dass es noch so viel alten Code gibt oder will man im Bereich Numerik noch die letzten 10% mehr Leistung herausholen? Obwohl ich sagen muss, dass modernes Fortran sehr angenehm ist, wenn es vernünftige Bücher dazu geben würde.


  • Mod

    SLx64 schrieb:

    Mich würde es dann noch interessieren, warum noch so viel Fortran verwendet wird und es auch noch stark weiterentwickelt wird?

    ISt letzteres der Fall? Ich habe den Eindruck, dass die Sprache lange tot ist und nur noch davon zehrt, dass es auf der Welt so viel (guten und schlechten) Code gibt, den man nicht einfach wegwerfen möchte. Die Projekte, die schon in Fortran sind, werden dann natürlich auch weiter entwickelt, aber ich glaube ich habe nie davon gehört, dass irgendjemand irgendwo in den letzten Jahrzehnten was Größeres in Fortran angefangen hätte.

    Ein weiterer Punkt, der bezüglich dieser Frage eine Rolle spielt(e): Fortran ist eine weniger komplexe Sprache (unter anderem eben wegen solcher Regeln, dass Aliasingprobleme einfach wegdefiniert werden), was dazu führt, dass man etwas einfacher Compiler für sie schreiben kann. Bei ganz neuen Computersystemen steht daher oft zuallererst ein Fortrancompiler zur Verfügung. Wenn man ganz vorne mit dabei sein will, dann ist es also gut, wenn der eigene Code in Fortran geschrieben ist. Dieser Faktor hat sich aber auch in den letzten Jahrzehnten abgeschwächt, da der typische Supercomputer heutzutage mit 0815-Prozessoren von der Stange bestückt wird und keine neuartigen Compiler nötig sind. Außerdem wissen die Systembauer natürlich, dass die Kunden eher C und C++ wünschen und stellen sich drauf ein.

    PS: Bei "weniger komplex" rede ich natürlich von Urfortran, nicht den modernen Varianten, die sich zu Fortran verhalten, wie C++ (oder gar D) zu C. Benutzt die eigentlich irgendjemand? Wenn ich mal Fortrancode sehe, ist der meist wirklich in Fortran 77 o.Ä., bestenfalls mit freier Spaltenwahl als Zugeständnis an moderne Zeiten. Ich glaube, die Sprache hat einfach einen schlechten Ruf, deswegen nimmt niemand so wirklich die moderneren Abkömmlinge ernst. Kann ich auch verstehen. Ich habe im Studium auch Fortran 77 nutzen müssen und das war sicherlich wichtig für meine spätere Entscheidung, C++ als Hauptsprache zu wählen 😃 .



  • SeppJ schrieb:

    PS: Bei "weniger komplex" rede ich natürlich von Urfortran, nicht den modernen Varianten, die sich zu Fortran verhalten, wie C++ (oder gar D) zu C.

    Das alte Fortran hatte AFAIR keinen Stack und alle Adressen waren zur Compilezeit bekannt. Denke, das war auch ein guter Speed-Bringer.

    1990 war es ein Geheimtipp, bei rechenintensiven Anwendungen gegen die alten fast vergessenen Fortran-Libs zu linken. Damals gab es schon keine Fortran-Programmierer mehr.

    1997 die letzte Erwähnung von Fortran als schnell. http://www.drdobbs.com/cpp/scientific-computing-c-versus-fortran/184410315

    2014 dieser Thread. 🤡



  • Mich würde es einfach mal interessieren, warum man teilweise noch so einen Aufwand betreibt z.B. Numerik-Bibliotheken in Fortran anstatt in C zu schreiben oder mit z.B. Cuda Fortran und FortranCL noch Fortran-Abkömmlinge für GPGPU-Programmierung zu entwickeln.

    Wenn man sich die modernen Varianten anguckt würde ich als Laie sagen, dass es schon interessante Weiterentwicklungen sind. Ist es also völlig unnötig damit noch anzufangen und sich statt Fortran lieber auf C und C++ zu konzentrieren?



  • Namenloser324 schrieb:

    An so einer "Kleinigkeit" liegt das? Wow, hätte ich nicht gedacht!

    Tut es fast nie. In erster Linie werden Programme schnell, wenn man die richtigen Algorithmen/Datenstrukturen auswählt (Laufzeitkomplexität), das macht oft Programme 10 mal schneller. So kleinkram wie Compileroptimierung damit was besser in Register geschrieben wird bringt vielleicht 10% bei einigen wenigen fällen.



  • SLx64 schrieb:

    Mich würde es einfach mal interessieren, warum man teilweise noch so einen Aufwand betreibt z.B. Numerik-Bibliotheken in Fortran anstatt in C zu schreiben oder mit z.B. Cuda Fortran und FortranCL noch Fortran-Abkömmlinge für GPGPU-Programmierung zu entwickeln.

    Siehe Seite 1. Es gibt einfach schon Unmengen Fortran-Code da draußen. Komplett neue Projekte in Fortran sind _sehr_ selten, Weiterentwicklung und Wartung bestehender Fortran-Libraries natürlich weniger.



  • schon mal was von netlib (scientific computing), blas und lapack gehört? Ich habe gerade vor ein paar Tagen zwei Numerik-Libraries in Fortran compiliert.



  • Bezieht sich auf:

    volkard schrieb:

    1990 war es ein Geheimtipp, [...] Damals gab es schon keine Fortran-Programmierer mehr.
    [...]
    2014 dieser Thread.


  • Mod

    großbuchstaben schrieb:

    schon mal was von netlib (scientific computing), blas und lapack gehört? Ich habe gerade vor ein paar Tagen zwei Numerik-Libraries in Fortran compiliert.

    Entwicklungsbeginn 1980, 1979 und 1992 (aber auf alten Code aus den 1970ern aufbauend). Was war dein Punkt?



  • SeppJ schrieb:

    großbuchstaben schrieb:

    schon mal was von netlib (scientific computing), blas und lapack gehört? Ich habe gerade vor ein paar Tagen zwei Numerik-Libraries in Fortran compiliert.

    Entwicklungsbeginn 1980, 1979 und 1992 (aber auf alten Code aus den 1970ern aufbauend). Was war dein Punkt?

    Davon gibt es auch schon Versionen in C, C++, OpenCl, Cuda, usw...



  • SeppJ schrieb:

    großbuchstaben schrieb:

    schon mal was von netlib (scientific computing), blas und lapack gehört? Ich habe gerade vor ein paar Tagen zwei Numerik-Libraries in Fortran compiliert.

    Entwicklungsbeginn 1980, 1979 und 1992 (aber auf alten Code aus den 1970ern aufbauend). Was war dein Punkt?

    ich kann nichts Falsches daran finden, im Jahr 2014 über Fortran zu diskutieren, wo Fortran-Numerik-Libraries im Einsatz sind, die von grundlegender Bedeutung sind.

    Manche Sprachen sind - gemessen am Innovationstempo in der IT-Welt - faszinierend langlebig, Cobol ist auch so eine.



  • großbuchstaben schrieb:

    Cobol

    Der Trollwettbewerb ist auch erstaunlich langlebig.



  • volkard schrieb:

    großbuchstaben schrieb:

    Cobol

    Der Trollwettbewerb ist auch erstaunlich langlebig.

    Jede Programmiersprache hat ihre Schwerpunkte. Cobol steht für "COmmon Business-Oriented Language". Aha - Hier gehts also nicht um Mathematik - nein - es geht auch nicht um dynamische 10 dimensionale Tabellen - und nein - es geht auch nicht darum 10 recursive Funktionen zu bauen oder mit Makrocode ein Programm völlig unleserlich zu machen.

    Bei Cobol geht es um EDV! Für die, die es nicht wissen: "E lektronische D aten V erarbeitung". Es geht also darum, sehr effizient "Daten" zu verarbeiten. Das macht Cobol seit 50 Jahren wunderbar - und vermutlich noch einige Jahre mehr... 🙂



  • FORTRAN ist nicht schneller als z.B. C oder C++ oder nur unbedeutend durch den möglicherweise geringfügigeren
    Overhead der Benutzeroberfläche. Reine Bibliotheken für Berechnungen dürften etwa gleich schnell sein.

    Es wurde schon gesagt: es kommt mehr auf die Realisierung eines Algorithmus an. Dies gilt vor allem, wenn
    zur Lösung einer Aufgabe Iterationen erforderlich sind.

    Diese Diskussion kann leicht zum Trollthema ausarten! 🕶



  • @berniebutt: Hast du eigentlich den Link auf Stackoverflow gelesen?



  • berniebutt schrieb:

    FORTRAN ist nicht schneller als z.B. C oder C++ oder nur unbedeutend durch den möglicherweise geringfügigeren
    Overhead der Benutzeroberfläche. Reine Bibliotheken für Berechnungen dürften etwa gleich schnell sein.

    Dann siehst Du Fortran als super Sprache zur Realisierung von Benutzeroberflächen an? 🤡

    berniebutt schrieb:

    Es wurde schon gesagt: es kommt mehr auf die Realisierung eines Algorithmus an. Dies gilt vor allem, wenn
    zur Lösung einer Aufgabe Iterationen erforderlich sind.

    Fortran kommt auf Supercomputern und Clustern zum Einsatz, wenn es um die Realisierung von numerischen Methoden geht. Ansonsten ist Fortran praktisch nirgendwo anzutreffen. Neben Fortran findet man auf Supercomputern ansonsten noch C und C++ im Einsatz. Meiner Meinung nach gibt es bei der Performance zwischen diesen Sprachen keine großen Unterschiede, wobei es natürlich Argumentationen gibt, dass ein Fortran Compiler bei der Optimierung mehr Annahmen treffen kann, da die Sprache dem Programmierer weniger Freiheitsgrade lässt. Ich denke, die Entscheidung für eine der Sprachen hängt von anderen Aspekten ab. Vor allem sind C++ und Fortran unterschiedlichen Communities zuzuordnen. Wenn man als Student eines naturwissenschaftlichen Faches in seiner Abschlussarbeit oder Promotion programmiert, dann entscheiden in erster Linie die Fragen, bezüglich welcher Sprache Know-How in der Arbeitsgruppe vorhanden ist, welche Sprache schneller zu erlernen ist und auch ob schon Code in einer bestimmten Sprache existiert. Bei diesen Aspekten fällt die Wahl dann sehr oft auf Fortran. Wenn die Arbeitsgruppe einen Informatik-Hintergrund hat, dann wird die Wahl vermutlich eher auf C++ fallen.



  • Gregor schrieb:

    berniebutt schrieb:

    FORTRAN ist nicht schneller als z.B. C oder C++ oder nur unbedeutend durch den möglicherweise geringfügigeren
    Overhead der Benutzeroberfläche. Reine Bibliotheken für Berechnungen dürften etwa gleich schnell sein.

    Dann siehst Du Fortran als super Sprache zur Realisierung von Benutzeroberflächen an? 🤡

    NEIN, falsch verstanden! FORTRAN unterstützt keine aufwendigen Benutzeroberflächen, also ist der Overhead reduziert.
    Dadurch entfällt dann etwas Rechenaufwand.

    Ansonsten sei niemand mehr FORTRAN zum Lernen angeraten, es sei denn er muss
    alte Sources pflegen. Die C-Sprachen sind moderner. Alles, was man mit FORTRAN
    einst machen konnte, geht mit C genauso nur mit anderer Syntax.


Anmelden zum Antworten