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.

0voto

Tall Jeff Punkte 9605

Dies ist mehr als subjektiv, da es mehr als alles andere mit der Qualität von Compilern und dergleichen zu tun hat. Um Ihre Frage jedoch direkter zu beantworten: Vom Standpunkt der Sprache/des Compilers aus betrachtet, gibt es nichts, was Fortran schneller oder besser als C macht. Wenn Sie schwere mathematische Operationen durchführen, hängt es von der Qualität des Compilers, den Fähigkeiten des Programmierers in jeder Sprache und den Bibliotheken zur Unterstützung der Mathematik ab, die diese Operationen unterstützen, um letztendlich zu bestimmen, welche Implementierung schneller ist.

EDIT: Andere Leute wie @Nils haben den guten Punkt über den Unterschied in der Verwendung von Zeigern in C und die Möglichkeit für Aliasing, das vielleicht die naivsten Implementierungen in C langsamer macht, angesprochen. Es gibt jedoch Möglichkeiten, damit in C99 umzugehen, über Compiler-Optimierungsflags und/oder in der Art und Weise, wie C tatsächlich geschrieben wird. Dies wird in @Nils Antwort und den nachfolgenden Kommentaren zu seiner Antwort gut behandelt.

-1voto

Stefano Borini Punkte 132313

Die meisten Beiträge enthalten bereits überzeugende Argumente, so dass ich nur die sprichwörtlichen 2 Cents zu einem anderen Aspekt hinzufügen möchte.

Die Tatsache, dass Fortran schneller oder langsamer in Bezug auf die Rechenleistung ist, kann durchaus von Bedeutung sein, aber wenn es 5 Mal mehr Zeit kostet, etwas in Fortran zu entwickeln, weil:

  • es fehlt eine gute Bibliothek für Aufgaben, die sich von reinen Zahlenberechnungen 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 treibt.
  • die Handhabung von Saiten ist sehr schlecht
  • es gibt eine unüberschaubare Anzahl von Problemen zwischen verschiedenen Compilern und Architekturen, die Sie in den Wahnsinn treiben.
  • es hat eine sehr schlechte IO-Strategie (READ/WRITE von sequentiellen Dateien. Ja, es gibt Dateien mit wahlfreiem Zugriff, aber haben Sie jemals gesehen, dass sie benutzt werden?)
  • er fördert keine guten Entwicklungspraktiken, keine Modularisierung.
  • effektives Fehlen eines vollständig standardisierten, vollständig kompatiblen Open-Source-Compilers (sowohl gfortran als auch g95 unterstützen nicht alles)
  • sehr schlechte Interoperabilität mit C (Mangling: ein Unterstrich, zwei Unterstriche, kein Unterstrich, im Allgemeinen ein Unterstrich, aber zwei, wenn es einen weiteren Unterstrich gibt. und lassen Sie uns einfach nicht in COMMON-Blöcke eintauchen...)

Dann ist das Thema irrelevant. Wenn etwas langsam ist, kann man es in den meisten Fällen nicht über ein bestimmtes Maß hinaus verbessern. Wenn Sie etwas schneller haben wollen, ändern Sie den Algorithmus. Schließlich ist Computerzeit billig. Menschliche Zeit ist es nicht. Schätzen Sie die Entscheidung, die die menschliche Zeit reduziert. Wenn sie die Computerzeit erhöht, ist sie ohnehin kosteneffektiv.

-3voto

tim18 Punkte 530

Fortran setzt traditionell keine Optionen wie -fp:strict (die ifort benötigt, um einige der Funktionen in USE IEEE_arithmetic, einem Teil des f2003-Standards, zu aktivieren). Intel C++ setzt auch nicht standardmäßig -fp:strict, aber das ist zum Beispiel für die ERRNO-Behandlung erforderlich, und andere C++-Compiler machen es nicht einfach, ERRNO auszuschalten oder Optimierungen wie die simd-Reduktion zu erreichen. gcc und g++ haben mich gezwungen, Makefile einzurichten, um die Verwendung der gefährlichen Kombination -O3 -ffast-math -fopenmp -march=native zu vermeiden. Abgesehen von diesen Punkten wird die Frage nach der relativen Leistung immer pingeliger und hängt von den lokalen Regeln für die Auswahl von Compilern und Optionen ab.

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