Wie kann eine große, auf Fortran basierende Codebasis für die Zahlenverarbeitung modernisiert werden?

21

Ein akademischer Freund bat mich um Rat (ich bin ein C # Business-Anwendungsentwickler).

Er hat eine alte Codebasis, die er in Fortran im Bereich der medizinischen Bildgebung geschrieben hat. Es macht eine große Menge an Zahlen mit Vektoren. Er verwendet einen Cluster (30-Bit-Kerne) und ist nun zu einer einzelnen Workstation mit 500-Bit-GPUS übergegangen.

Wohin als nächstes mit der Codebasis?

  • Andere Leute können es über den nächsten 10-Jahres-Zyklus beibehalten
  • Optimieren Sie die Software schneller
  • Kann auf verschiedenen Infrastrukturen ausgeführt werden, ohne dass eine Neukompilierung erforderlich ist

Nach einigen Recherchen von mir (das ist ein super interessanter Bereich) sind einige Optionen:

  • Verwenden Sie Python und CUDA von Nvidia
  • Schreiben Sie in einer funktionalen Sprache um. Zum Beispiel F # oder Haskell
  • Gehen Sie Cloud-basiert und verwenden Sie so etwas wie Hadoop und Java
  • Lerne C

Welche Erfahrungen haben Sie damit gemacht? Worauf sollte mein Freund achten, um seine Codebasis zu modernisieren?

UPDATE: Danke @Mark und allen, die geantwortet haben. Der Grund, warum mein Freund diese Frage stellt, ist, dass es ein perfekter Zeitpunkt im Projektlebenszyklus ist, um eine Überprüfung durchzuführen. Es braucht Zeit, um wissenschaftliche Mitarbeiter in Fortran auf den neuesten Stand zu bringen.

Ich mochte den Vorschlag, die reine Zahl in Fortran beizubehalten, sie aber in etwas Neueres zu verpacken. Vielleicht scheint Python als universelle Programmiersprache, die relativ einfach zu erlernen ist, eine Hochburg im akademischen Bereich zu werden.

Siehe Medical Imaging und einen Kollegen, der einen Fortran-Wrapper für CUDA geschrieben hat. Kann ich meine Fortran 90-Wrapper legal in der CUFFT-Bibliothek von Nvidias (aus dem CUDA-SDK) veröffentlichen? .

Dave Mateer
quelle
Ich würde OpenCL zur Liste hinzufügen.
Jerry Coffin
3
Hallo Dave, es gibt eine bestimmte Art von "Welche Sprache soll ich als nächstes lernen?" Fragen, die wir hier nicht zulassen, daher habe ich kleinere Überarbeitungen vorgenommen, um sicherzustellen, dass die Leute diese Frage nicht damit verwechseln. Aber können Sie Ihre Frage erweitern, um zu erklären, warum die Auswahlmöglichkeiten, die Sie bisher entdeckt haben, nicht gut zu Ihnen passen, sodass sie als Anhaltspunkt für eine bessere Anpassung dienen können?
Was meinen Sie konkret mit "Kann ohne Neukompilierung auf verschiedenen Infrastrukturen ausgeführt werden"?
Turm
Hallo @Idigas - bin mir der Besonderheiten nicht ganz sicher. Aber im Grunde ging die Geschichte dahin, dass es zum Albtraum wurde, wenn man die Codebasis auf andere Cluster / Maschinen übertrug, um alle korrekten Versionen der Bibliotheken zusammen zu kompilieren. Ich glaube, die Codebasis wurde von F77 auf F90 ​​oder was auch immer übernommen. Grundsätzlich versuche ich, ihm zu helfen, mit den richtigen Leuten zu sprechen, um eine kluge Entscheidung zu treffen, ob Architekturen / Sprachen geändert werden sollen. Ich komme aus einem Umfeld, in dem Kunden einen Tag mit zusätzlicher Codierungszeit nicht mögen. Alles, was ich tun kann, um den bestmöglichen Code zu schreiben, ist ideal :-)
Dave Mateer,
@ DaveMateer - Siehe meine Antwort (passte hier nicht in dieses Feld). Ich gehe jetzt schlafen, daher könnten zukünftige Antworten etwas langsam sein :)
Rook

Antworten:

24

Die Anforderungen, die Sie gestellt haben, haben Fortran für Probleme wie dieses an die Spitze der Liste gesetzt:

a) Zahlenkalkulation
b) Paralellierbar
c) Es war und ist die De-facto- Sprache, die außerhalb des CS-Studiums unterrichtet wurde (für Ingenieure, die keine professionellen Programmierer sind).
d) hat einen unglaublichen (!) Branchen-Rückhalt, in Bezug auf die Anzahl der Industrie-Compiler, wobei keiner der Anbieter die geringsten Anzeichen dafür aufweist, diesen Zweig aufzugeben. Ein Vertreter von Intel hat vor kurzem bekannt gegeben, dass die Verkäufe seiner Fortran-Produkte in ihren Entwicklungstools höher sind als in allen anderen.

Es ist auch eine Sprache, die unglaublich einfach zu erlernen ist. Ich bin nicht einverstanden, dass es Zeit braucht, um wissenschaftliche Mitarbeiter auf den neuesten Stand zu bringen. Mein erstes Lehrbuch hatte nicht mehr als 30 (?) Seiten spärlich gedruckten Text. Es ist eine Sprache, in der man nach dem Erlernen von 10 Stichwörtern mittelgroße Programme schreiben kann. Ich würde sagen, dass diese 30 Seiten, die in Word-Standardtext geschrieben sind, für die meisten Benutzer ein umfassenderes "Fortran-Handbuch" darstellen.

Wenn Sie an CUDA interessiert sind, sollten Sie den Compiler der Portland Group überprüfen , der dies unterstützt . Ich kenne die feineren Details nicht, aber die Leute reden im Allgemeinen mit Lob darüber.

Außerdem stehen für die Parallelisierung von Programmen OpenMP, MPI und jetzt die kommenden (und lange erwarteten) Co-Arrays zur Verfügung, die Intels Compiler kürzlich implementiert hat. Um keine Worte zu verschwenden, hat Fortran ein sehr feines Gamma von "Bibliotheken" zum Parallelisieren von Programmen.

Zuallererst werden dafür standardisierte numerische Bibliotheken entwickelt, andere Sprachen folgen mehr oder weniger dem Funktions- / Routinenportfolio.

Abgesehen davon würde ich jedoch (je nachdem, wann es ursprünglich geschrieben wurde) empfehlen, wenn es sich beispielsweise um F77-Code oder älteren Code handelt, und ihn teilweise im Laufe der Zeit auf neuere Dialekte umschreiben - zumindest F90, wenn möglich mit F2003-Funktionen. Ein Papier / Diplomarbeit zu diesem Thema wurde vor kurzem veröffentlicht (mittlere Größe PDF - Datei vor). Wenn dies ordnungsgemäß durchgeführt wird, kann nicht nur die Portabilität über mehrere Plattformen sichergestellt, sondern auch die zukünftige Wartung vereinfacht werden.

ps Was "zukünftige Wartung" angeht, nur eine Anegdote, die ich manchmal erwähnen möchte. Während ich meine Diplomarbeit schrieb, habe ich einen Code von meinem Mentor wieder verwendet, der vor 35 Jahren ab dem Zeitpunkt des Schreibens geschrieben wurde. Es kompilierte mit nur einem Fehler; eine Aussage fehlt am Ende, aufgrund eines Kopierfehlers :)


@ DaveMateer (Antwort auf Kommentar) - Ich werde im Folgenden einen Kommentar abgeben, der vielleicht etwas unhöflich ist, aber verstehe es bitte nicht falsch, denn es liegt in den fairen Absichten.

Mir scheint, dass Sie dieses "Problem" falsch angehen. Was ich in ein paar kurzen Worten meine (denn hier ist es sehr spät, und meine Fähigkeit, lesbare (geschweige denn verständliche) Sätze zu formulieren, lässt mich nach 22 Uhr.)

a) Sie haben erwähnt, dass Sie versuchen, die zusätzliche Codierungszeit zu minimieren, erwägen jedoch eine Umschreibung von einer auf numerisches Rechnen spezialisierten Sprache in eine von einer farbenfrohen Sprachauswahl , wenn Sie meinen Ausdruck verzeihen

  • Einige von ihnen unterstützen unter anderem keine mehrdimensionalen Arrays
  • Die meisten von ihnen sind für schwere numerische Arbeiten ungeeignet (von Parallelverarbeitungsfähigkeiten von Haskell und Hadoop gebe ich zu, ich weiß nichts über ... aber ich habe sie noch nie in diesen Kreisen erwähnt)
  • Möglicherweise wurde es versucht, aber ich habe noch nie von einem Umschreiben von Fortran, einer Sprache für diskretisierte Probleme, in eine funktionale Sprache gehört
  • Kürzlich gab es eine Diskussion über comp.lang.fortran (versuchen Sie, in Google-Gruppen zu suchen) zu den Aspekten des wissenschaftlichen Rechnens "in der Cloud"
    (ich möchte Sie nicht desmotivieren , aber um fair zu sein, war es niemand wirklich Sicher, was dieser Begriff überhaupt bedeutet, weniger allein hatte ein Beispiel für eine erfolgreiche Anwendung. Die meisten Leute waren sich einig, dass Potenzial vorhanden ist, aber bisher sind sie glücklich darüber, wie die Dinge im Moment funktionieren.). Viele Probleme eignen sich auch nicht für diese Art der Parallelisierung.

b) Was wären die Kosten für ein solches Umschreiben? Menschen / Stunden.

c) -korrekte Versionen der zu kompilierenden Bibliotheken ...- ist ein Problem in jeder Sprache, das nicht vermieden werden kann, wie auch immer Sie es betrachten.

d) Ich habe von Python (eine wirklich nette Sprache) gehört, das einige Male in parallelen Anwendungen verwendet wurde, aber seine Durchdringung dieses Marktes scheint immer noch nicht zuzunehmen, und seine sich ständig ändernde Natur macht es zu einer sehr schlechten Wahl für ein langfristiges Projekt (denken Sie an Abwärtskompatibilität). Manche Leute mögen es sehr als "Klebesprache".

Ugh, wenn ich an etwas anderes denke, werde ich es morgen hinzufügen. Muss ein bisschen schlafen ...

Turm
quelle
@ Idigas .. wieder sehr geschätzt. Stimmen Sie voll und ganz zu, dass, wenn etwas funktioniert, das viel bedeutet. Unsere Branche ist übersät mit völlig falschen Umschreibungen (Netscape!).
Dave Mateer
1
Idigas hat hier die richtige Idee. Sie haben eine funktionierende Codebasis, die seit Jahren funktioniert, und das Transkribieren führt zu Fehlern. Außerdem ist Fortran eine einfache Sprache - sie mag hässlich sein, basiert aber auf klaren Konzepten. Behalten Sie die Abhängigkeiten von / zu anderem Code im Auge und schreiben Sie vielleicht eine nette C-artige Schnittstelle zum Fortran, und Sie werden feststellen, dass der Code bemerkenswert zukunftssicher ist (C-artig, da fast jede andere Sprache einen Mechanismus zum Aufrufen hat) Code mit einer C-Schnittstelle).
Anon
2
Muss zustimmen. Wenn Sie die Mathematik verstehen, die hinter Ihrer Arbeit steckt (und die meisten Ingenieure), ist die Implementierung in FORTRAN keine so große Lernkurve. Sobald Sie es erstellt haben, ändern sich die Anforderungen selten so wie in geschäftlichen oder sozialen Apps.
JeffO
Wow, ich wusste nicht, dass es so viel Liebe für FORTRAN gibt. Ich musste mich 5 Jahre lang in F77 entwickeln und kann das Ding nicht ausstehen.
dodgy_coder
2
@dodgy_coder. Schön zu hören, dass Sie in den Neunzigern in Fortran + .NET entwickelt haben. Die erste Betaversion von .NET erschien im Jahr 2000.
10

Ich bezweifle, dass Fortran jemals sterben wird - es enthält ein so großes Erbe an Software und Bibliotheken, dass die Leute immer noch daran arbeiten und diese Situation nur stabilisieren. Darüber hinaus ist es immer noch eine sehr gute Sprache, wenn Sie nicht mehr als das Knacken von Zahlen tun möchten - die Syntax ist sehr elegant und logisch, und der Compiler kann leicht erraten, was gerade passiert. Auf diese Weise wird garantiert, dass jede neue Hardware-Beschleunigertechnologie C, Fortran und irgendeine Art von OpenCL unterstützt (wenn es schließlich zu etwas Festem konvergieren würde).

Also würde ich sagen, Sie sollten einfach den numerischen Teil klar trennen, ihn in Fortran belassen, eine klare Bindung herstellen und den Rest in das schreiben, was Sie wollen.

mbq
quelle
Ganz zu schweigen davon, dass heutzutage auch neue Projekte in Fortran gestartet werden.
Turm
Ja, Fortran ist kein COBOL, es wird nicht nur unterstützt, weil die Leute das vor 30 Jahren gelernt haben (obwohl IMO es ein Teil davon ist). Zahlen zu knacken ist jedoch nicht meine Stärke. Wenn es etwas Besseres gibt, weiß ich es bestimmt nicht.
Ben Brocka
1
Die fortran-Sprache hat immer noch einen Vorsprung von zehn Jahren bei der Eingabe von Zahlen und den damit verbundenen Optimierungen. Es wird nicht so schnell sterben.
Martin York
1
In einem kürzlich erschienenen Artikel in "Communications of the ACM" wurde alles über Fortran und wie es mit sukzessiven Modernisierungen immer weitergeht. Es wäre wahrscheinlich ein guter Schachzug, den Code in Fortran beizubehalten. Es hilft auch, das Netscape-Syndrom zu vermeiden (umschreiben = neue Bugs = enorme Zykluszeit = sauer auf alle Beteiligten).
quick_now
1
Möchten Sie wirklich, dass jemand, der sich überhaupt nicht für Fortran interessiert, Ihren Zahlencode berührt? Ein großes Problem besteht darin, sicherzustellen, dass das Ergebnis nach einem Umschreiben noch korrekt ist.
Peter Smith
4

Python gewinnt in der wissenschaftlichen Computer-Community in der Tat eine Menge an Zugkraft (für eine etwas veraltete Ansicht siehe Band 9 Nummer 3 von CiSE ). Ich halte einen Python / Fortran-Hybrid für einen hervorragenden Weg. Um alle diese GPUs zu nutzen, können Sie PyCUDA oder PyOpenCL verwenden .

Ich bin ein Mathematiker, der numerische Löser für partielle Differentialgleichungen analysiert und schreibt. Ich befand mich kürzlich in einer ähnlichen Situation wie die Ihres Freundes. Bei dem fraglichen Fortran 77-Code handelt es sich um die bekannte Clawpack-Software . Wir haben den Code der obersten Ebene (alle Teile, die nicht schnell sein müssen) in Python umgeschrieben und f2py verwendet, um die Teile der unteren Ebene automatisch umzubrechen.

Das wirklich beeindruckende Ergebnis ist, dass wir den hybriden Python / Fortran-Code (genannt PyClaw ) nahezu trivial mit der Parallelbibliothek PETSc verbinden konnten, wodurch zum ersten Mal eine skalierbare Parallelversion von Clawpack erstellt wurde, die auf 65K-Kernen eine gute Leistung erbringt. Der gesamte parallele Code, den wir schreiben mussten, ist in weniger als 300 Zeilen Python enthalten . Wir lösen jetzt Probleme, die nur mit dem alten Code hätten gelöst werden können. Ebenso wichtig ist, dass neue Benutzer den Code jetzt viel einfacher abrufen können, da Python eine so benutzerfreundliche Sprache ist und fast alles zur Laufzeit geändert werden kann, anstatt zur Kompilierungszeit.

Wenn Sie mehr Details zu unserem Ansatz und unseren Ergebnissen erfahren möchten, haben wir einen Artikel über arXiv .

Entschuldigung für die Eigenwerbung, aber es schien, dass meine persönliche Erfahrung hier relevant sein würde. Wenn Sie weitere Ideen hören möchten, können Sie diese auch auf der neuen Website http://scicomp.stackexchange.com veröffentlichen .

David Ketcheson
quelle
1

Ich bin derzeit in einer Situation, die der Ihres Freundes sehr ähnlich ist. Ich bin auch verzweifelt daran, meinen 40-Bit-KLOC-Fortran-77-Legacy-Code zu "modernisieren". Und obwohl Fortran immer noch als der König in Zahlenverarbeitungsanwendungen gilt, möchte ich sagen, dass nicht alles verloren ist. (Was folgt, ist scherzhaft, also ertrage es mit mir).

Nur weil Fortran die beste Sprache für numerischen Code ist, heißt das noch lange nicht, dass wir dieses gewaltige Gepäck eines unordentlichen, komplizierten Codes immer bei uns haben müssen (Ja, ein Fortran-Code muss unordentlich sein, besonders Fortran-77, das ist ein Sprache, die buchstäblich keine Rücksicht auf Software-Engineering hat, wenn sie bestimmte KLOCs überschreitet). Die Befürworter von Fortran für das Knacken von Zahlen vergessen die allgemeine Beobachtung, dass bei der Leistungsanalyse solcher Codes nur 5% oder 10% des Codes leistungsintensiv sind und dass Fortran für die verbleibenden über 90% einen nutzlosen Overhead darstellt dort, um Ihr Leben als "Software-Ingenieur" zur Hölle werden zu lassen.

Wenn Sie von Fortran-77 zu Fortran-90 wechseln, sind Sie im Wesentlichen bereit, die Leistung in gewissem Umfang mit den Sprachfunktionen abzuwägen. Fortran ist vor allem wegen Fortran-77 ein mächtiger Zahlenknacker. Man könnte sagen, Fortran-90 ist genauso schnell, aber die Art der Optimierungsprobleme, mit denen sich Compiler-Autoren befassen mussten, während sie Fortran-90/2003-Funktionen hinzufügten und trotzdem die Fortran-77-Leistung beibehielten, unterscheiden sich nicht wesentlich von den Problemen, mit denen sich C-Compiler-Autoren befassen mussten mit (und daher gilt C auch als schnell, ganz zu schweigen davon, dass C auch Inline-Assemblierung ermöglicht). Warum also nicht C-Code Stück für Stück (anstelle von Fortran-90) in einen Fortran-77-Code einfügen? Mein Code enthält bereits Teile in C und Teile in Fortran-77, und es funktioniert sehr gut, wenn Probleme wie das Übergeben von Zeichenfolgen, das Null-Indizieren / Ein-Indizieren usw. auftreten.

Ich würde noch einen Schritt weiter gehen. Sogar C (und definitiv Fortran-90/95/2003) ist zu niedrig, wenn Sie eine nette "humane" Schnittstelle zu einem Zahlencode wollen. Ich denke an einen Python-Fortran-77 oder einen Python-C-Hybrid. Ein Code, in dem 90% des Codes Python ist (einschließlich Numpy, Scipy, Plotbarkeit und all dieser Süße) und nur die leistungsintensiven 5% -10% als Fortran-77- oder C-Code verbleiben.

Yudle Joza
quelle
1
msgstr "Ein Fortran - Code muss chaotisch sein". Nein. Ein unordentlicher Programmierer schreibt unordentlichen Code in jeder Sprache, und das Gegenteil ist der Fall. Kernighan und Plauger haben gezeigt , wie sauber Fortran schreiben Jahren .
0

Ich bin gerade dabei, eine alte FORTRAN95-Codebasis für die Verwendung in modernen Industrieumgebungen zu aktualisieren, da die vorherige Version spätestens auf Windows 2000-Computern ausgeführt werden kann. Die FORTRAN-Codebasis selbst führt eine große Anzahl von Berechnungen durch, die mit Bewässerungssimulationen verbunden sind.

Anstatt das FORTRAN in einer moderneren Sprache neu zu schreiben, verwende ich einfach einen kommerziellen Compiler namens Silverfrost FTN95 , um die FORTRAN-Codebasis in eine .Net 4.0-Bibliothek zu kompilieren, die ich als Backend einer WPF-Anwendung verwende . Auf diese Weise gehe ich nicht das Risiko ein, bekannte Fehler in den Simulationscode zu bringen, und modernisiere ihn, indem ich die Codebasis auf das .Net 4.0-Framework verschiebe, damit er in moderneren Umgebungen ausgeführt werden kann.

Aber je nachdem, wie groß Ihre Simulation ist, möchten Sie vielleicht einfach das Ganze in einer moderneren Sprache wie C # neu schreiben. Ich selbst plane dies, sobald ich eine laufende Version der Simulation habe, mit der ich die Ausgabe vergleichen kann.

Hoffe meine Erfahrung hilft, Danke, Alex.

Alex Hope O'Connor
quelle
0

Ich war leitender Entwickler eines Projekts von 2001-2003, das eine 100KLOC-Windows-Anwendung von FORTRAN nach C # portierte. Es war eine Zahlenverarbeitung, die ihre eigenen GUI-Bindungen an Win32-Bibliotheken hatte. Die Portierung auf C # und WinForms vereinfachte die Verwaltung des Codes erheblich und ermöglichte allen Anwendern eine umfassendere Entwicklungsumgebung in Visual Studio. Früher gab es einiges an Widerstand (insbesondere in Bezug auf Formatangaben), aber am Ende hat es sich definitiv gelohnt.

Meiner Meinung nach ist es sinnvoll, die Kugel zu beißen und die maximal mögliche Menge an FORTRAN-Code loszuwerden. Geschwindigkeit war nie ein Problem - erste Tests, bei denen Code in C # im Vergleich zu FORTRAN ausgeführt wurde, ergaben, dass der Leistungsunterschied vernachlässigbar ist, obwohl in C # verwalteter Code ausgeführt wird. Ihre Bedürfnisse mit Vektoren können jedoch etwas anders sein, und es wäre auch akzeptabel, wenn nur noch eine geringe Menge FORTRAN-Code übrig wäre.

Ein weiterer Grund dafür ist natürlich die langfristige Verfügbarkeit von Personen mit FORTRAN-Erfahrung, die Ihren Code im Vergleich zu C # -Entwicklern verwalten können. Außerdem hilft es der Moral des Teams, in einer modernen, gut unterstützten Sprache zu arbeiten.

dodgy_coder
quelle
0

Mir wurde gesagt, dass MATLAB in vielen Zusammenhängen FORTRAN für wissenschaftliche Computeranwendungen ersetzt. Es ist nicht nur modern und hochwertig, sondern auch ziemlich schnell. Viele Entwickler, die an medizinischer Bildgebungssoftware arbeiten, verwenden MATLAB bereits. Daher gibt es mehrere Bibliotheken, die der medizinischen Bildgebung gewidmet sind. Dies bedeutet, dass Sie sowohl Tools als auch fachkundigen Support finden, wenn Sie sich für MATLAB entscheiden.

Oleksi
quelle