Dela via


Migrera från OpenMP till Concurrency Runtime

Concurrency Runtime möjliggör en mängd olika programmeringsmodeller. Dessa modeller kan överlappa eller komplettera modellerna för andra bibliotek. Dokumenten i det här avsnittet jämför OpenMP med Concurrency Runtime och innehåller exempel på hur du migrerar befintlig OpenMP-kod för att använda Concurrency Runtime.

OpenMP-programmeringsmodellen definieras av en öppen standard och har väldefinierade bindningar till programmeringsspråken Fortran och C/C++. OpenMP-versionerna 2.0 och 2.5, som stöds av Microsoft C++-kompilatorn, passar bra för parallella algoritmer som är iterativa. De utför alltså parallell iteration över en matris med data. OpenMP 3.0 stöder icke-iterativa uppgifter utöver iterativa uppgifter.

OpenMP är mest effektivt när graden av parallellitet är förutbestämd och matchar de tillgängliga resurserna i systemet. OpenMP-modellen är en särskilt bra matchning för databehandling med höga prestanda, där mycket stora beräkningsproblem distribueras över bearbetningsresurserna på en dator. I det här scenariot är maskinvarumiljön vanligtvis fast och utvecklaren kan rimligen förvänta sig att ha exklusiv åtkomst till alla beräkningsresurser när algoritmen körs.

Mindre begränsade databehandlingsmiljöer kanske dock inte är en bra matchning för OpenMP. Rekursiva problem (till exempel snabbsortsalgoritmen eller sökning i ett dataträd) är till exempel svårare att implementera med hjälp av OpenMP 2.0 och 2.5. Concurrency Runtime kompletterar funktionerna i OpenMP genom att tillhandahålla Asynkront agentbibliotek och PPL ( Parallel Patterns Library ). Biblioteket asynkrona agenter stöder grovkornig uppgiftsparallellitet. PPL stöder mer detaljerade parallella uppgifter. Concurrency Runtime tillhandahåller den infrastruktur som krävs för att utföra åtgärder parallellt så att du kan fokusera på logiken i ditt program. Men eftersom Concurrency Runtime möjliggör en mängd olika programmeringsmodeller kan dess schemaläggningskostnader vara större än andra samtidighetsbibliotek som OpenMP. Därför rekommenderar vi att du testar prestanda stegvis när du konverterar din befintliga OpenMP-kod för att använda Concurrency Runtime.

När du ska migrera från OpenMP till Concurrency Runtime

Det kan vara fördelaktigt att migrera befintlig OpenMP-kod för att använda Concurrency Runtime i följande fall.

Ärenden Fördelar med Concurrency Runtime
Du behöver ett utökningsbart ramverk för samtidig programmering. Många av funktionerna i Concurrency Runtime kan utökas. Du kan också kombinera befintliga funktioner för att skapa nya. Eftersom OpenMP förlitar sig på kompilatordirektiv kan det inte enkelt utökas.
Ditt program skulle ha nytta av samarbetsblockering. När en aktivitet blockeras eftersom den kräver en resurs som ännu inte är tillgänglig, kan Concurrency Runtime utföra andra uppgifter medan den första aktiviteten väntar på resursen.
Ditt program skulle ha nytta av dynamisk belastningsutjämning. Concurrency Runtime använder en schemaläggningsalgoritm som justerar allokeringen av beräkningsresurser när arbetsbelastningarna ändras. I OpenMP, när schemaläggaren allokerar beräkningsresurser till en parallell region, korrigeras dessa resursallokeringar under hela beräkningen.
Du behöver stöd för undantagshantering. Med PPL kan du fånga undantag både i och utanför en parallell region eller loop. I OpenMP måste du hantera undantaget i den parallella regionen eller loopen.
Du behöver en annulleringsmekanism. PPL gör det möjligt för program att avbryta både enskilda uppgifter och parallella arbetsträd. OpenMP kräver att programmet implementerar sin egen annulleringsmekanism.
Du behöver parallell kod för att avsluta i en annan kontext som den startar från. Med Concurrency Runtime kan du starta en aktivitet i en kontext och sedan vänta på eller avbryta aktiviteten i en annan kontext. I OpenMP måste allt parallellt arbete slutföras i den kontext som det startar från.
Du behöver utökat felsökningsstöd. Visual Studio tillhandahåller fönstren Parallella staplar och parallella uppgifter så att du enklare kan felsöka flertrådade program.

Mer information om felsökningsstöd för Concurrency Runtime finns i Använda aktivitetsfönstret, Använda fönstret Parallella staplar och Vägledning: Felsökning av en parallell applikation.

När du inte ska migrera från OpenMP till Concurrency Runtime

I följande fall beskrivs när det kanske inte är lämpligt att migrera befintlig OpenMP-kod för att använda Concurrency Runtime.

Ärenden Förklaring
Ditt program uppfyller redan dina krav. Om du är nöjd med programmets prestanda och det aktuella felsökningsstödet kanske migreringen inte är lämplig.
Dina parallella loopkroppar utför lite arbete. Omkostnaderna för Concurrency Runtime-schemaläggaren kanske inte överväger fördelarna med att köra loopens kropp parallellt, särskilt när loopens kropp är relativt liten.
Ditt program är skrivet i C. Eftersom Concurrency Runtime använder många C++-funktioner kanske det inte är lämpligt när du inte kan skriva kod som gör att C-programmet kan använda det fullt ut.

Gör så här: Konvertera en OpenMP parallel for-loop för att använda Concurrency Runtime

Givet en grundläggande loop som använder OpenMP- och for-direktiven, visar hur du konverterar den för att använda concurrency::parallel_for-algoritmen från Concurrency Runtime.

Gör så här: Konvertera en OpenMP-loop som använder annullering för att använda Concurrency Runtime
Givet en OpenMP parallelfor-loop som inte kräver att alla iterationer körs, visar hur man konverterar den för att använda avbrytningsmekanismen i Concurrency Runtime.

Gör så här: Konvertera en OpenMP-loop som använder undantagshantering till att använda Concurrency Runtime
Givet en OpenMP parallellför-loop som hanterar undantag, vilket visar hur du konverterar den till att använda undantagshanteringsmekanismen i Concurrency Runtime.

Gör så här: Konvertera en OpenMP-loop som använder en reduktionsvariabel till att använda Concurrency Runtime
Givet en OpenMP-parallellför -loop som använder reduce-satsen visar hur du konverterar den till att använda Concurrency Runtime.

Se även

Samtidighetskörning
OpenMP
PPL (Parallel Patterns Library)
Asynkront agentbibliotek