Condividi tramite


Migrazione da OpenMP al runtime di concorrenza

Il runtime di concorrenza consente diversi modelli di programmazione. Questi modelli possono sovrapporsi ai modelli di altre librerie o integrarsi con essi. I documenti di questa sezione confrontano OpenMP con il runtime di concorrenza e forniscono esempi su come eseguire la migrazione del codice OpenMP esistente per usare il runtime di concorrenza.

Il modello di programmazione OpenMP è definito da uno standard aperto e include associazioni ben definite ai linguaggi di programmazione Fortran e C/C++. Le versioni OpenMP 2.0 e 2.5, supportate dal compilatore Microsoft C++, sono adatte per algoritmi paralleli iterativi; ovvero eseguono l'iterazione parallela su una matrice di dati. OpenMP 3.0 supporta attività non iterative oltre alle attività iterative.

OpenMP è molto efficiente quando il grado di parallelismo è predeterminato e corrisponde alle risorse disponibili nel sistema. Il modello OpenMP è una corrispondenza particolarmente valida per il calcolo ad alte prestazioni, in cui i problemi di calcolo molto grandi vengono distribuiti tra le risorse di elaborazione di un computer. In questo scenario, l'ambiente hardware è in genere fisso e lo sviluppatore può ragionevolmente aspettarsi di avere accesso esclusivo a tutte le risorse di calcolo quando viene eseguito l'algoritmo.

Tuttavia, gli ambienti di elaborazione meno vincolati potrebbero non essere una buona corrispondenza per OpenMP. Ad esempio, i problemi ricorsivi ,ad esempio l'algoritmo quicksort o la ricerca di un albero di dati, sono più difficili da implementare usando OpenMP 2.0 e 2.5. Il runtime di concorrenza integra le funzionalità di OpenMP fornendo la libreria degli agenti asincroni e la libreria PPL (Parallel Patterns Library ). La libreria degli agenti asincroni supporta il parallelismo delle attività con granularità grossolana; PPL supporta attività parallele con granularità più fine. Il runtime di concorrenza fornisce l'infrastruttura necessaria per eseguire operazioni in parallelo in modo che sia possibile concentrarsi sulla logica dell'applicazione. Tuttavia, poiché il runtime di concorrenza abilita un'ampia gamma di modelli di programmazione, il sovraccarico di pianificazione può essere maggiore di altre librerie di concorrenza, ad esempio OpenMP. È pertanto consigliabile testare le prestazioni in modo incrementale quando si converte il codice OpenMP esistente per usare il runtime di concorrenza.

Quando eseguire la migrazione da OpenMP al runtime di concorrenza

Può essere vantaggioso eseguire la migrazione di codice OpenMP esistente per usare il runtime di concorrenza nei casi seguenti.

Casi Vantaggi del runtime di concorrenza
È necessario un framework di programmazione simultaneo estendibile. Molte delle funzionalità del runtime di concorrenza possono essere estese. È anche possibile combinare le funzionalità esistenti per crearne delle nuove. Poiché OpenMP si basa sulle direttive del compilatore, non può essere facilmente esteso.
L'applicazione trarrà vantaggio dal blocco cooperativo. Quando un'attività si blocca perché richiede una risorsa non ancora disponibile, il runtime di concorrenza può eseguire altre attività mentre la prima attività attende la risorsa.
L'applicazione trae vantaggio dal bilanciamento del carico dinamico. Il runtime di concorrenza usa un algoritmo di pianificazione che regola l'allocazione delle risorse di calcolo man mano che cambiano i carichi di lavoro. In OpenMP, quando l'utilità di pianificazione alloca le risorse di calcolo a un'area parallela, tali allocazioni di risorse vengono fisse durante il calcolo.
È necessario il supporto per la gestione delle eccezioni. La libreria PPL consente di intercettare le eccezioni sia all'interno che all'esterno di un'area o di un ciclo parallelo. In OpenMP è necessario gestire l'eccezione all'interno dell'area o del ciclo parallelo.
È necessario un meccanismo di annullamento. Il PPL consente alle applicazioni di annullare sia singole attività che alberi paralleli di lavoro. OpenMP richiede all'applicazione di implementare il proprio meccanismo di annullamento.
È necessario che il codice parallelo venga completato in un contesto diverso da cui viene avviato. Il runtime di concorrenza consente di avviare un'attività in un contesto e quindi attendere o annullare l'attività in un altro contesto. In OpenMP tutto il lavoro parallelo deve terminare nel contesto da cui viene avviato.
È necessario un supporto avanzato per il debug. Visual Studio offre le finestre Stack paralleli e Attività parallele in modo da poter eseguire più facilmente il debug di applicazioni multithreading.

Per altre informazioni sul supporto del debug per il runtime di concorrenza, vedere Uso della finestra Attività, Uso della finestra Stack paralleli e Procedura dettagliata: Debug di un'applicazione parallela.

Quando non eseguire la migrazione da OpenMP al runtime di concorrenza

I casi seguenti descrivono quando potrebbe non essere opportuno eseguire la migrazione del codice OpenMP esistente per l'uso del runtime di concorrenza.

Casi Spiegazione
L'applicazione soddisfa già i requisiti. Se si è soddisfatti delle prestazioni dell'applicazione e del supporto del debug corrente, la migrazione potrebbe non essere appropriata.
I corpi del ciclo parallelo eseguono poco lavoro. Il sovraccarico dell'utilità di pianificazione dell'attività runtime di concorrenza potrebbe non superare i vantaggi dell'esecuzione del corpo del ciclo in parallelo, soprattutto quando il corpo del ciclo è relativamente piccolo.
L'applicazione è scritta in C. Poiché il runtime di concorrenza usa molte funzionalità C++, potrebbe non essere adatto quando non è possibile scrivere codice che consenta all'applicazione C di usarla completamente.

Procedura: Convertire un ciclo OpenMP parallel for per l'uso del runtime di concorrenza

Dato un ciclo di base che usa il parallelismo OpenMP e per le direttive , viene illustrato come convertirlo in modo da usare l'algoritmo concurrency runtime di concorrenza::p arallel_for.

Procedura: Convertire un ciclo OpenMP che usa l'annullamento per l'uso del runtime di concorrenza
Dato un ciclo OpenMP parallelofor che non richiede l'esecuzione di tutte le iterazioni, illustra come convertirlo in modo da usare il meccanismo di annullamento del runtime di concorrenza.

Procedura: Convertire un ciclo OpenMP che usa la gestione delle eccezioni per l'uso del runtime di concorrenza
Dato un ciclo OpenMP parallelofor che esegue la gestione delle eccezioni, illustra come convertirlo in modo da usare il meccanismo di gestione delle eccezioni del runtime di concorrenza.

Procedura: Convertire un ciclo OpenMP che usa una variabile di riduzione per l'uso del runtime di concorrenza
Dato un ciclo OpenMP parallelofor che usa la clausola di riduzione , viene illustrato come convertirlo per l'uso del runtime di concorrenza.

Vedi anche

Runtime di concorrenza
OpenMP
PPL (Parallel Patterns Library)
Libreria di agenti asincroni