Warum definieren Programmierer Programmiermodelle, um C / POSIX für Parallelität zu ersetzen?

10

Anbieter neuer Computerarchitekturen versuchen regelmäßig, neue Programmiermodelle einzuführen, z. B. kürzlich CUDA / OpenCL für GPGPUs, und C / POSIX als Steuerungsschnittstelle für die Plattformparallelität zu verdrängen. (Poss & Koening, AM3: Auf dem Weg zu einem Hardware-Unix-Beschleuniger für viele Kerne, 2015)

Warum versuchen Architekturdesigner, neue Programmiermodelle zu entwerfen, um C / POSIX für paralleles Rechnen zu ersetzen? Ist C / POSIX nicht gut für Multiprozessoren geeignet, oder hatten die ursprünglichen Autoren von C / POSIX zum Zeitpunkt der C / POSIX-Entwurfszeit keine Notwendigkeit für paralleles Rechnen? Oder benötigen Programmierer mehr Funktionen, als C / POSIX bieten kann, und greifen daher auf neue Designs wie CUDA / OpenCL usw. zurück?

Codezombie
quelle
7
Denken Sie daran, Software ist eine Abstraktion von Hardware. Wenn sich die Hardware zu stark ändert, ist die Software-Abstraktion möglicherweise nicht mehr gut. Ich glaube, dass dies sicherlich zutrifft, wenn Sie die Verwendung von POSIX-Threads für eine GPU in Betracht ziehen, aber ich werde es jemand anderem überlassen, dies in einer Antwort ausführlicher zu erläutern.

Antworten:

10

Vergleichen Sie beispielsweise POSIX-Threads und Grand Central Dispatch. Ich habe Code, der in acht Codezeilen an vier Threads gesendet wird. Mit POSIX wäre das alles ein absoluter Albtraum.

Andererseits geht es bei CUDA / OpenCL überhaupt nicht um Multithreading, sondern um die Verwendung massiver Vektorfähigkeiten. (Sie können auch Multithreading ausführen, aber Vektorisierung ist das Wichtigste).

gnasher729
quelle
9

Es wird zwischen der parallelen SIMD- Programmierung und dem traditionelleren parallelen Programmiermodell von POSIX unterschieden.

SIMD ist das Modell, das CUDA, OpenCL usw. verwenden. Es gibt einen einzelnen Befehlssatz, der gleichzeitig von vielen Threads ausgeführt wird, die jeweils mit ihrem eigenen Datenpool arbeiten. Dies ist sehr nützlich für 3D-Grafiken, bei denen dieselben Transformationen auf eine große Anzahl von Punkten angewendet werden.

Das POSIX-Modell geht davon aus, dass jeder Thread asynchron ausgeführt wird und jeder Thread möglicherweise völlig anderen Code ausführen kann.

Beide Modelle haben ihre Stärken und Schwächen - deshalb sind sie unterschiedlich. POSIX ist viel flexibler, aber CUDA / OpenCL / etc. kann von spezialisierter Hardware profitieren und Tausende von (normalerweise einfacheren) Threads gleichzeitig ausführen.

Mike Harris
quelle