Migrace z OpenMP do Concurrency Runtime

Concurrency Runtime umožňuje různé programovací modely. Tyto modely se můžou překrývat nebo doplňují modely jiných knihoven. Dokumenty v této části porovnávají OpenMP s modulem Concurrency Runtime a poskytují příklady migrace existujícího kódu OpenMP pro použití modulu Concurrency Runtime.

Programovací model OpenMP je definován otevřeným standardem a má dobře definované vazby k programovacím jazykům Fortran a C/C++. OpenMP verze 2.0 a 2.5, které jsou podporovány kompilátorem jazyka Microsoft C++, jsou vhodné pro paralelní algoritmy, které jsou iterativní; to znamená, že provádějí paralelní iteraci nad polem dat. OpenMP 3.0 kromě iterativních úkolů podporuje i jiné než iterativní úkoly.

OpenMP je nejúčinnější, když je předem určen stupeň paralelismu a odpovídá dostupným prostředkům v systému. Model OpenMP je obzvláště vhodný pro vysokovýkonné výpočetní prostředí, kde jsou velmi velké výpočetní problémy distribuovány napříč výpočetními prostředky jednoho počítače. V tomto scénáři je hardwarové prostředí obecně pevné a vývojář může při spuštění algoritmu přiměřeně očekávat výhradní přístup ke všem výpočetním prostředkům.

Méně omezená výpočetní prostředí ale nemusí být pro OpenMP vhodná. Například rekurzivní problémy (například algoritmus quicksort nebo vyhledávání stromu dat) jsou obtížnější implementovat pomocí OpenMP 2.0 a 2.5. Concurrency Runtime doplňuje funkce OpenMP tím, že poskytuje knihovnu asynchronních agentů a knihovnu PPL (Parallel Patterns Library ). Knihovna asynchronních agentů podporuje hrubě odstupňovaný paralelismus úloh; PPL podporuje jemněji odstupňované paralelní úlohy. Concurrency Runtime poskytuje infrastrukturu, která je nutná k paralelnímu provádění operací, abyste se mohli soustředit na logiku aplikace. Vzhledem k tomu, že concurrency Runtime umožňuje různé programovací modely, může být režie plánování větší než jiné knihovny souběžnosti, jako je OpenMP. Proto doporučujeme, abyste při převodu existujícího kódu OpenMP na používání modulu Concurrency Runtime provedli přírůstkové testování výkonu.

Kdy migrovat z OpenMP na Concurrency Runtime

Může být výhodné migrovat stávající kód OpenMP tak, aby používal Concurrency Runtime v následujících případech.

Případy Výhody modulu Concurrency Runtime
Potřebujete rozšiřitelnou souběžnou programovací architekturu. Mnoho funkcí v modulu Concurrency Runtime je možné rozšířit. Můžete také zkombinovat existující funkce a vytvářet nové funkce. Vzhledem k tomu, že OpenMP spoléhá na direktivy kompilátoru, nelze jej snadno rozšířit.
Vaše aplikace by byla přínosná z blokování spolupráce. Pokud úkol blokuje, protože vyžaduje prostředek, který ještě není k dispozici, může modul Concurrency Runtime provádět další úlohy, zatímco první úkol čeká na zdroj.
Vaše aplikace by byla přínosná z dynamického vyrovnávání zatížení. Concurrency Runtime používá algoritmus plánování, který upravuje přidělování výpočetních prostředků při změně úloh. Když plánovač v OpenMP přiděluje výpočetní prostředky do paralelní oblasti, jsou tyto přidělení prostředků v průběhu výpočtu pevné.
Vyžadujete podporu zpracování výjimek. PPL umožňuje zachytit výjimky uvnitř i mimo paralelní oblast nebo smyčku. V OpenMP musíte zpracovat výjimku uvnitř paralelní oblasti nebo smyčky.
Vyžadujete mechanismus zrušení. PPL umožňuje aplikacím zrušit jednotlivé úlohy i paralelní stromy práce. OpenMP vyžaduje, aby aplikace implementovala vlastní mechanismus zrušení.
Vyžadujete, aby se paralelní kód dokončil v jiném kontextu, ze kterého začíná. Concurrency Runtime umožňuje spustit úlohu v jednom kontextu a pak počkat nebo zrušit tuto úlohu v jiném kontextu. V OpenMP musí být veškerá paralelní práce dokončena v kontextu, ze kterého začíná.
Vyžadujete vylepšenou podporu ladění. Visual Studio poskytuje okna paralelních zásobníků a paralelních úloh, abyste mohli snadněji ladit vícevláknové aplikace.

Další informace o podpoře ladění modulu Concurrency Runtime naleznete v tématu Použití okna Úlohy, Použití okna Paralelní zásobníky a Návod: Ladění paralelní aplikace.

Kdy nemigrovat z OpenMP na Concurrency Runtime

Následující případy popisují, kdy nemusí být vhodné migrovat existující kód OpenMP pro použití modulu Concurrency Runtime.

Případy Vysvětlení
Vaše aplikace už splňuje vaše požadavky. Pokud jste spokojení s výkonem aplikace a aktuální podporou ladění, nemusí být migrace vhodná.
Vaše paralelní těla smyčky provádějí malou práci. Režie plánovače úloh Concurrency Runtime nemusí překonat výhody paralelního provádění těla smyčky, zejména pokud je tělo smyčky relativně malé.
Vaše aplikace je napsaná v jazyce C. Vzhledem k tomu, že Concurrency Runtime používá mnoho funkcí jazyka C++, nemusí být vhodné, pokud nemůžete napsat kód, který aplikaci jazyka C plně používá.

Postupy: Převedení paralelní smyčky for v OpenMP na využití modulu Concurrency Runtime

Vzhledem k základní smyčce, která používá paralelně OpenMP a direktivy, ukazuje, jak ho převést na použití concurrency Runtime concurrency::p arallel_for algorithm.

Postupy: Převedení smyčky OpenMP využívající zrušení na využití modulu Concurrency Runtime
Vzhledem k paralelní smyčce OpenMP, která nevyžaduje spuštění všech iterací, ukazuje, jak ji převést na použití mechanismu zrušení modulu Concurrency Runtime.

Postupy: Převedení smyčky OpenMP využívající zpracování výjimek na využití modulu Concurrency Runtime
Vzhledem k paralelní smyčceOpenMP pro smyčku, která provádí zpracování výjimek, ukazuje, jak ji převést na použití mechanismu zpracování výjimek Concurrency Runtime.

Postupy: Převedení smyčky OpenMP využívající redukční proměnnou na využití modulu Concurrency Runtime
Vzhledem k paralelní smyčceOpenMP, která používá klauzuli redukce, ukazuje, jak ji převést na použití Concurrency Runtime.

Viz také

Concurrency Runtime
OpenMP
Knihovna PPL (Parallel Patterns Library)
Knihovna asynchronních agentů