Delen via


Migreren van OpenMP naar de Gelijktijdigheidsruntime

De Gelijktijdigheidsruntime maakt verschillende programmeermodellen mogelijk. Deze modellen kunnen de modellen van andere bibliotheken overlappen of aanvullen. De documenten in deze sectie vergelijken OpenMP met de Gelijktijdigheidsruntime en geven voorbeelden over het migreren van bestaande OpenMP-code om de Gelijktijdigheidsruntime te gebruiken.

Het OpenMP-programmeermodel wordt gedefinieerd door een open standaard en heeft goed gedefinieerde bindingen met de programmeertalen Fortran en C/C++. OpenMP-versies 2.0 en 2.5, die worden ondersteund door de Microsoft C++-compiler, zijn geschikt voor parallelle algoritmen die iteratief zijn; Dat wil gezegd, ze voeren parallelle iteratie uit op een matrix met gegevens. OpenMP 3.0 ondersteunt niet-iteratieve taken naast iteratieve taken.

OpenMP is het meest efficiënt wanneer de mate van parallelle uitvoering vooraf wordt bepaald en overeenkomt met de beschikbare resources in het systeem. Het OpenMP-model is een bijzonder goede overeenkomst voor high-performance computing, waarbij zeer grote rekenproblemen worden gedistribueerd over de verwerkingsresources van één computer. In dit scenario is de hardwareomgeving over het algemeen vast en kan de ontwikkelaar redelijkerwijs exclusieve toegang tot alle computerresources verwachten wanneer het algoritme wordt uitgevoerd.

Minder beperkte computeromgevingen passen echter mogelijk niet goed bij OpenMP. Recursieve problemen (zoals het quicksort-algoritme of het doorzoeken van een gegevensstructuur) zijn bijvoorbeeld moeilijker te implementeren met behulp van OpenMP 2.0 en 2.5. De Gelijktijdigheidsruntime vormt een aanvulling op de mogelijkheden van OpenMP door de Asynchrone agents-bibliotheek en de PPL ( Parallel Patterns Library ) te bieden. De Asynchrone agentsbibliotheek biedt ondersteuning voor grofkorrelige taakparallelisme; de PPL ondersteunt fijnere parallelle taken. De Gelijktijdigheidsruntime biedt de infrastructuur die nodig is om bewerkingen parallel uit te voeren, zodat u zich kunt richten op de logica van uw toepassing. Omdat concurrency Runtime echter verschillende programmeermodellen mogelijk maakt, kan de planningsoverhead groter zijn dan andere gelijktijdigheidsbibliotheken, zoals OpenMP. Daarom raden we u aan om de prestaties stapsgewijs te testen wanneer u uw bestaande OpenMP-code converteert om de Gelijktijdigheidsruntime te gebruiken.

Wanneer migreert u van OpenMP naar de Gelijktijdigheidsruntime

Het kan handig zijn om bestaande OpenMP-code te migreren om in de volgende gevallen de Gelijktijdigheidsruntime te gebruiken.

Gevallen Voordelen van de Gelijktijdigheidsruntime
U hebt een uitbreidbaar gelijktijdig programmeerframework nodig. Veel van de functies in de Gelijktijdigheidsruntime kunnen worden uitgebreid. U kunt ook bestaande functies combineren om nieuwe functies op te stellen. Omdat OpenMP afhankelijk is van compilerrichtlijnen, kan het niet eenvoudig worden uitgebreid.
Uw toepassing profiteert van coöperatieve blokkering. Wanneer een taak wordt geblokkeerd omdat er een resource is vereist die nog niet beschikbaar is, kan de Gelijktijdigheidsruntime andere taken uitvoeren terwijl de eerste taak wacht op de resource.
Uw toepassing profiteert van dynamische taakverdeling. De Gelijktijdigheidsruntime maakt gebruik van een planningsalgoritme waarmee de toewijzing van rekenresources wordt aangepast wanneer workloads veranderen. Wanneer in OpenMP rekenresources worden toegewezen aan een parallelle regio, worden deze resourcetoewijzingen tijdens de berekening vastgezet.
U hebt ondersteuning voor het afhandelen van uitzonderingen nodig. Met de PPL kunt u uitzonderingen zowel binnen als buiten een parallelle regio of lus ondervangen. In OpenMP moet u de uitzondering in de parallelle regio of lus afhandelen.
U hebt een annuleringsmechanisme nodig. Met de PPL kunnen toepassingen zowel afzonderlijke taken als parallelle werkstructuren annuleren. OpenMP vereist dat de toepassing een eigen annuleringsmechanisme implementeert.
U hebt parallelle code nodig om te voltooien in een andere context van waaruit deze wordt gestart. Met de Gelijktijdigheidsruntime kunt u een taak in één context starten en vervolgens wachten of annuleren in een andere context. In OpenMP moet al het parallelle werk worden voltooid in de context van waaruit deze wordt gestart.
U hebt uitgebreide ondersteuning voor foutopsporing nodig. Visual Studio biedt het Parallel Stacks-venster en het Parallelle Taken-venster, zodat u eenvoudiger fouten in toepassingen met meerdere threads kunt opsporen.

Voor meer informatie over foutopsporingsondersteuning voor de gelijktijdigheidsruntime, gebruik het venster Taken, het venster Parallelle Stacks, en Walkthrough: Fouten opsporen in een parallelle toepassing.

Wanneer je niet moet migreren van OpenMP naar de Gelijktijdigheidsruntime

In de volgende gevallen wordt beschreven wanneer het mogelijk niet geschikt is om bestaande OpenMP-code te migreren om de Gelijktijdigheidsruntime te gebruiken.

Gevallen Uitleg
Uw toepassing voldoet al aan uw vereisten. Als u tevreden bent over de prestaties van toepassingen en de huidige ondersteuning voor foutopsporing, is migratie mogelijk niet geschikt.
Uw parallelle luslichamen voeren weinig werk uit. De overhead van de Concurrency Runtime-taakplanner weegt mogelijk niet op tegen de voordelen van het parallel uitvoeren van het luslichaam, vooral wanneer de hoofdtekst van de lus relatief klein is.
Uw toepassing is geschreven in C. Omdat de Gelijktijdigheidsruntime veel C++-functies gebruikt, is deze mogelijk niet geschikt wanneer u geen code kunt schrijven waarmee de C-toepassing deze volledig kan gebruiken.

Procedure: Een OpenMP-parallelle for-lus converteren om de Gelijktijdigheidsruntime te gebruiken

Gezien een eenvoudige lus die gebruikmaakt van OpenMP parallel en for directives, laat u zien hoe u deze converteert voor het gebruik van de Concurrency Runtime concurrency::parallel_for-algoritme.

Procedure: Een OpenMP-lus converteren die gebruikmaakt van annulering om de gelijktijdigheidsruntime te gebruiken
Wanneer u een OpenMP parallelfor-lus heeft waarbij niet alle iteraties hoeven te worden uitgevoerd, wordt gedemonstreerd hoe u deze kunt omzetten om het annuleringsmechanisme van de Concurrency Runtime te gebruiken.

Procedure: Een OpenMP-lus converteren die gebruikmaakt van uitzonderingsafhandeling om de gelijktijdigheidsruntime te gebruiken
Gegeven een OpenMPfor-lus die uitzonderingsafhandeling uitvoert, wordt gedemonstreerd hoe deze kan worden geconverteerd om het Concurrency Runtime-uitzonderingsafhandelingsmechanisme te gebruiken.

Procedure: Een OpenMP-lus converteren die gebruikmaakt van een beperkingsvariabele om de gelijktijdigheidsruntime te gebruiken
Gezien een OpenMP-parallellefor-lus die gebruikmaakt van de reductiecomponent, demonstreert u hoe u deze converteert om gebruik te maken van de Gelijktijdigheidsruntime.

Zie ook

Gelijktijdigheidsruntime
OpenMP
Bibliotheek met parallelle patronen (PPL)
Bibliotheek met asynchrone agents