Fortran vs. C++, hat Fortran heutzutage noch einen Vorteil in der numerischen Analyse? [closed]
Lesezeit: 7 Minuten
Benutzer0002128
Hat Fortran angesichts der rasanten Entwicklung von C++-Compilern, insbesondere der Intel-Compiler, und der Fähigkeit, SIMD-Funktionen direkt in Ihren C/C++-Codes anzuwenden, noch einen wirklichen Vorteil in der Welt der numerischen Berechnungen?
Ich komme aus der angewandten Mathematik, mein Job beinhaltet viel numerische Analyse, Berechnungen, Optimierungen und dergleichen mit einem genau definierten Leistungsanspruch.
Ich weiß kaum etwas über Fortran, ich habe etwas Erfahrung mit C/CUDA/Matlab (wenn man letzteres überhaupt als Computersprache betrachtet), und meine tägliche Aufgabe ist die Analyse sehr großer Daten (z. B. 10 GB große Matrix). und es scheint, dass das Programm mindestens 2/3 seiner Zeit für den Speicherzugriff aufwendet (deshalb sende ich einen Teil seiner Arbeit an die GPU). Glauben Sie, dass es die Auswirkungen für mich wert sein könnte, zumindest die Fortran-Routine auszuprobieren? einen leistungskritischen Teil meines Codes, um die Leistung meines Programms zu verbessern?
Da die Komplexität und die damit verbundenen Dinge erledigt werden müssen, werde ich diese Routine nur durchführen, wenn es nur einen signifikanten Leistungsvorteil gibt, danke im Voraus.
Fortran profitiert davon, dass es kein Aliasing hat, sodass es viel aggressiver optimieren kann. In C99 können Sie etwas Ähnliches erreichen restrict, obwohl das nicht Teil von C++ ist. Andererseits erlaubt Ihnen C++ die Verwendung von Ausdrucksvorlagen und Inlining. Die Antwort ist also, dass “es darauf ankommt, was Sie tun”, nehme ich an.
– Kerrek SB
25. Oktober 2012 um 23:21 Uhr
Einige ähnliche Fragen: Ist Fortran schneller als C?, Welche Vorteile hat modernes Fortran gegenüber modernem C++?, Wie viel besser sind Fortran-Compiler wirklich?bin mir aber nicht sicher, ob es sich um ein exaktes Duplikat handelt.
– Jess Gut
25. Oktober 2012 um 23:24 Uhr
Was meinst du mit “Programm verbringt mindestens 2/3 seiner Zeit mit Speicherzugriffen?” Bedeutet das, dass 2/3 der Zeit für das Laden einer 10-GB-Matrix aufgewendet wird? Oder meinst du, deine Cache-Miss-Rate ist zu hoch? Oder Ihr Programm hat eine begrenzte Speicherbandbreite?
– Änd
26. Oktober 2012 um 0:49 Uhr
Da das Programm für jede Iteration viele Besuche bei etwa 10 GB großen Matrizen abstatten muss, kann es sich also um eine begrenzte Speicherbandbreite oder einen hohen Cache-Fehler oder beides handeln (ein Teil der Arbeit beinhaltet den wahlfreien Zugriff auf den Speicher, und ja, ich weiß wie man es beschleunigt, indem man die Daten neu ordnet, aber dann wird es an anderer Stelle einen enormen Leistungseinbruch geben, um mich einfach davon abzuhalten, das überhaupt zu versuchen), was reine Berechnungen betrifft, übernimmt simd intrinsics den größten Teil der Arbeit, während gpu auch ein wenig hilft , also weiß ich einfach nicht, ob Fortran etwas besser kann.
– Benutzer0002128
26. Oktober 2012 um 1:41 Uhr
Versuchen Sie, mehr davon an die GPU zu senden.
– Demi
26. Februar 2014 um 0:13 Uhr
Dietrich Ep
Fortran hat im Vergleich zu C++ eine strenge Aliasing-Semantik und wurde jahrzehntelang aggressiv auf numerische Leistung abgestimmt. Algorithmen, die die CPU verwenden, um mit Datenarrays zu arbeiten, haben oft das Potenzial, von einer Fortran-Implementierung zu profitieren.
Das Shootout der Programmiersprachen sollte nicht zu ernst genommen werden, aber von den 15 Benchmarks rangiert Fortran auf Platz 1 für Geschwindigkeit vier von ihnen (für Intel Q6600 ein Kern), mehr als jede andere einzelne Sprache. Sie können sehen, dass die Benchmarks, bei denen Fortran glänzt, die stark numerischen sind:
k-Nukleotid 500 % langsamer (dieser Benchmark konzentriert sich stark auf ausgefeiltere Datenstrukturen und String-Verarbeitung, was nicht die Stärke von Fortran ist)
Sie können auch eine Zusammenfassungsseite sehen “wie oft langsamer“, was zeigt, dass von allen Implementierungen der Fortran-Code im Durchschnitt am nächsten an der schnellsten Implementierung für jeden Benchmark liegt – obwohl die Quantilbalken viel größer sind als bei C++, was darauf hinweist, dass Fortran für einige Aufgaben ungeeignet ist, für die C++ gut ist, aber das solltest du schon wissen.
Die Fragen, die Sie sich stellen müssen, lauten also:
Ist die Geschwindigkeit dieser Funktion so kritisch, dass sich eine Neuimplementierung in Fortran lohnt?
Ist Leistung so wichtig, dass sich meine Investition in das Erlernen von Fortran auszahlt?
Ist es möglich, eine Bibliothek wie ATLAS zu verwenden, anstatt den Code selbst zu schreiben?
Die Beantwortung dieser Fragen würde detaillierte Kenntnisse Ihrer Codebasis und Ihres Geschäftsmodells erfordern, daher kann ich diese nicht beantworten. Aber ja, Fortran-Implementierungen sind oft schneller als C++-Implementierungen.
Ein weiterer Faktor bei Ihrer Entscheidung ist die Menge an Beispielcode und die Menge an verfügbaren Referenzimplementierungen. Die starke Geschichte von Fortran bedeutet, dass es eine Fülle von Zahlencodes zum Herunterladen und sogar mit einem Besuch in der Bibliothek gibt. Wie immer müssen Sie es durchsuchen, um die guten Sachen zu finden.
Der Vergleich dieser beiden Sprachen basierend auf der Schießerei ist wirklich fehlerhaft. Zumindest sollte man denselben Anbieter verwenden.
– Wladimir F. Героям слава
26. Oktober 2012 um 6:12 Uhr
@VladimirF: Ja, es ist fehlerhaft. Ich glaube nicht, dass es eine Möglichkeit gibt, Sprachen zu vergleichen, die nicht fehlerhaft ist.
– Dietrich Ep
26. Oktober 2012 um 15:02 Uhr
Wie gesagt, vergleiche nicht Äpfel und Birnen, sondern g++ mit gfortran und ifort mit Intels c++.
– Wladimir F. Героям слава
5. Juni 2014 um 8:12 Uhr
Übrigens, das wird wahrscheinlich den Geschwindigkeitsvorteil von Fortran gegenüber C++ verringern und mich trotzdem nicht davon abhalten, Fortran zu bevorzugen, weil die wahren Vorteile woanders liegen. Die Einfachheit der Sprache und die nette Syntax von Array-Operationen.
– Wladimir F. Героям слава
5. Juni 2014 um 9:02 Uhr
Viele Leute sagen, dass C++ langsamer als Fortran ist, speziell für die numerische Programmierung. Aber mit gfortran und g++ habe ich es immer geschafft, meinen C++-Code so zu optimieren, dass er mindestens so schnell ist wie mein Fortran-Code. Ich fand heraus, dass der Hauptgrund dafür, dass c++ manchmal langsamer ist, die Annahme des Compilers über Zeiger-Aliasing ist, die einfach durch das Schlüsselwort „restrict“ geheilt werden kann.
– melmi
5. Oktober 2014 um 5:36 Uhr
Die vollständige und richtige Antwort auf Ihre Frage lautet: “Ja, Fortran hat einige Vorteile”.
C++ hat auch einige andere Vorteile. Also Python, R usw. usw. Sie sind verschiedene Sprachen. Es ist einfacher und schneller, einige Dinge in einer Sprache zu erledigen, andere in anderen. Alle sind in ihren Gemeinden weit verbreitet, und das aus sehr guten Gründen.
Alles andere ist in Ermangelung spezifischerer Fragen nur Lärm und Sprachkriegsköder, weshalb ich dafür gestimmt habe, die Frage zu schließen, und hoffe, dass andere dies auch tun.
Fortran ist natürlich für die numerische Programmierung geeignet. Sie neigen dazu, in solchen Programmen eine große Anzahl von Zahlen zu haben, typischerweise angeordnete Arrays. Arrays sind erstklassige Bürger in Fortran und es ist oft ziemlich einfach, numerische Kernel von Matlab in Fortran zu übersetzen. Bezüglich potenzieller Leistungsvorteile siehe die anderen Antworten, die dies recht gut abdecken. Die Grundlinie ist wahrscheinlich, dass Sie mit den meisten heute kompilierten Sprachen hocheffiziente numerische Anwendungen erstellen können, aber Sie könnten einige Schleifen durchlaufen, um dorthin zu gelangen. Fortran wurde sorgfältig entwickelt, damit der Compiler aufgrund der Sprachfunktionen die meisten Stellen für Optimierungen erkennen kann. Natürlich können Sie auch beliebigen langsamen Code mit jeder kompilierten Sprache schreiben, einschließlich Fortran. In jedem Fall sollten Sie die geeigneten Werkzeuge auswählen. Fortran eignet sich für numerische Anwendungen, C für systembezogene Entwicklung. Abschließend sei gesagt, Fortran-Grundlagen zu lernen ist nicht schwer, und es lohnt sich immer, einen Blick in andere Sprachen zu werfen. Dies öffnet eine andere Sicht auf Probleme, die Sie lösen möchten.
saolof
Erwähnenswert ist auch, dass Fortran viel einfacher zu beherrschen ist als C++. Tatsächlich hat Fortran eine kürzere Sprachspezifikation als einfaches C und seine Syntax ist wohl einfacher. Sie können es sehr schnell abholen.
Das heißt, wenn Sie nur daran interessiert sind, C++ oder Fortran zu lernen, um ein einzelnes spezifisches Problem zu lösen, das Sie im Moment haben (z. B. um die Engpässe in etwas zu beschleunigen, das Sie in einer Prototyping-Sprache geschrieben haben), kann Fortran Ihnen eine bessere Rendite bringen .
Fortran-Code ist im Allgemeinen besser für Matrix- und Vektoroperationen geeignet. Sie können aber auch mit c/c++-Code eine ähnliche Leistung erzielen, indem Sie Hinweise/Vorschläge an den Compiler weitergeben, um Vektoranweisungen ähnlicher Qualität zu erstellen. Eine Option, die mir einen guten Schub gab, bestand darin, kein Speicher-Aliasing zwischen Eingabevariablen anzunehmen, die Array-Objekte sind. Auf diese Weise kann der Compiler aggressives Entrollen und Pipelining der inneren Schleife für ILP durchführen, wo er Ladevorgänge überlappen und Operationen über Schleifeniterationen mit richtigen Vorabrufen speichern kann.
14108400cookie-checkFortran vs. C++, hat Fortran heutzutage noch einen Vorteil in der numerischen Analyse? [closed]yes
Fortran profitiert davon, dass es kein Aliasing hat, sodass es viel aggressiver optimieren kann. In C99 können Sie etwas Ähnliches erreichen
restrict
, obwohl das nicht Teil von C++ ist. Andererseits erlaubt Ihnen C++ die Verwendung von Ausdrucksvorlagen und Inlining. Die Antwort ist also, dass “es darauf ankommt, was Sie tun”, nehme ich an.– Kerrek SB
25. Oktober 2012 um 23:21 Uhr
Einige ähnliche Fragen: Ist Fortran schneller als C?, Welche Vorteile hat modernes Fortran gegenüber modernem C++?, Wie viel besser sind Fortran-Compiler wirklich?bin mir aber nicht sicher, ob es sich um ein exaktes Duplikat handelt.
– Jess Gut
25. Oktober 2012 um 23:24 Uhr
Was meinst du mit “Programm verbringt mindestens 2/3 seiner Zeit mit Speicherzugriffen?” Bedeutet das, dass 2/3 der Zeit für das Laden einer 10-GB-Matrix aufgewendet wird? Oder meinst du, deine Cache-Miss-Rate ist zu hoch? Oder Ihr Programm hat eine begrenzte Speicherbandbreite?
– Änd
26. Oktober 2012 um 0:49 Uhr
Da das Programm für jede Iteration viele Besuche bei etwa 10 GB großen Matrizen abstatten muss, kann es sich also um eine begrenzte Speicherbandbreite oder einen hohen Cache-Fehler oder beides handeln (ein Teil der Arbeit beinhaltet den wahlfreien Zugriff auf den Speicher, und ja, ich weiß wie man es beschleunigt, indem man die Daten neu ordnet, aber dann wird es an anderer Stelle einen enormen Leistungseinbruch geben, um mich einfach davon abzuhalten, das überhaupt zu versuchen), was reine Berechnungen betrifft, übernimmt simd intrinsics den größten Teil der Arbeit, während gpu auch ein wenig hilft , also weiß ich einfach nicht, ob Fortran etwas besser kann.
– Benutzer0002128
26. Oktober 2012 um 1:41 Uhr
Versuchen Sie, mehr davon an die GPU zu senden.
– Demi
26. Februar 2014 um 0:13 Uhr