Was ist die am häufigsten verwendete Programmiersprache im Hochleistungsrechnen? Und warum? [geschlossen]

25

Ich glaube, dass viel Fortran in HPC verwendet wird, aber ich bin mir nicht sicher, ob dies nur aus alten Gründen geschieht.

Funktionen moderner Programmiersprachen wie Garbage Collection oder Laufzeit-Polymorphismus sind für HPC nicht geeignet, da die Geschwindigkeit eine Rolle spielt.

Irgendwelche Gedanken?

Fanatic23
quelle
9
In C ++ gibt es keinen Garbage Collector, und Sie müssen keinen Laufzeitpolymorphismus verwenden.
Jason Baker
@Jason Ich möchte herausfinden, welche Funktionen von C ++ es zu einem überzeugenden Argument für HPC machen.
Fanatic23
@ Fanatic23 - ich verstehe. Ich wollte das nur notieren. :-)
Jason Baker
1
@Fanatic Ich wünschte, ich könnte ja sagen, aber ich habe nicht zu viel ... Ich habe jedoch eine Reihe von Links zu einigen Leistungsproblemen in .NET / funktionalen Sprachen. Möglicherweise können Sie die Konzepte im Kopf zusammenfügen, um bestimmte Leistungseinschränkungen zu verstehen : msdn.microsoft.com/en-us/library/0xy59wtx.aspx stackoverflow.com/questions/2909282/… msdn.microsoft.com/en -US / Magazin / cc163329.aspx en.wikipedia.org/wiki/Just-in-time_compilation
Rei Miyasaka
1
Ich denke jedoch, wenn Sie eine wirklich gute Reaktionszeit benötigen , suchen Sie ein Echtzeit-Betriebssystem wie QNX: en.wikipedia.org/wiki/QNX
Rei Miyasaka

Antworten:

11

Ich habe viel Java für HPC in Bereichen gesehen, in denen (1) wenig Legacy-Code vorhanden ist und (2) Entwicklungszeit und Codequalität eine Rolle spielen. Typische Anwendungsbereiche sind Finanzen, Data Mining oder Bioinformatik.

Es hängt wirklich von der Anwendung ab (es gibt ein Leben außerhalb der linearen Algebra), aber die Leistung aktueller JVMs ist häufig mit C-Code vergleichbar. Manchmal schneller, wenn die JVM zur Laufzeit clevere Optimierungen durchführen kann, die statische Compiler (C, Fortran) nicht können. Und auf jeden Fall schneller, wenn es viel symbolisches Rechnen gibt.

Bei einer festgelegten Zeit für die Programmentwicklung ist der resultierende Java-Code durchweg schneller als C-Code. HPC in Java ist auf jeden Fall sinnvoll, wenn Code häufig entwickelt oder geändert wird. Ein weiteres wichtiges Merkmal ist die Codemobilität über verschiedene Hardware.

Referenzen finden Sie unter http://ateji.blogspot.com/2010/09/java-for-high-performance-computing.html

Unter der Annahme, dass zwei Adressen eindeutig sind, arbeitet Fortran an einem statischen Analysetool, das ähnliche Optimierungen für Code in Hochsprachen ermöglicht, jedoch ohne das Bit "Bad Things May Happen". Kontaktieren Sie mich bei Interesse.


quelle
14
Nitpick: JIT-Optimierungen stehen statischen Compilern zur Verfügung, wenn Sie etwas Arbeit erledigen möchten. Sowohl GCC als auch MS Visual Studio unterstützen Profile Guided Optimizations, die mit gespeicherten Laufzeitdaten optimiert werden. Es ist etwas irreführend anzunehmen, dass es Optimierungen gibt, "die statische Compiler (...) nicht können".
Corbin
4
Ich weiß nicht, warum dies die akzeptierte Antwort ist, nichts in diesem Beitrag enthält einen Anschein von Wahrheit. C-basierte Sprachen übertreffen Java immer, da Java eine virtuelle Maschine ist, die von Natur aus von einer anderen Sprache abhängig ist. Darüber hinaus können Sie alles, was Sie in Java erreichen können, in C mit weniger Aufwand erreichen. C-basierte Sprachen werden niemals aufhören, die "performante" Sprache zu sein.
Mike
31

In meiner jahrelangen Erfahrung vor bis zu 5 Jahren waren es immer Fortran und C. Was am meisten davon abhing, ob die Leute mehr vom Ingenieurswesen oder mehr von der CS-Denkschule stammten (ich weiß nicht, wie ich das besser ausdrücken soll) , okey? :-)

In dem, was wir taten, wurde fast ausschließlich Fortran verwendet.

Nach dem, was ich heute gelesen habe, scheint es mit den neuen Updates für den Standard F2003 / 08 und der Einführung von Co-Arrays wieder an Dynamik zu gewinnen.

Auch ein, wenn nicht etwas voreingenommener Artikel - Die ideale HPC-Programmiersprache

Turm
quelle
16

Ich denke, für echte Pedale im Metal ist Fortran die einzige echte Wahl. Die Überlegung ist, dass das Wichtigste für die Ausnutzung von ILP auf niedriger Ebene (Instruction Level Parallism) die Disambiguierung von Speicheradressen ist. Mit den Defacto-Regeln in Fortran kann der Compiler feststellen, dass zwei Adressen eindeutig sind (und daher kann die Reihenfolge von Laden und Speichern oder sogar Speichern und Speichern ausgetauscht werden, ohne dass das Risiko besteht, dass falscher Code generiert wird). C lässt zu viel Spielraum für überlappende Zeiger, damit der Compiler so viel Parallelität auf niedriger Ebene aus dem Code extrahieren kann.

Auch die Array-Ausrichtung, Schreib-Cache-Zeilen und SSE / AVX-Grenzen sind wichtig für die Erzeugung und Ausführung effizienter Schleifen. Wenn Arrays über gemeinsame Blöcke übergeben werden, kann der Compiler / Loader sicherstellen, dass alle Arrays an denselben Adressausrichtungsgrenzen beginnen und effizientere SSE / AVX-Ladevorgänge und -Speicher verwendet werden können. Die neuere Hardware kann nicht ausgerichtete Speicherzugriffe verarbeiten. Da der Speicherzugriff jedoch nicht ordnungsgemäß ausgerichtet ist, führt die teilweise Verwendung von Cache-Zeilen zu einer geringeren Leistung. Gibt es einen Mechanismus, um dies dem Compiler mitzuteilen, selbst wenn ein C-Programmierer alle seine Arrays richtig ausrichtet?

Zusammenfassend sind die beiden wichtigsten Punkte die Unabhängigkeit von Speicheradressen und die Erkennung durch den Compiler, dass die Datenstrukturen, auf die zugegriffen wird, dieselbe "natürliche" Ausrichtung aufweisen, die die Hardware wünscht. Bisher leistet Fortran bei diesen beiden Aufgaben die beste Arbeit.

Omega Centauri
quelle
2
Ich habe kürzlich ein kleines Experiment durchgeführt, um die Pop-Anzahl einer Zeichenfolge mit 64000 Bits zu ermitteln, die als vorzeichenloses, langes, langes Array dargestellt wird. Ich habe genau den gleichen Algorithmus verwendet und viele interessante boolesche und gepackte arithmetische Dinge verwendet. In C mit -O3 dauerte es 10 Takte pro Sekunde, während es mit fortran Intel Fortran 10.1 bei Standardoptimierung 6,5 war! Und jeder Programmierer denkt, C ist besser für ein bisschen Twiddling! Fortran-Defacto-Annahmen ermöglichen die sichere Generierung einer effizienteren Befehlscodierung auf niedriger Ebene.
Omega Centauri
4
Das sollte lauten "Die Defacto-Regeln in Fortran ermöglichen es dem Compiler, davon auszugehen, dass zwei Adressen eindeutig sind ...". In den Handbüchern heißt es alle, dass der Compiler dies annehmen darf, und im Detail, dass schlechte Dinge passieren können, wenn Sie gegen diese Annahme verstoßen.
John R. Strohm
15

Nur ein paar Anekdoten. Ich habe selbst noch kein Hochleistungs-Computing gemacht.

Für Berechnungen (Zahlenkalkulation), Fortran und C. Ja, es ist aus Legacy-Gründen:

  • Reichliche Verfügbarkeit von gemeinfreiem Quellcode und Rezepten.
  • Beide unterstützen MPI .
  • Beide Sprachen werden kompiliert.
  • Compiler für beide Sprachen werden von allen HPC-Betriebssystemen und -Herstellern bereitgestellt.
  • Vektorisierende Compiler sind verfügbar.
  • Beides erfordert ein unglaubliches Maß an Optimierungen, um eine hohe Leistung zu erzielen, wenn es auf einen anderen Cluster portiert wird (unterschiedliche Speichergröße, Anzahl der CPUs usw.).
    • Dies erklärt tatsächlich, warum der Open Source Code wichtig ist: Optimierungen sind erforderlich, daher muss das Originalrezept in einer Sprache verfasst sein, die für manuelle Optimierungen geeignet ist.

Der aktuelle Trend für die Zahlenverarbeitung besteht darin, Programmgeneratoren zu schreiben, die das Optimieren des Quellcodes automatisieren, um die Leistung angesichts der Cluster-Eigenschaften zu optimieren. Diese Generatoren geben häufig in C aus.

Ein zweiter Trend ist das Schreiben in einem speziellen Dialekt von C für bestimmte GPUs oder Cell BE.

Für nicht numerische Arbeiten, wie z. B. Programme, die Daten aus einer Datenbank verarbeiten (aber nicht aus der Datenbank selbst), ist es viel billiger, auf Clustern von "Commodity" -Maschinen ohne die teuren angepassten Netzwerkgeräte zu laufen. Dies wird üblicherweise als "High Throughput Computing" bezeichnet. Und Python ist hier die erste Sprache (mit dem berühmten Map Reduce). Vor Python können Stapelverarbeitungsprojekte in einer beliebigen Sprache geschrieben werden und werden normalerweise von Condor versendet .

rwong
quelle
1
Könnten Sie etwas näher auf den "verrückten Grad der Feinabstimmung" eingehen?
Rook
Das Rechenzentrum beauftragt Doktoranden, die MPI-Aufrufe neu zu ordnen, damit sie schneller ausgeführt werden.
rwong
(?) Das erste Wort hier, aber ich denke, die Praktiken unterscheiden sich.
Rook
Es war ein Forschungszentrum für Klimamodelle.
Rwong
4

Ich habe an SEHR rechenintensivem Code in (keuchen!) C # gearbeitet.

Ich erstelle eine GPGPU-Implementierung von FDTD für die optische Modellierung. Auf einem kleinen Cluster (128 Prozessoren) dauern viele unserer Simulationen Wochen. Die GPU-Implementierungen werden jedoch in der Regel 50-mal schneller ausgeführt - und das auf einer NVidia-Karte für Endverbraucher. Wir haben jetzt einen Server mit zwei GTX295-Dual-Prozessor-Karten (mehrere hundert Kerne) und bekommen bald einige Teslas.

Wie bezieht sich das auf Ihre Sprache? Genauso wie der zuvor verwendete C ++ - FDTD-Code CPU-gebunden war, sind diese GPU-gebunden, sodass der ( sehr kleine) Leistungsunterschied zwischen verwaltetem und nativem Code nie ins Spiel kommt. Die C # -App fungiert als Dirigent, der OpenCL-Kernel lädt, Daten zu und von den GPUs überträgt, die Benutzeroberfläche bereitstellt, Berichte erstellt usw. - alles Aufgaben, die in C ++ nerven.

In den vergangenen Jahren war der Leistungsunterschied zwischen verwaltetem und nicht verwaltetem Code so groß, dass es sich manchmal lohnte, das schreckliche Objektmodell von C ++ in Kauf zu nehmen, um ein paar Prozent mehr Geschwindigkeit zu erzielen. Heutzutage überwiegen die Entwicklungskosten von C ++ gegenüber C # die Vorteile für die meisten Anwendungen bei weitem.

Außerdem hängt der größte Teil Ihres Leistungsunterschieds nicht mit Ihrer Sprachauswahl zusammen, sondern mit den Fähigkeiten Ihres Entwicklers. Vor einigen Wochen habe ich eine einzelne Divisionsoperation aus dem Inneren einer dreifach verschachtelten Schleife (3D-Array-Traversal) verschoben, wodurch die Ausführungszeit für eine bestimmte Berechnungsdomäne um 15% reduziert wurde. Dies ist ein Ergebnis der Prozessorarchitektur: Die Aufteilung ist langsam. Dies ist eines der Gesichter, die Sie nur irgendwo aufgegriffen haben müssen.

3Dave
quelle
1
C ++ hat ein Objektmodell? Aber es hört sich so an, als hättest du eine Skriptsprache verwenden sollen, um deine Controller zu schreiben. Wenn C # aufgrund der Geschwindigkeit der Entwickler besser ist als C ++, dann ist Python (oder Lua usw.) ähnlich besser als C #.
gbjbaanb
3
@gbjbaanb Nicht unbedingt. Diese Implementierung ist an die GPU gebunden, aber der Wechsel zu einer Skriptsprache könnte dies sehr leicht ändern. C # ist kompiliert und hat einen sehr schönen Optimierer. Kompilierte, stark typisierte Sprachen sind deine Freunde! Weniger strenge Skriptsprachen führen bei relativ komplexen Projekten zu einer längeren Entwicklungszeit.
3Dave
1
Es ist sieben Jahre her. Ich habe viel gelernt. C ++ ist ziemlich genial, C # ist auch genial, ich mag Python und: CPU-Leistung ist immer noch wichtig.
3Dave
3

Fortran ist am häufigsten anzutreffen, hauptsächlich aufgrund von Legacy (die Leute verwenden immer noch alten Code) und Vertrautheit (die meisten Leute, die HPC verwenden, sind mit anderen Arten von Sprachen nicht vertraut).

Funktionen moderner Programmiersprachen wie Garbage Collection oder Laufzeit-Polymorphismus sind für HPC nicht geeignet, da die Geschwindigkeit eine Rolle spielt.

Das ist im Allgemeinen nicht wahr. Klassische HPC führten meist lineare Algebra mit maschinengenauen Zahlen durch. Moderne HPC-Systeme verwenden jedoch zunehmend Supercomputer für eine breitere Palette von Funktionen, z. B. symbolische Berechnungen mit beliebigen mathematischen Ausdrücken anstelle von maschinengenauen Zahlen. Dadurch ergeben sich für die von Ihnen verwendeten Tools ganz andere Eigenschaften, und es ist nicht ungewöhnlich, andere Programmiersprachen als Fortran zu verwenden, da die symbolische Berechnung ohne GC und andere Arten von Optimierungscompilern wie den OCaml-Optimierungs-Pattern-Match-Compiler unerschwinglich schwierig sein kann.

Lesen Sie zum Beispiel diesen Artikel von Fischbacher et al. die besagt, "die Autoren haben starken Grund zu der Annahme, dass dies die größte symbolische Berechnung sein könnte, die bisher durchgeführt wurde".

Jon Harrop
quelle
Fortran ist weit verbreitet, da viele Leute Supercomputer-Zeit verwenden, um Simulationen physikalischer Systeme wie die globale Wettervorhersage und die Implementierung der erforderlichen Algorithmen in Fortran sehr klar und präzise durchzuführen.
Sharpie
3

Fortran, aus guten und aus weniger guten Gründen. Ein guter Grund dafür ist, dass es umfangreiche Bibliotheken (BLAS, LAPACK) mit bewährten Unterprogrammen gibt, die alle in Fortran geschrieben sind (obwohl diese von C und C ++ aus aufgerufen werden können).

Ein nicht ganz so guter Grund ist der vermeintliche Leistungsvorteil von Fortran gegenüber C / C ++. Optimierer sind ziemlich gut, und nur wenige Leute wissen, dass der Vorteil der Optimierung eines Codeteils proportional zu dem Prozentsatz der Zeit ist, in der der Code ausgelastet ist.

Ein weiterer nicht so guter Grund ist eine kulturelle Kluft zwischen CS- und Nicht-CS-Programmierern. Wissenschaftliche Programmierer lernen in Fortran schlechte Gewohnheiten und sehen auf die CS-Programmierer und die schlechten Gewohnheiten, die ihnen beigebracht wurden, und auf die ersteren herab.

Mike Dunlavey
quelle
"Kulturelle Kluft zwischen CS- und Nicht-CS-Programmierern. Wissenschaftlichen Programmierern werden in Fortran in der Regel schlechte Gewohnheiten beigebracht, und sie blicken auf die CS-Programmierer und die schlechten Gewohnheiten, die ihnen beigebracht wurden, und auf die ersteren." Dies ist zum Teil nur darauf zurückzuführen, dass sie sich auf verschiedene Aspekte des Problems konzentrieren. Fortran bedeutet FORmula TRANslation, und es ist ziemlich effizient bei der Übersetzung von mathematischen Formeln in Code. Für die Art der Programmierung von CS-Typen sind andere Sprachen überlegen.
Omega Centauri
1
@ Omega: Du hast recht. Die in Fortran unterrichteten Leute neigen dazu, kein Konzept für Formatierung zu haben, "implizites Nichts" zu verabscheuen und den Code zusammen zu stopfen, weil sie sich immer noch mit 72-Zeichen-Zeilen befassen und der Meinung sind, verständlichen Code sei für Weicheier. Die von CS unterrichteten Leute erschaffen Monsterpyramiden aus Klassen, die mit Polymorphismen, Benachrichtigungen und Abstraktionen übersät sind, wenn etwas Einfaches den Job erledigen würde. Sie haben sich also gegenseitig verdient :)
Mike Dunlavey
7
das Zitat lautete früher: "Die Physiker lösen die Probleme von morgen auf der Hardware von gestern - während die CS-Leute die Probleme von gestern auf der Hardware von morgen lösen"
Martin Beckett
@Martin: Ich denke, vielleicht habe ich das irgendwo gehört. Es klingt sicher wahr.
Mike Dunlavey
Martin: Also, die Hardware-Leute sind die effizientesten :)
Dhaivat Pandya
2

Grundsätzlich sind alle Programme, die die eigentliche Arbeit der Zahlenverarbeitung erledigen, immer noch FORTRAN (die alten blas, Lapack, Arnoldi usw. werden immer noch verwendet) C ++.

Die Komplexität der Simulation beinhaltet einen großen Code. Wenn Sie einen Vorteil aus dem Schreiben ziehen möchten, müssen Sie ihn wiederverwendbar machen. Auch die verwendeten Konzepte sind sehr komplex geworden. Es ist fast ein Wahnsinn, diese Informationen mit FORTRAN darzustellen. Hier kommt C ++ ins Spiel, da es von Natur aus objektorientiertes Design unterstützt. Laufzeitpolymorphismus wird jedoch selten bevorzugt. Stattdessen wird fast immer der statische Polymorphismus verwendet (der in C ++ mit Template-Metaprogrammierung implementiert ist).

Außerdem sind die Compiler jetzt wirklich gut, weshalb den Compilern viel Optimierungsarbeit überlassen bleibt.


quelle
1

Es gibt zwei Arten von Problemen, die bei HPC-Anwendungen behoben werden müssen: Die eine ist die Zahl, die sich selbst zermahlt, und die andere verwaltet die Berechnungen. Die erste Methode wird normalerweise mit in Fortran, C oder C ++ geschriebenem Code angegangen, da die Geschwindigkeit und die Tatsache, dass bereits viele wissenschaftliche Algorithmen in diesen Sprachen geschrieben sind, ausschlaggebend sind. Die Steuerung von Berechnungen wird bequemer in höheren Sprachen implementiert. Python ist die bevorzugte "Klebesprache" für die Verarbeitung von Anwendungslogik und das Aufrufen von Erweiterungen, die in kompilierten Sprachen implementiert sind. Java wird häufig in Projekten verwendet, in denen die Verwaltung von Netzwerken und verteiltem Computing unerlässlich ist.

j ..
quelle