Migrieren von OpenMP zur Concurrency Runtime

Concurrency Runtime ermöglicht eine Vielzahl von Programmiermodellen. Diese Modelle überlappen oder ergänzen die Modelle von anderen Bibliotheken. Die Dokumente in diesem Abschnitt vergleichen OpenMP mit der Parallelitätslaufzeit und enthalten Beispiele zum Migrieren vorhandener OpenMP-Code zur Verwendung der Parallelitäts-Runtime.

Das OpenMP-Programmiermodell wird durch einen offenen Standard definiert und verfügt über klar definierte Bindungen zu den Programmiersprachen Fortran und C/C++. OpenMP-Versionen 2.0 und 2.5, die vom Microsoft C++-Compiler unterstützt werden, eignen sich gut für parallele Algorithmen, die iterativ sind; d. h., sie führen parallele Iteration über ein Datenarray aus. OpenMP 3.0 unterstützt nicht iterative Aufgaben zusätzlich zu iterativen Vorgängen.

OpenMP ist am effizientesten, wenn der Grad an Parallelität vorgegeben ist und mit den verfügbaren Ressourcen auf dem System übereinstimmt. Das OpenMP-Modell ist eine besonders gute Übereinstimmung für hochleistungsbasiertes Computing, bei dem sehr große Rechenprobleme über die Verarbeitungsressourcen eines Computers verteilt werden. In diesem Szenario ist die Hardwareumgebung im Allgemeinen behoben, und der Entwickler kann vernünftigerweise erwarten, dass er exklusiven Zugriff auf alle Computerressourcen hat, wenn der Algorithmus ausgeführt wird.

Weniger eingeschränkte Computerumgebungen sind jedoch möglicherweise keine gute Übereinstimmung für OpenMP. Rekursive Probleme (z. B. der Schnellsortierungsalgorithmus oder das Durchsuchen einer Datenstruktur) sind beispielsweise mit OpenMP 2.0 und 2.5 schwieriger zu implementieren. Die Parallelitätslaufzeit ergänzt die Funktionen von OpenMP, indem die asynchrone Agents-Bibliothek und die Parallel Patterns Library (PPL) bereitgestellt werden. Die Bibliothek für asynchrone Agents unterstützt grobkörnige Aufgaben-Parallelität; die PPL unterstützt differenzierte parallele Vorgänge. Die Parallelitätslaufzeit stellt die Infrastruktur bereit, die zum parallelen Ausführen von Vorgängen erforderlich ist, sodass Sie sich auf die Logik Ihrer Anwendung konzentrieren können. Da die Parallelitätslaufzeit jedoch eine Vielzahl von Programmiermodellen ermöglicht, kann der Planungsaufwand größer als andere Parallelitätsbibliotheken wie OpenMP sein. Daher wird empfohlen, die Leistung beim Konvertieren des vorhandenen OpenMP-Codes inkrementell zu testen, um die Parallelitätslaufzeit zu verwenden.

Zeitpunkt der Migration von OpenMP zur Parallelitätslaufzeit

Es kann vorteilhaft sein, vorhandenen OpenMP-Code zu migrieren, um die Concurrency Runtime in den folgenden Fällen zu verwenden.

Fälle Vorteile der Parallelitätslaufzeit
Sie benötigen ein erweiterbares paralleles Programmierframework. Viele der Funktionen in der Concurrency Runtime können erweitert werden. Sie können auch vorhandene Funktionen zu neuen Funktionen kombinieren. Da OpenMP auf Compilerdirektiven basiert, kann sie nicht einfach erweitert werden.
Ihre Anwendung würde von einer kooperativen Blockierung profitieren. Wenn ein Vorgang blockiert wird, da eine Ressource erforderlich ist, die noch nicht verfügbar ist, kann die Parallelitätslaufzeit andere Vorgänge ausführen, während der erste Vorgang auf die Ressource wartet.
Ihre Anwendung würde vom dynamischen Lastenausgleich profitieren. Die Parallelitäts-Runtime verwendet einen Terminplanungsalgorithmus, der die Zuordnung von Computerressourcen anpasst, wenn sich Workloads ändern. Wenn der Planer in OpenMP Computerressourcen zu einer parallelen Region zuweist, werden diese Ressourcenzuordnungen während der gesamten Berechnung festgelegt.
Sie benötigen Unterstützung für die Ausnahmebehandlung. Mit der PPL können Sie Ausnahmen sowohl innerhalb als auch außerhalb eines parallelen Bereichs oder einer Schleife abfangen. In OpenMP müssen Sie die Ausnahme innerhalb des parallelen Bereichs oder der Schleife behandeln.
Sie benötigen einen Abbruchmechanismus. Mit der PPL können Anwendungen einzelne Vorgänge und parallele Arbeitsstrukturen abbrechen. OpenMP erfordert, dass die Anwendung einen eigenen Abbruchmechanismus implementiert.
Sie benötigen parallelen Code, um ihn in einem anderen Kontext abzuschließen, von dem er gestartet wird. Mit der Parallelitätslaufzeit können Sie eine Aufgabe in einem Kontext starten und dann in einem anderen Kontext warten oder abbrechen. In OpenMP müssen alle parallelen Arbeiten im Kontext abgeschlossen werden, aus dem sie gestartet wird.
Sie benötigen eine erweiterte Debuggingunterstützung. Visual Studio stellt die Fenster "Parallele Stapel" und "Parallele Aufgaben " bereit, sodass Sie Multithread-Anwendungen einfacher debuggen können.

Weitere Informationen zur Debuggingunterstützung für die Parallelitätslaufzeit finden Sie unter Verwenden des Fensters "Aufgaben", "Verwenden des Fensters "Parallele Stapel" und "Exemplarische Vorgehensweise: Debuggen einer parallelen Anwendung".

Wann nicht von OpenMP zur Parallelitätslaufzeit migriert werden soll

In den folgenden Fällen wird beschrieben, wann es möglicherweise nicht geeignet ist, vorhandenen OpenMP-Code zu migrieren, um die Parallelitätslaufzeit zu verwenden.

Fälle Erklärung
Ihre Anwendung erfüllt bereits Ihre Anforderungen. Wenn Sie mit der Anwendungsleistung und der aktuellen Debuggingunterstützung zufrieden sind, ist die Migration möglicherweise nicht geeignet.
Ihre parallelen Schleifenkörper führen wenig Arbeit durch. Der Aufwand für den Taskplaner "Concurrency Runtime" kann die Vorteile der Parallelausführung des Schleifentexts möglicherweise nicht überwinden, insbesondere, wenn der Schleifentext relativ klein ist.
Ihre Bewerbung ist in C geschrieben. Da die Parallelitäts-Runtime viele C++-Features verwendet, ist sie möglicherweise nicht geeignet, wenn Sie keinen Code schreiben können, der es der C-Anwendung ermöglicht, sie vollständig zu verwenden.

Vorgehensweise: Konvertieren einer parallel-for-Schleife in OpenMP zur Verwendung der Concurrency Runtime

Bei einer einfachen Schleife, die die OpenMP-Parallele und für Direktiven verwendet, wird veranschaulicht, wie sie in die Verwendung der Concurrency Runtime-Parallelität::p arallel_for-Algorithmus konvertiert wird.

Vorgehensweise: Konvertieren einer OpenMP-Schleife mit Abbruch zur Verwendung der Concurrency Runtime
Bei einer OpenMP-Parallele für Schleife, für die nicht alle Iterationen ausgeführt werden müssen, wird veranschaulicht, wie sie in die Verwendung des Abbruchmechanismus für Parallelitätslaufzeit konvertiert wird.

Vorgehensweise: Konvertieren einer OpenMP-Schleife, in der die Ausnahmebehandlung verwendet wird, zur Verwendung der Concurrency Runtime
Bei einer OpenMP-Parallele für Schleife, die eine Ausnahmebehandlung durchführt, wird veranschaulicht, wie sie in die Verwendung des Ausnahmebehandlungsmechanismus für Parallelitäts-Runtime konvertiert wird.

Vorgehensweise: Konvertieren einer OpenMP-Schleife, in der eine reduction-Variable verwendet wird, zur Verwendung der Concurrency Runtime
Bei einer OpenMP-Parallele für Schleife, die die Reduktionsklausel verwendet, wird veranschaulicht, wie sie in die Verwendung der Concurrency Runtime konvertiert wird.

Siehe auch

Concurrency Runtime
OpenMP
Parallel Patterns Library (PPL)
Asynchrone Agents Library