Ist Fortran für schwere Berechnungen einfacher zu optimieren als C?

408

Von Zeit zu Zeit las ich, dass Fortran für schwere Berechnungen schneller als C ist oder sein kann. Ist das wirklich wahr? 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 es wahr ist, sag mir bitte warum. Bitte sag mir nicht, welche Sprachen oder Bibliotheken für das Knacken von Zahlen gut sind. Ich habe nicht vor, eine App oder Bibliothek zu schreiben, um das zu tun. Ich bin nur neugierig.

Quinmars
quelle
51
Aus den unten angegebenen Antworten nicht wirklich subjektiv. Der korrekte Titel lautet "Gibt es grundlegende architektonische Gründe, warum ein Fortran-Compiler möglicherweise besseren optomisierten Code als ein C-Compiler erzeugt?", Aber das ist nur eine Fehlentscheidung.
Martin Beckett
3
Die Titelfrage ist weniger subjektiv als vielmehr ein Missverständnis, denke ich. Die detailliertere Frage ist nicht subjektiv.
jfm3
1
Ich glaube nicht, dass irgendjemand viel daraus lernen würde, außer dass die Antwort gleichzeitig "Ja" und "Nein" lautet und je nach Compiler, Quelle, CPU, Speicherlayout usw. usw. usw. gähnt. Gähnen.
user7116
1
Ich denke nicht, dass die Frage oder die Antworten subjektiv sind. Aber wenn Sie denken, dass diese Flagge jemandem hilft, bin ich damit einverstanden.
Quinmars
2
@sixlettervariables Obwohl Sie und ich die Antwort bereits kennen, ist dies eine Frage, die den meisten Menschen zu Beginn ihrer Karriere in den Sinn kommt, und es ist wichtig, die Antwort zu verstehen. Anstatt einen abweisenden Kommentar zu
schreiben,

Antworten:

445

Die Sprachen haben ähnliche Funktionen. Der Leistungsunterschied ergibt sich aus der Tatsache, dass laut Fortran Aliasing nicht zulässig ist, es sei denn, eine EQUIVALENCE-Anweisung wird verwendet. Jeder Code mit Aliasing ist kein gültiger Fortran, aber es liegt am Programmierer und nicht am Compiler, diese Fehler zu erkennen. Daher ignorieren Fortran-Compiler ein mögliches Aliasing von Speicherzeigern und ermöglichen es ihnen, effizienteren Code zu generieren. Schauen Sie sich dieses kleine Beispiel in C an:

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

Diese Funktion würde nach der Optimierung langsamer als das Fortran-Gegenstück ausgeführt. Warum so? Wenn Sie Werte in das Ausgabearray schreiben, können Sie die Werte der Matrix ändern. Schließlich könnten sich die Zeiger überlappen und auf denselben Speicherbereich zeigen (einschließlich des intZeigers!). Der C-Compiler ist gezwungen, die vier Matrixwerte für alle Berechnungen aus dem Speicher neu zu laden.

In Fortran kann der Compiler die Matrixwerte einmal laden und in Registern speichern. Dies ist möglich, da der Fortran-Compiler davon ausgeht, dass sich Zeiger / Arrays im Speicher nicht überlappen.

Glücklicherweise wurden das restrictSchlüsselwort und das strikte Aliasing in den C99-Standard eingeführt, um dieses Problem zu beheben. Es wird heutzutage auch in den meisten C ++ - Compilern gut unterstützt. Mit dem Schlüsselwort können Sie dem Compiler einen Hinweis geben, dass der Programmierer verspricht, dass ein Zeiger keinen Alias ​​mit einem anderen Zeiger hat. Das strikte Aliasing bedeutet, dass der Programmierer verspricht, dass sich Zeiger unterschiedlichen Typs niemals überlappen, z. B. a double*nicht mit a int*(mit der spezifischen Ausnahme, dass char*und void*mit irgendetwas überlappen können).

Wenn Sie sie verwenden, erhalten Sie die gleiche Geschwindigkeit von C und Fortran. Die Möglichkeit, das restrictSchlüsselwort nur mit leistungskritischen Funktionen zu verwenden, bedeutet jedoch, dass C- (und C ++) Programme viel sicherer und einfacher zu schreiben sind. Betrachten Sie beispielsweise den ungültigen Fortran-Code : CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30), den die meisten Fortran-Compiler ohne Vorwarnung gerne kompilieren, der jedoch einen Fehler verursacht, der nur bei einigen Compilern, auf einigen Hardwarekomponenten und mit einigen Optimierungsoptionen auftritt.

Nils Pipenbrinck
quelle
26
Alles wahr und gültig, Jeff. Ich halte den Schalter "kein Aliasing annehmen" jedoch nicht für sicher. Es kann Code, der von anderen Projekten geerbt wurde, auf so subtile Weise brechen, dass ich ihn lieber nicht verwenden würde. Ich bin aus diesem Grund ein Restrict-Nazi geworden :-)
Nils Pipenbrinck
3
Bis zu meinem zweiten Punkt müssen Sie den No-Alias-Compiler-Schalter nicht verwenden. Schreiben Sie einfach den Code so, dass die zeigerbasierten Lasten zuerst einer automatischen Variablen zugewiesen werden, und arbeiten Sie dann von dort aus mit der Automatik. Es wird ausführlicher aussehen, aber vom Compiler perfekt optimiert.
Tall Jeff
33
Ein gutes Beispiel ist die bloße Existenz von memcpy () vs. memmove (). Im Gegensatz zu memcpy () bewältigt memmove () überlappende Bereiche, daher kann memcpy () schneller sein als memmove (). Dieses Problem war ein ausreichender Grund für jemanden, zwei Funktionen anstelle einer in die Standardbibliothek aufzunehmen.
JFS
12
Ich denke, das war Sebastians Punkt - aufgrund der Komplexität / Flexibilität der Handhabung des C-Speichers ist selbst etwas so Einfaches wie das Verschieben des Speichers schwierig.
Martin Beckett
3
Ihr call transformBeispiel hat nicht viel Sinn.
Vladimir F
162

Ja, 1980; in 2008? hängt davon ab

Als ich anfing, professionell zu programmieren, wurde die Geschwindigkeitsdominanz von Fortran gerade in Frage gestellt. Ich erinnere mich, dass ich in Dr. Dobbs darüber gelesen und den älteren Programmierern von dem Artikel erzählt habe - sie haben gelacht.

Ich habe also zwei Ansichten dazu, theoretische und praktische. Theoretisch hat Fortran heute keinen eigentlichen Vorteil gegenüber C / C ++ oder einer anderen Sprache, die Assembler-Code zulässt. In der Praxis genießt Fortran noch heute die Vorteile des Erbes einer Geschichte und Kultur, die auf der Optimierung des numerischen Codes beruht.

Bis einschließlich Fortran 77 standen bei Überlegungen zur Sprachgestaltung die Optimierung im Vordergrund. Aufgrund des Standes der Compilertheorie und -technologie bedeutete dies häufig eine Einschränkung der Funktionen und Fähigkeiten, um dem Compiler die bestmögliche Möglichkeit zur Optimierung des Codes zu bieten. Eine gute Analogie ist, sich Fortran 77 als einen professionellen Rennwagen vorzustellen, der Merkmale für Geschwindigkeit opfert. Heutzutage sind Compiler in allen Sprachen besser geworden und Funktionen für die Produktivität von Programmierern werden mehr geschätzt. Es gibt jedoch immer noch Orte, an denen es den Menschen hauptsächlich um Geschwindigkeit im wissenschaftlichen Rechnen geht. Diese Leute haben höchstwahrscheinlich Code, Training und Kultur von Leuten geerbt, die selbst Fortran-Programmierer waren.

Wenn man über die Optimierung von Code spricht, gibt es viele Probleme, und der beste Weg, ein Gefühl dafür zu bekommen, besteht darin, dort zu lauern, wo Menschen sind, deren Aufgabe es ist, schnellen numerischen Code zu haben . Beachten Sie jedoch, dass solch kritisch sensibler Code normalerweise nur einen kleinen Teil der gesamten Codezeilen ausmacht und sehr spezialisiert ist: Viel Fortran-Code ist genauso "ineffizient" wie viel anderer Code in anderen Sprachen, und die Optimierung sollte nicht einmal sein ein Hauptanliegen eines solchen Codes .

Ein wunderbarer Ort, um etwas über die Geschichte und Kultur von Fortran zu lernen, ist Wikipedia. Der Wikipedia-Eintrag in Fortran ist hervorragend und ich schätze diejenigen sehr, die sich die Zeit und Mühe genommen haben, ihn für die Fortran-Community wertvoll zu machen.

(Eine verkürzte Version dieser Antwort wäre ein Kommentar in dem ausgezeichneten Thread gewesen, der von Nils gestartet wurde, aber ich habe nicht das Karma, um das zu tun. Eigentlich hätte ich wahrscheinlich überhaupt nichts geschrieben, aber dafür hat dieser Thread tatsächlich Informationsgehalt und -austausch im Gegensatz zu Flammenkriegen und Sprachbigotterie, was meine Haupterfahrung mit diesem Thema ist. Ich war überwältigt und musste die Liebe teilen.)

Jaredor
quelle
1
Der Link: web.archive.org/web/20090401205830/http://ubiety.uwaterloo.ca/… funktioniert nicht mehr. Gibt es einen alternativen Link?
Nathanielng
64

In gewissem Maße wurde Fortran unter Berücksichtigung der Compileroptimierung entwickelt. Die Sprache unterstützt ganze Array-Operationen, bei denen Compiler Parallelität ausnutzen können (insbesondere auf Multi-Core-Prozessoren). Zum Beispiel,

Eine dichte Matrixmultiplikation ist einfach:

matmul(a,b)

Die L2-Norm eines Vektors x lautet:

sqrt(sum(x**2))

Darüber hinaus Aussagen wie FORALL, PUREund ELEMENTALVerfahren usw. weitere Hilfe zu optimieren Code. Selbst Zeiger in Fortran sind aus diesem einfachen Grund nicht so flexibel wie C.

Der kommende Fortran-Standard (2008) verfügt über Co-Arrays, mit denen Sie problemlos parallelen Code schreiben können. G95 (Open Source) und Compiler von CRAY unterstützen dies bereits.

Ja, Fortran kann schnell sein, einfach weil Compiler es besser optimieren / parallelisieren können als C / C ++. Aber wie alles andere im Leben gibt es auch hier gute und schlechte Compiler.

user49734
quelle
1
Das forallKonstrukt ist veraltet, da Compiler den Code nicht gut optimieren konnten. Der Ersatz ist do concurrent. Außerdem sqrt(sum(x**2))sieht der Code ineffizient aus, da der Compiler wahrscheinlich den gesamten Vektor erstellt x**2. Ich würde vermuten, dass eine Schleife besser ist, aber es ist zweifellos am besten, die intrinsische norm2Funktion aufzurufen .
A. Hennink
39

Es ist lustig, dass viele Antworten hier darauf zurückzuführen sind, dass sie die Sprachen nicht kennen. Dies gilt insbesondere für C / C ++ - Programmierer, die alten FORTRAN 77-Code geöffnet und die Schwachstellen besprochen haben.

Ich nehme an, dass das Geschwindigkeitsproblem hauptsächlich eine Frage zwischen C / C ++ und Fortran ist. In einem riesigen Code hängt es immer vom Programmierer ab. Es gibt einige Merkmale der Sprache, die Fortran übertrifft, und einige Merkmale, die C bietet. Im Jahr 2011 kann also niemand wirklich sagen, welcher schneller ist.

In Bezug auf die Sprache selbst unterstützt Fortran heutzutage vollständige OOP-Funktionen und ist vollständig abwärtskompatibel. Ich habe den Fortran 2003 gründlich benutzt und ich würde sagen, es war einfach herrlich, ihn zu benutzen. In einigen Aspekten steht Fortran 2003 immer noch hinter C ++, aber schauen wir uns die Verwendung an. Fortran wird hauptsächlich für numerische Berechnungen verwendet, und aus Geschwindigkeitsgründen verwendet niemand ausgefallene C ++ - OOP-Funktionen. Beim Hochleistungsrechnen hat C ++ fast keinen Platz mehr (sehen Sie sich den MPI-Standard an und Sie werden sehen, dass C ++ veraltet ist!).

Heutzutage können Sie mit Fortran und C / C ++ einfach gemischte Sprachen programmieren. Es gibt sogar Schnittstellen für GTK + in Fortran. Es gibt kostenlose Compiler (gfortran, g95) und viele ausgezeichnete kommerzielle.

Hossein Talebi
quelle
8
Könnten Sie bitte eine Quelle, eine spezifische Erfahrung oder ein wissenschaftliches Institut / eine Hochleistungsrechneragentur hinzufügen, die entweder für zukünftige Projekte von C ++ abweicht oder C ++ - Projekte in eine andere Sprache umschreibt. Ich frage nur, weil ich mindestens zwei wissenschaftliche Institutionen kenne, Sandia und CERN, die C ++ stark für ihre Hochleistungsmodellierung verwenden. Zusätzlich hat Sandia eine ihrer Modellierungssoftware (LAMMPS) von fortran auf c ++ umgestellt und eine Reihe großartiger Verbesserungen hinzugefügt.
Zachary Kraus
7
LAMMPS ist in extrem einfachem C ++ geschrieben, das die meisten modernen Funktionen der Sprache nicht nutzt. Es stellt das C ++ dar, das Fortran-Programmierer, die C kennen, nach dem Erlernen von C ++ 98 schreiben. Dies bedeutet nicht, dass LAMMPS schlecht geschrieben ist, nur dass es nicht das Beispiel ist, das Sie anführen möchten, wenn Sie sich für C ++ in HPC einsetzen.
Jeff
30

Es gibt mehrere Gründe, warum Fortran schneller sein könnte. Die Menge, die sie ausmachen, ist jedoch so belanglos oder kann sowieso umgangen werden, dass es keine Rolle spielen sollte. Der Hauptgrund für die heutige Verwendung von Fortran ist die Wartung oder Erweiterung älterer Anwendungen.

  • PURE- und ELEMENTAL-Schlüsselwörter für Funktionen. Dies sind Funktionen, die keine Nebenwirkungen haben. Dies ermöglicht Optimierungen in bestimmten Fällen, in denen der Compiler weiß, dass dieselbe Funktion mit denselben Werten aufgerufen wird. Hinweis: GCC implementiert "pure" als Erweiterung der Sprache. Andere Compiler können ebenfalls. Eine modulübergreifende Analyse kann diese Optimierung ebenfalls durchführen, ist jedoch schwierig.

  • Standardfunktionssatz, der sich mit Arrays befasst, nicht mit einzelnen Elementen. Sachen wie sin (), log (), sqrt () nehmen Arrays anstelle von Skalaren. Dies erleichtert die Optimierung der Routine. Die automatische Vektorisierung bietet in den meisten Fällen die gleichen Vorteile, wenn diese Funktionen inline oder integriert sind

  • Eingebauter komplexer Typ. Theoretisch könnte dies dem Compiler ermöglichen, bestimmte Anweisungen in bestimmten Fällen neu zu ordnen oder zu entfernen, aber wahrscheinlich würden Sie den gleichen Vorteil mit der Struktur sehen {double re, im; }; Die in C verwendete Redewendung sorgt jedoch für eine schnellere Entwicklung, da die Bediener in fortran an komplexen Typen arbeiten.

Greg Rogers
quelle
1
"aber wahrscheinlich würden Sie den gleichen Vorteil mit der { double re, im; };in C verwendeten Struktursprache sehen ". C-Compiler geben diese Struktur höchstwahrscheinlich in sret-Form zurück, wobei der Aufruferstapel Speicherplatz zuweist und einen Zeiger auf den Angerufenen übergibt, der sie ausfüllt. Dies ist um ein Vielfaches langsamer als die Rückgabe mehrerer Werte in Registern, wie dies ein Fortran-Compiler tun würde. Beachten Sie, dass C99 dies im Sonderfall Komplex behoben hat.
Jon Harrop
Ich bin mir nicht sicher, ob ich Ihrem Hauptgrund zustimme. Ich persönlich verwende fortran gerne für mathematischen Code, bei dem Arrays und mathematische Funktionen der wichtigste Teil des Codes sind. Aber ich weiß, dass viele Regierungsinstitutionen und Banken weiterhin fortran verwenden, um Legacy-Code zu pflegen oder zu erweitern. Ich persönlich habe fortran verwendet, um den Code eines Professors für meine Promotion zu erweitern. Ausschuss schrieb.
Zachary Kraus
Ihre Aussage, "der Hauptgrund für die heutige Verwendung von Fortran ist die Wartung oder Erweiterung älterer Anwendungen", ist völlig falsch. Ich habe noch keine andere Programmiersprache gesehen, die auch nur annähernd den Funktionen entspricht, die Fortran bietet, insbesondere für mathematische Anwendungen. Sie haben bereits einige davon genannt, z. B. hervorragende Array-Unterstützung, integrierte komplexe Arithmetik, reine oder elementare Funktionen - und ich könnte auch mehr nennen. Das allein reicht aus, um zu beweisen, dass Ihre obige Aussage falsch ist.
Pap
28

Ich denke, der entscheidende Punkt für Fortran ist, dass es eine Sprache ist, die etwas besser geeignet ist, um vektor- und arraybasierte Mathematik auszudrücken. Das oben erwähnte Problem der Zeigeranalyse ist in der Praxis real, da portabler Code nicht wirklich davon ausgehen kann, dass Sie einem Compiler etwas mitteilen können. Es ist IMMER von Vorteil, Berechnungen so auszudrücken, wie sie der Domäne ähneln. C hat überhaupt keine Arrays, wenn man genau hinschaut, nur etwas, das sich so verhält. Fortran hat echte Arrawys. Dies erleichtert das Kompilieren für bestimmte Arten von Algorithmen, insbesondere für parallele Maschinen.

Tief in Dingen wie dem Laufzeitsystem und den Aufrufkonventionen sind sich C und das moderne Fortran so ähnlich, dass es schwer zu erkennen ist, was einen Unterschied machen würde. Beachten Sie, dass C hier wirklich Basis C ist: C ++ ist ein völlig anderes Problem mit sehr unterschiedlichen Leistungsmerkmalen.

jakobengblom2
quelle
25

Es gibt keine Sprache, die schneller ist als eine andere, daher lautet die richtige Antwort nein .

Was Sie wirklich fragen müssen, ist: "Ist Code, der mit Fortran Compiler X kompiliert wurde, schneller als gleichwertiger Code, der mit C Compiler Y kompiliert wurde?" Die Antwort auf diese Frage hängt natürlich davon ab, welche zwei Compiler Sie auswählen.

Eine andere Frage, die man sich stellen könnte, lautet: "Welcher Compiler würde bei gleichem Aufwand für die Optimierung seiner Compiler schnelleren Code produzieren?" Die Antwort darauf wäre tatsächlich Fortran . Fortran-Compiler haben bestimmte Vorteile:

  • Fortran musste sich damals mit Assembly messen, als einige schworen, niemals Compiler zu verwenden. Deshalb war es auf Geschwindigkeit ausgelegt. C wurde so konzipiert, dass es flexibel ist.
  • Fortrans Nische hat die Zahlen geknackt. In diesem Domain-Code ist nie schnell genug. Es gab also immer viel Druck, die Sprache effizient zu halten.
  • Der größte Teil der Forschung zu Compiler-Optimierungen wird von Personen durchgeführt, die daran interessiert sind, den Fortran-Code für die Zahlenverarbeitung zu beschleunigen. Daher ist die Optimierung des Fortran-Codes ein viel bekannteres Problem als die Optimierung jeder anderen kompilierten Sprache, und neue Innovationen tauchen zuerst bei Fortran-Compilern auf.
  • Biggie : C fördert viel mehr Zeiger als Fortran. Dies erhöht den potenziellen Umfang von Datenelementen in einem C-Programm drastisch, was die Optimierung erheblich erschwert. Beachten Sie, dass Ada in diesem Bereich auch viel besser als C ist und eine viel modernere OO-Sprache ist als das häufig vorkommende Fortran77. Wenn Sie eine OO-Sprache wünschen, die schnelleren Code als C generieren kann, ist dies eine Option für Sie.
  • Die Kunden von Fortran-Compilern interessieren sich aufgrund ihrer Nische immer mehr für die Optimierung als die Kunden von C-Compilern.

Nichts hindert jemanden daran, eine Menge Aufwand in die Optimierung seines C-Compilers zu stecken und ihn dazu zu bringen, besseren Code zu generieren als der Fortran-Compiler seiner Plattform. Tatsächlich macht der größere Umsatz, den C-Compiler generieren, dieses Szenario durchaus realisierbar

TED
quelle
4
Genau. Und darf ich hinzufügen, dass bei der Einführung von Fortran (es war die erste Hochsprache) in den späten 50ern und frühen 60ern viele skeptisch waren, wie effizient es sein könnte. Daher mussten die Entwickler beweisen, dass Fortran effizient und nützlich sein kann, und sich daran machen, "es zu Tode zu optimieren", nur um ihren Standpunkt zu beweisen. C kam viel später (Anfang bis Mitte der 70er Jahre) und hatte sozusagen nichts zu beweisen. Aber zu diesem Zeitpunkt war viel Fortran-Code geschrieben worden, so dass die wissenschaftliche Gemeinschaft daran festhielt und es immer noch tut. Ich programmiere Fortran nicht, aber ich habe gelernt, Fortran-Subroutinen von C ++ aus aufzurufen.
Olumide
3
Die Forschung zur Compileroptimierung war vielfältiger als Sie denken. Die Geschichte der LISP-Implementierungen ist zum Beispiel voller Erfolge bei der schnelleren Eingabe von Zahlen als bei Fortran (das nach wie vor der Standard-Herausforderer ist). Außerdem hat ein großer Teil der Compileroptimierung auf Zwischendarstellungen des Compilers abgezielt, was bedeutet, dass Unterschiede in der Semantik (wie Aliasing) für jede Programmiersprache einer bestimmten Klasse gelten.
Nirgendwo Mann
2
Die Idee wird oft wiederholt, aber es ist etwas unaufrichtig zu sagen, dass ein Programmiersprachen-Design keine Konsequenzen für die Effizienz hat. Einige Programmiersprachenfunktionen führen zwangsläufig zu Ineffizienzen, da sie die zur Kompilierungszeit verfügbaren Informationen einschränken.
Praxeolitic
@Praxeolitic - Das ist ganz richtig (weshalb ich mich freue, dass ich so etwas nicht gesagt habe).
TED
@TED ​​Ehrlich gesagt, als ich ein paar Monate später hierher zurückkam, habe ich keine Ahnung, warum ich diesen Kommentar zu Ihrer Antwort hinterlassen habe. Vielleicht wollte ich es woanders lassen? XP
Praxeolitic
22

Es gibt einen anderen Gegenstand, bei dem Fortran anders als C ist - und möglicherweise schneller. Fortran hat bessere Optimierungsregeln als C. In Fortran ist die Auswertungsreihenfolge eines Ausdrucks nicht definiert, sodass der Compiler sie optimieren kann. Wenn eine bestimmte Reihenfolge erzwungen werden soll, müssen Klammern verwendet werden. In C ist die Reihenfolge viel strenger, aber mit "-fast" -Optionen sind sie entspannter und "(...)" werden ebenfalls ignoriert. Ich denke, Fortran hat einen Weg, der schön in der Mitte liegt. (Nun, IEEE erschwert das Leben, da bestimmte Änderungen der Bewertungsreihenfolge erfordern, dass keine Überläufe auftreten, die entweder ignoriert werden müssen oder die Bewertung behindern).

Ein weiterer Bereich intelligenterer Regeln sind komplexe Zahlen. Nicht nur, dass es bis C 99 dauerte, bis C sie hatte, auch die Regeln, die sie regeln, sind in Fortran besser; Da die Fortran-Bibliothek von Gfortran teilweise in C geschrieben ist, aber die Fortran-Semantik implementiert, hat GCC die Option erhalten (die auch mit "normalen" C-Programmen verwendet werden kann):

-fcx-fortran-Regeln Komplexe Multiplikation und Division folgen den Fortran-Regeln. Die Bereichsreduzierung erfolgt im Rahmen einer komplexen Division, es wird jedoch nicht überprüft, ob das Ergebnis einer komplexen Multiplikation oder Division "NaN + I * NaN" ist, mit dem Versuch, die Situation in diesem Fall zu retten.

Die oben genannten Alias-Regeln sind ein weiterer Bonus und - zumindest im Prinzip - die Ganz-Array-Operationen, die, wenn sie vom Optimierer des Compilers richtig berücksichtigt werden, zu schnellerem Code führen können. Auf der anderen Seite ist es so, dass bestimmte Operationen mehr Zeit in Anspruch nehmen, z. B. wenn eine Zuweisung zu einem zuweisbaren Array vorgenommen wird, sind viele Überprüfungen erforderlich (Neuzuweisung? [Fortran 2003-Funktion], hat die Array-Schritte usw.), die das machen einfache Bedienung hinter den Kulissen komplexer - und damit langsamer, macht die Sprache aber leistungsfähiger. Andererseits erleichtern die Array-Operationen mit flexiblen Grenzen und Schritten das Schreiben von Code - und der Compiler optimiert Code normalerweise besser als ein Benutzer.

Insgesamt denke ich, dass sowohl C als auch Fortran ungefähr gleich schnell sind; Die Wahl sollte mehr sein, welche Sprache man mehr mag oder ob die Verwendung der Ganz-Array-Operationen von Fortran und ihre bessere Portabilität nützlicher sind - oder die bessere Schnittstelle zu System- und grafischen Benutzeroberflächenbibliotheken in C.


quelle
Was gibt es im Fall Nan + INan, um sinnvoll zu "retten"? Was Unendlichkeiten von NaN unterscheidet, ist, dass Unendlichkeiten signiert sind. Operationen mit nicht komplexen Unendlichkeiten, die ein durcheinandergebrachtes Vorzeichen ergeben würden, ergeben NaN, und ich sehe keinen Grund, warum komplexe Zahlen etwas anderes tun sollten. Wenn man (DBL_MAX, DBL_MAX) mit (2,2) multipliziert, das Ergebnis quadriert und dann das Ergebnis quadriert, was sollte das Vorzeichen des Ergebnisses sein, wenn kein Überlauf vorliegt? Was multipliziert man stattdessen mit (1.001, DBL_MAX)? Ich würde (NaN, NaN) als die richtige Antwort betrachten und jede Kombination von Unendlichkeit und NaN als unsinnig.
Supercat
14

Es gibt nichts an den Sprachen Fortran und C, was eine für bestimmte Zwecke schneller macht als die andere. Es gibt Dinge über bestimmte Compiler für jede dieser Sprachen, die einige für bestimmte Aufgaben günstiger machen als andere.

Viele Jahre lang gab es Fortran-Compiler, die Ihren numerischen Routinen schwarze Magie verleihen und viele wichtige Berechnungen wahnsinnig schnell durchführen konnten. Die zeitgenössischen C-Compiler konnten das nicht so gut. Infolgedessen wuchs in Fortran eine Reihe großer Codebibliotheken. Wenn Sie diese gut getesteten, ausgereiften, wunderbaren Bibliotheken verwenden möchten, brechen Sie den Fortran-Compiler aus.

Meine informellen Beobachtungen zeigen, dass Menschen heutzutage ihre umfangreichen Rechenaufgaben in einer alten Sprache codieren und, wenn es eine Weile dauert, Zeit in einem billigen Computercluster finden. Moores Gesetz macht uns alle zum Narren.

jfm3
quelle
11
Fast modifiziert dies. Das Problem ist , dass Fortran hat einige inhärente Vorteile. Sie sind sich jedoch ziemlich sicher, dass der Compier und nicht die Sprache das Wichtigste ist.
TED
14

Ich vergleiche die Geschwindigkeit von Fortran, C und C ++ mit dem klassischen Levine-Callahan-Dongarra-Benchmark von netlib. Die mehrsprachige Version mit OpenMP lautet http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors Das C ist hässlicher, da es mit der automatischen Übersetzung und dem Einfügen von Einschränkungen und Pragmas begann Compiler. C ++ ist nur C mit STL-Vorlagen, wo zutreffend. Meiner Ansicht nach ist die STL eine gemischte Tasche, um festzustellen, ob sie die Wartbarkeit verbessert.

Das In-Lining mit automatischer Funktion wird nur minimal ausgeführt, um festzustellen, inwieweit es die Optimierung verbessert, da die Beispiele auf der traditionellen Fortran-Praxis basieren, bei der nur wenig Vertrauen in das In-Lining besteht.

Dem C / C ++ - Compiler, der bei weitem am weitesten verbreitet ist, fehlt die automatische Vektorisierung, auf die sich diese Benchmarks stark stützen.

Zu dem Beitrag, der kurz davor stand: Es gibt einige Beispiele, bei denen in Fortran Klammern verwendet werden, um die schnellere oder genauere Reihenfolge der Bewertung festzulegen. Bekannte C-Compiler haben keine Optionen zum Beobachten der Klammern, ohne wichtigere Optimierungen zu deaktivieren.


quelle
Die hässliche Übersetzung ist erforderlich, um das Aliasing-Problem zu überwinden. Sie müssen dem Compiler Mock-Variablen geben, um ihm mitzuteilen, dass als Zeiger implementierte byref-Variablen registeroptimiert werden können.
David
12

Ich bin ein Hobby-Programmierer und ich bin "durchschnittlich" in beiden Sprachen. Ich finde es einfacher, schnellen Fortran-Code zu schreiben als C- (oder C ++) Code. Sowohl Fortran als auch C sind "historische" Sprachen (nach heutigem Standard), werden häufig verwendet und haben einen kostenlosen und kommerziellen Compiler gut unterstützt.

Ich weiß nicht, ob es eine historische Tatsache ist, aber Fortran scheint das Gefühl zu haben, parallel / verteilt / vektorisiert / was auch immer viele Kerne sein mögen. Und heute ist es so ziemlich die "Standardmetrik", wenn wir über Geschwindigkeit sprechen: "Skaliert sie?"

Für reines CPU-Crunching liebe ich Fortran. Für alles, was mit E / A zu tun hat, fällt es mir leichter, mit C zu arbeiten (in beiden Fällen ist es sowieso schwierig).

Für parallelen mathematikintensiven Code möchten Sie jetzt wahrscheinlich Ihre GPU verwenden. Sowohl C als auch Fortran verfügen über eine viel mehr oder weniger gut integrierte CUDA / OpenCL-Schnittstelle (und jetzt OpenACC).

Meine mäßig objektive Antwort lautet: Wenn Sie beide Sprachen gleich gut / schlecht kennen, denke ich, dass Fortran schneller ist, weil ich es einfacher finde, parallelen / verteilten Code in Fortran zu schreiben als in C. (sobald Sie verstanden haben, dass Sie "Freiform" fortran und schreiben können nicht nur strenger F77-Code)

Hier ist eine zweite Antwort für diejenigen, die bereit sind, mich abzustimmen, weil ihnen die erste Antwort nicht gefällt: Beide Sprachen verfügen über die Funktionen, die zum Schreiben von Hochleistungscode erforderlich sind. Es hängt also von dem Algorithmus ab, den Sie implementieren (CPU-intensiv? Io-intensiv? Speicherintensiv?), Der Hardware (Single-CPU? Multi-Core-Distribute-Supercomputer? GPGPU? FPGA?), Ihren Fähigkeiten und letztendlich dem Compiler selbst. Sowohl C als auch Fortran haben einen großartigen Compiler. (Ich bin ernsthaft erstaunt darüber, wie fortgeschritten Fortran-Compiler sind, aber auch C-Compiler).

PS: Ich bin froh, dass Sie Libs ausdrücklich ausgeschlossen haben, weil ich sehr viel Schlechtes über Fortran GUI-Libs zu sagen habe. :) :)

ker2x
quelle
11

Ich habe ein paar Jahre lang umfangreiche Mathematik mit FORTRAN und C gemacht. Aus eigener Erfahrung kann ich sagen, dass FORTRAN manchmal wirklich besser ist als C, aber nicht wegen seiner Geschwindigkeit (man kann C durch Verwendung eines geeigneten Codierungsstils so schnell wie FORTRAN machen), sondern wegen sehr gut optimierter Bibliotheken wie LAPACK und wegen große Parallelisierung. Meiner Meinung nach ist es sehr umständlich, mit FORTRAN zu arbeiten, und seine Vorteile sind nicht gut genug, um diesen Nachteil aufzuheben. Deshalb verwende ich jetzt C + GSL, um Berechnungen durchzuführen.

grzkv
quelle
10

Geschwindigkeitsunterschiede zwischen Fortran und C hängen eher von den Compileroptimierungen und der zugrunde liegenden Mathematikbibliothek ab, die vom jeweiligen Compiler verwendet wird. Es gibt nichts in Fortran, was es schneller machen würde als C.

Auf jeden Fall kann ein guter Programmierer Fortran in jeder Sprache schreiben.

Kluge
quelle
@ Scott Clawson: Du hast -1 und ich weiß nicht warum. + Ich würde Abhilfe schaffen. Zu berücksichtigen ist jedoch, dass Fortran schon länger existiert als viele unserer Eltern. Viel Zeit für die Optimierung der Compilerausgabe aufgewendet: D
user7116
Genau. Ich hatte gerade parallel eine sehr ähnliche Antwort gepostet.
Tall Jeff
Das Problem mit dem Zeigeralias in C wurde von anderen angesprochen, aber es gibt verschiedene Methoden, die der Programmierer bei modernen Compilern anwenden kann, um damit umzugehen, daher stimme ich immer noch zu.
Tall Jeff
1
@Kluge: "Es gibt nichts in Fortran, was es schneller machen würde als C". Zeiger-Aliasing, Rückgabe zusammengesetzter Werte in Registern, eingebaute numerische Konstrukte höherer Ebene ...
Jon Harrop
9

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

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

Zum Beispiel, wenn Sie eine strcpy-Routine geschrieben haben, die so aussieht:

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

Der Compiler muss unter der Annahme arbeiten, dass sich d und s möglicherweise überlappen. Daher kann keine Optimierung durchgeführt werden, die zu unterschiedlichen Ergebnissen führt, wenn sich die Arrays überlappen. Wie zu erwarten, schränkt dies die Art der Optimierungen, die durchgeführt werden können, erheblich ein.

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

Wenn wir jedoch auf das Problem C vs. Fortran zurückkommen, ist es denkbar, dass ein Fortran-Compiler einige Optimierungen durchführen kann, die für ein (einfach geschriebenes) C-Programm möglicherweise nicht möglich sind. Ich wäre also nicht allzu überrascht von der Behauptung. Ich gehe jedoch davon aus, dass der Leistungsunterschied nicht allzu groß sein wird. [~ 5-10%]

Pramod
quelle
9

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 sowieso keinen nennenswerten Geschwindigkeitsunterschied. Das habe ich 2015 in einem Fortran-Workshop im Hochleistungsrechenzentrum Stuttgard gelernt. Ich arbeite sowohl mit Fortran als auch mit C zusammen und teile diese Meinung.

Erläuterung:

C wurde zum Schreiben von Betriebssystemen entwickelt. Daher hat es mehr Freiheit als nötig, um Hochleistungscode 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 veraltete Programmiersprache. Der neueste Standard ist 2010, und regelmäßig werden 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).

Beispiel: Wir möchten einer Funktion eine große Struktur als Eingabeargument geben (fortran: subroutine). Innerhalb der Funktion wird das Argument nicht geändert.

C unterstützt sowohl Call by Reference als auch Call by Value, was eine praktische Funktion ist. In unserem Fall könnte der Programmierer versehentlich call by value verwenden. Dies verlangsamt die Dinge erheblich, da die Struktur zuerst in den Speicher kopiert werden muss.

Fortran arbeitet nur mit Call-by-Reference, wodurch der Programmierer gezwungen wird, die Struktur von Hand zu kopieren, wenn er wirklich eine Call-by-Value-Operation möchte. In unserem Fall ist fortran automatisch so schnell wie die C-Version mit Call-by-Reference.

Markus Dutschke
quelle
Können Sie eine native parallele Anwendung in C schreiben (dh ohne Bibliotheken aufzurufen?). Können Sie eine native parallele Anwendung in Fortran schreiben? Ja, auf verschiedene Arten. Ergo ist Fortran "schneller". Um fair zu sein, war die Unterstützung für parallele Do- und Co-Array-Funktionen von Fortran im Jahr 2010, als Sie Ihren Kommentar verfassten, wahrscheinlich nicht so weit verbreitet wie jetzt.
Mali Remorker
@MaliRemorker Er schrieb dies im Jahr 2016, nicht im Jahr 2010.
Kowalski
Der Aufwand für die Erstellung paralleler Prozesse ist meiner Meinung nach nicht der relevanteste Faktor für eine Programmiersprache, die als "schnell" bezeichnet wird. Relevanter sind praktische Überlegungen wie ein nicht performanter Code-Frieden. Es hilft also nichts, wenn Sie einmal Zeit sparen (beim Erstellen des parallelen Prozesses) und diese später auf mehreren Kernen verschwenden. Der Begriff "schnell" sollte auch nicht parallele Codes berücksichtigen. Aus diesem Grund kann ich kein Argument gegen meinen Standpunkt sehen. Vielleicht wurde Ihr Kommentar als unabhängige Antwort erwähnt?
Markus Dutschke
8

Im Allgemeinen ist FORTRAN langsamer als C. C kann Zeiger auf Hardwareebene verwenden, mit denen der Programmierer von Hand optimieren kann. FORTRAN hat (in den meisten Fällen) keinen Zugriff auf Hardware-Speicher-Adressierungs-Hacks. (VAX FORTRAN ist eine andere Geschichte.) Ich habe FORTRAN seit den 70er Jahren ein- und ausgeschaltet. (Ja wirklich.)

Ab den 90er Jahren hat sich FORTRAN jedoch dahingehend weiterentwickelt, dass es spezifische Sprachkonstrukte enthält, die zu inhärent parallelen Algorithmen optimiert werden können, die auf einem Multi-Core-Prozessor wirklich schreien können . Beispielsweise ermöglicht die automatische Vektorisierung mehreren Prozessoren, jedes Element in einem Datenvektor gleichzeitig zu verarbeiten. 16 Prozessoren - 16 Elementvektor - 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. Anschließend müssen Sie eine Reihe von API-Aufrufen verwenden, um sicherzustellen, dass die Parallelität ordnungsgemäß erfolgt.

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

Sie können ein wenig über High Performance Fortran lesen , aber Sie finden viele tote Links. Lesen Sie besser über Paralleles Programmieren (wie OpenMP.org ) und wie FORTRAN dies unterstützt.

S.Lott
quelle
6
@ S.Lott: Ich konnte mir nicht vorstellen, wie schrecklich C-Code aussehen müsste, um so gut wie einfach geschriebenes Fortran für die meisten Codes, die wir hier haben, zu funktionieren ... und ich bin ein C-Programmierer. Mit einfacherem Code in Fortran erzielen Sie eine bessere Leistung. Nicht, dass Sie oder ich kein Gegenbeispiel gefunden hätten. : D
user7116
2
@ Greg Rogers: Sie müssen sich mit Leuten von Fortran Vectorization befassen, nicht mit mir. Ich berichte nur, was ich gelesen habe. polyhedron.com/absoftlinux
S.Lott
2
-1 // "Im Allgemeinen ist FORTRAN langsamer als C. Dies gilt für fast alles." Warum? // Ein Argument, das auf der einfachen Verwendung von Multithreading in Fortran vs C basiert, sagt nichts über die Leistung aus.
steabert
4
@ S.Lott: "Multithreading gibt es nur für die Leistung". Äh, nein.
Jon Harrop
4
@ S.Lott: "Cs Verwendung von Zeigern fast auf Hardware-Ebene ermöglicht es C, schneller als Fortran zu sein". Ähm, nein
Jon Harrop
5

Der schnellere Code hängt nicht wirklich von der Sprache ab, sondern vom Compiler. Sie können also den ms-vb "Compiler" sehen, der aufgeblähten, langsameren und redundanten Objektcode generiert, der in einer ".exe" zusammengebunden ist, aber powerBasic generiert zu viel besserer Code. Objektcode, der von einem C- und C ++ - Compiler erstellt wurde, wird in einigen Phasen (mindestens 2) generiert. Die meisten Fortran-Compiler verfügen jedoch über mindestens 5 Phasen, einschließlich Optimierungen auf hoher Ebene, sodass Fortran vom Design her immer die Möglichkeit hat, hochoptimierten Code zu generieren. Am Ende ist der Compiler also nicht die Sprache, nach der Sie fragen sollten. Der beste Compiler, den ich kenne, ist der Intel Fortran Compiler, da Sie ihn unter LINUX und Windows herunterladen und VS als IDE verwenden können, wenn Sie nach einem suchen Günstiger Tigh-Compiler, den Sie jederzeit auf OpenWatcom weiterleiten können.

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

JPerez45
quelle
3

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

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

Zeus
quelle
1
Haben Sie Benchmarks, die zeigen, dass Fortran C für E / A schlägt?
Jeff
3

Mit modernen Standards und Compiler, nein!

Einige der Leute hier haben vorgeschlagen, dass FORTRAN schneller ist, weil der Compiler sich nicht um Aliasing kümmern muss (und daher während der Optimierung mehr Annahmen treffen kann). Dies wurde jedoch in C seit dem C99-Standard (glaube ich) unter Einbeziehung des Restrict-Schlüsselworts behandelt. Dies sagt dem Compiler im Grunde, dass der Zeiger innerhalb eines bestimmten Bereichs nicht mit einem Alias ​​versehen 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 denke, dass neuere Versionen von FORTRAN die Verwendung von "richtigen" Zeigern ermöglichen.

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

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

BEARBEITEN:

Eine faire Kritik daran scheint zu sein, dass das Benchmarking voreingenommen sein könnte. Hier ist eine andere Quelle (relativ zu C), die das Ergebnis in mehr Kontext bringt:

http://julialang.org/benchmarks/

Sie können sehen, dass C Fortran in den meisten Fällen in der Regel übertrifft (siehe auch hier die unten aufgeführten Kritikpunkte). Wie andere gesagt haben, ist Benchmarking eine ungenaue Wissenschaft, die leicht geladen werden kann, um eine Sprache gegenüber anderen zu bevorzugen. Es wird jedoch in einen Zusammenhang gebracht, wie Fortran und C eine ähnliche Leistung erbringen.

cdcdcd
quelle
3
Man wäre ein Dummkopf, wenn man irgendetwas über Fortran von einem Post glauben würde, der annimmt, dass es immer noch FORTRAN ist. Das hat sich vor mehr als 25 Jahren geändert. Diese Tests können keine Sprachen vergleichen, da sie Compiler verschiedener Hersteller verwenden, obwohl sowohl Intel als auch GCC Compiler für C und Fortran haben. Daher sind diese Vergleiche wertlos.
Vladimir F
2

Fortran kann Arrays, insbesondere mehrdimensionale Arrays, sehr bequem verarbeiten. Das Schneiden von Elementen eines mehrdimensionalen Arrays in Fortran kann viel einfacher sein als das in C / C ++. C ++ hat jetzt Bibliotheken, die die Arbeit erledigen können, wie Boost oder Eigen, aber sie sind immerhin 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 wissenschaftlicher Rechner für Geophysik habe ich den größten Teil des Rechnens in Fortran durchgeführt (ich meine das moderne Fortran,> = F90).

Kai
quelle
1
Und ob Fortran schneller ist, hängt auch davon ab, welchen Compiler Sie verwenden (es ist wichtig!), Für Berechnungsjobs, ob Sie eine geeignete Parallelisierung auf den Code anwenden und wie Ihr Code geschrieben wird.
Kai
1

Dies ist mehr als etwas subjektiv, da es sich vor allem auf die Qualität von Compilern und dergleichen auswirkt. Um Ihre Frage unter dem Gesichtspunkt der Sprache / des Compilers direkter zu beantworten, gibt es jedoch nichts an Fortran über C, was es von Natur aus schneller oder besser als C machen würde. Wenn Sie schwere mathematische Operationen ausführen, kommt es auf das an Qualität des Compilers, die Fähigkeiten des Programmierers in jeder Sprache und die intrinsischen mathematischen Unterstützungsbibliotheken, die diese Operationen unterstützen, um letztendlich zu bestimmen, welche für eine bestimmte Implementierung schneller sein wird.

BEARBEITEN: Andere Leute wie @Nils haben den guten Punkt über den Unterschied in der Verwendung von Zeigern in C und die Möglichkeit des Aliasing angesprochen, das die naivsten Implementierungen in C möglicherweise verlangsamt. Es gibt jedoch Möglichkeiten, damit in C99 umzugehen über Compiler-Optimierungsflags und / oder wie das C tatsächlich geschrieben wird. Dies wird in der Antwort von @Nils und den nachfolgenden Kommentaren, die auf seine Antwort folgen, gut behandelt.

Großer Jeff
quelle
Es klingt wie ein Benchmark-Test eines Algorithmus. Was braucht weniger Zeit, FORTRAN oder C? Klingt für mich nicht subjektiv. Vielleicht fehlt mir etwas.
S.Lott
1
Nicht zustimmen. Sie vergleichen die Compiler, nicht die Sprachen. Ich denke, die ursprüngliche Frage ist, ob es irgendetwas an der SPRACHE gibt, das sie von Natur aus besser macht. Andere Antworten hier befassen sich mit einigen der subtilen fragwürdigen Unterschiede, aber ich denke, wir sind uns am meisten einig, dass sie im Lärm liegen.
Tall Jeff
Dies ist keine O (n) -Analyse von Algorithmen. Es ist Leistung. Sehen Sie nicht, wie Leistung ein hypothetisches implementierungsunabhängiges Konzept sein kann. Ich schätze, ich vermisse etwas.
S.Lott
1
-1: "Es gibt nichts an Fortran über C, was es von Natur aus schneller oder besser machen würde als C". Äh, nein.
Jon Harrop
0

Die meisten Beiträge enthalten bereits überzeugende Argumente, daher werde ich die sprichwörtlichen 2 Cent nur einem anderen Aspekt hinzufügen.

Am Ende schneller oder langsamer in Bezug auf die Rechenleistung zu sein, kann seine Bedeutung haben, aber wenn es fünfmal länger dauert, etwas in Fortran zu entwickeln, weil:

  • Es fehlt eine gute Bibliothek für Aufgaben, die sich von der reinen Zahlenverarbeitung unterscheiden
  • Es fehlt ein anständiges Werkzeug für Dokumentation und Unit-Tests
  • Es ist eine Sprache mit sehr geringer Ausdruckskraft, die die Anzahl der Codezeilen in die Höhe schnellen lässt.
  • Es hat einen sehr schlechten Umgang mit Saiten
  • Es gibt eine wahnsinnige Menge an Problemen zwischen verschiedenen Compilern und Architekturen, die Sie verrückt machen.
  • Es hat eine sehr schlechte E / A-Strategie (READ / WRITE von sequentiellen Dateien. Ja, es gibt Dateien mit wahlfreiem Zugriff, aber haben Sie jemals gesehen, dass sie verwendet werden?)
  • Es fördert keine guten Entwicklungspraktiken und keine Modularisierung.
  • effektives Fehlen eines vollständig standardmäßigen, vollständig kompatiblen OpenSource-Compilers (sowohl gfortran als auch g95 unterstützen nicht alles)
  • sehr schlechte Interoperabilität mit C (Mangeln: ein Unterstrich, zwei Unterstriche, kein Unterstrich, im Allgemeinen ein Unterstrich, aber zwei, wenn es einen anderen Unterstrich gibt. Lassen Sie sich einfach nicht in GEMEINSAME Blöcke vertiefen ...)

Dann ist das Problem irrelevant. Wenn etwas langsam ist, können Sie es meistens nicht über ein bestimmtes Limit hinaus verbessern. Wenn Sie etwas schneller möchten, ändern Sie den Algorithmus. Am Ende ist Computerzeit billig. Menschliche Zeit ist nicht. Schätzen Sie die Wahl, die die menschliche Zeit verkürzt. Wenn es die Computerzeit verlängert, ist es trotzdem kostengünstig.

Stefano Borini
quelle
3
herabgestimmt, denn obwohl Sie interessante Punkte ansprechen, die zu einer Diskussion der Vorteile / Nachteile von fortrans im Vergleich zu anderen Sprachen beitragen (denen ich nicht ganz zustimme), ist dies keine wirkliche Antwort auf die Frage ...
steabert
@ Steabert: In der Tat sagte ichI will just add the proverbial 2 cents to a different aspect
Stefano Borini
1
+1 von mir für eine nicht pingelige Antwort. Wie Sie sagten, könnte Fortran bei einigen seltenen Aufgaben schneller sein (habe noch keine persönlich gesehen). Aber die Zeit, die Sie für die Aufrechterhaltung einer nicht wartbaren Sprache verschwenden, ruiniert jeden möglichen Vorteil.
André Bergner
10
-1. Sie scheinen in Bezug auf F77 an Fortran zu denken. Das wurde durch F90, F95, F03 und F08 ersetzt.
Kyle Kanos
4
Abgestimmt, weil es sich ausschließlich um eine Seite eines Kompromisses handelt. Die Entwicklungsgeschwindigkeit mag für die meisten allgemeinen Programmierungen von Bedeutung sein, dies macht sie jedoch nicht zum einzig gültigen Kompromiss. Fortran-Programmierer sind häufig Wissenschaftler / Ingenieure, die die Einfachheit der Sprache (FORmula TRANslation ist extrem einfach zu erlernen und zu beherrschen. C / C ++ nicht ), die hervorragenden Bibliotheken (häufig aus anderen Sprachen verwendet) und die Geschwindigkeit (z. B. Wettersimulationen) schätzen Das dauert Tage in Fortran, aber Monate, wenn es vollständig in anderen Sprachen geschrieben ist.
BraveNewCurrency
-3

Fortran legt traditionell keine Optionen wie -fp: strict fest (was erforderlich ist, um einige der Funktionen in USE IEEE_arithmetic, einem Teil des Standards f2003, zu aktivieren). Intel C ++ setzt standardmäßig auch nicht -fp: strict, dies ist jedoch beispielsweise für die ERRNO-Verarbeitung erforderlich, und andere C ++ - Compiler machen es nicht bequem, ERRNO zu deaktivieren oder Optimierungen wie die Simd-Reduzierung zu erzielen. Bei gcc und g ++ musste ich Makefile einrichten, um die gefährliche Kombination -O3 -ffast-math -fopenmp -march = native zu vermeiden. Abgesehen von diesen Problemen wird diese Frage nach der relativen Leistung wählerischer und hängt von den lokalen Regeln für die Auswahl von Compilern und Optionen ab.

tim18
quelle
Neueste gcc-Updates haben das Problem mit der Kombination von Openmp und Fast-Math behoben.
Tim18
Bei dieser Antwort geht es wirklich darum, dass Benutzer die Standardflags für ihre Compiler nicht verstehen, nicht die Sprachen selbst.
Jeff