Partager via


Migration d'OpenMP au runtime d'accès concurrentiel

Le runtime d’accès concurrentiel accepte divers modèles de programmation. Ces modèles peuvent chevaucher ou compléter les modèles d’autres bibliothèques. Les documents de cette section comparent OpenMP au runtime d’accès concurrentiel et fournissent des exemples sur la migration du code OpenMP existant pour utiliser le runtime d’accès concurrentiel.

Le modèle de programmation OpenMP est défini par une norme ouverte et a des liaisons bien définies aux langages de programmation C/C++ et Fortran. OpenMP versions 2.0 et 2.5, prises en charge par le compilateur Microsoft C++, conviennent parfaitement aux algorithmes parallèles itératifs ; autrement dit, ils effectuent une itération parallèle sur un tableau de données. OpenMP 3.0 prend en charge les tâches non itératives en plus des tâches itératives.

OpenMP montre une efficacité optimale quand le degré de parallélisme est prédéterminé et correspond aux ressources disponibles sur le système. Le modèle OpenMP est une correspondance particulièrement correcte pour le calcul hautes performances, où des problèmes de calcul très volumineux sont répartis entre les ressources de traitement d’un ordinateur. Dans ce scénario, l’environnement matériel est généralement fixe et le développeur peut raisonnablement s’attendre à avoir un accès exclusif à toutes les ressources informatiques lorsque l’algorithme est exécuté.

Toutefois, les environnements informatiques moins contraints peuvent ne pas être une bonne correspondance pour OpenMP. Par exemple, les problèmes récursifs (tels que l’algorithme de tri rapide ou la recherche d’une arborescence de données) sont plus difficiles à implémenter à l’aide d’OpenMP 2.0 et 2.5. Le runtime d’accès concurrentiel complète les fonctionnalités d’OpenMP en fournissant la bibliothèque d’agents asynchrones et la bibliothèque de modèles parallèles (PPL). La bibliothèque d’agents asynchrones prend en charge le parallélisme des tâches grossières ; ppL prend en charge des tâches parallèles plus précises. Le runtime d’accès concurrentiel fournit l’infrastructure nécessaire pour effectuer des opérations en parallèle afin que vous puissiez vous concentrer sur la logique de votre application. Toutefois, étant donné que le runtime d’accès concurrentiel permet un large éventail de modèles de programmation, sa surcharge de planification peut être supérieure à d’autres bibliothèques d’accès concurrentiel telles que OpenMP. Par conséquent, nous vous recommandons de tester les performances de manière incrémentielle lorsque vous convertissez votre code OpenMP existant pour utiliser le runtime d’accès concurrentiel.

Quand migrer d’OpenMP vers le runtime d’accès concurrentiel

Il peut être avantageux de migrer du code OpenMP existant pour utiliser le runtime d’accès concurrentiel dans les cas suivants.

Incidents Avantages du runtime d’accès concurrentiel
Vous avez besoin d’une infrastructure de programmation simultanée extensible. La plupart des fonctionnalités du runtime d’accès concurrentiel peuvent être étendues. Vous pouvez également combiner des fonctionnalités existantes pour en composer de nouvelles. Étant donné que OpenMP s’appuie sur des directives du compilateur, il ne peut pas être facilement étendu.
Votre application tirerait parti du blocage coopératif. Lorsqu’une tâche se bloque, car elle nécessite une ressource qui n’est pas encore disponible, le runtime d’accès concurrentiel peut effectuer d’autres tâches pendant que la première tâche attend la ressource.
Votre application tirerait parti de l’équilibrage de charge dynamique. Le runtime d’accès concurrentiel utilise un algorithme de planification qui ajuste l’allocation des ressources informatiques à mesure que les charges de travail changent. Dans OpenMP, lorsque le planificateur alloue des ressources informatiques à une région parallèle, ces allocations de ressources sont corrigées tout au long du calcul.
Vous avez besoin d’une prise en charge de la gestion des exceptions. Le PPL vous permet d’intercepter les exceptions à l’intérieur et à l’extérieur d’une région ou d’une boucle parallèle. Dans OpenMP, vous devez gérer l’exception à l’intérieur de la région ou de la boucle parallèle.
Vous avez besoin d’un mécanisme d’annulation. Le PPL permet aux applications d’annuler des tâches individuelles et des arborescences parallèles de travail. OpenMP nécessite que l’application implémente son propre mécanisme d’annulation.
Vous avez besoin d’un code parallèle pour se terminer dans un contexte différent à partir duquel il démarre. Le runtime d’accès concurrentiel vous permet de démarrer une tâche dans un contexte, puis d’attendre ou d’annuler cette tâche dans un autre contexte. Dans OpenMP, tout le travail parallèle doit se terminer dans le contexte à partir duquel il démarre.
Vous avez besoin d’une prise en charge améliorée du débogage. Visual Studio fournit les fenêtres Stacks parallèles et Tâches parallèles pour vous permettre de déboguer plus facilement des applications multithread.

Pour plus d’informations sur la prise en charge du débogage pour le runtime d’accès concurrentiel, consultez Utilisation de la fenêtre Tâches, utilisation de la fenêtre Stacks parallèles et procédure pas à pas : débogage d’une application parallèle.

Quand ne pas migrer d’OpenMP vers le runtime d’accès concurrentiel

Les cas suivants décrivent quand il peut ne pas être approprié de migrer le code OpenMP existant pour utiliser le runtime d’accès concurrentiel.

Incidents Explication
Votre application répond déjà à vos besoins. Si vous êtes satisfait des performances des applications et de la prise en charge actuelle du débogage, la migration peut ne pas être appropriée.
Vos corps de boucles parallèles effectuent peu de travail. La surcharge du planificateur de tâches du runtime concurrentiel peut ne pas surmonter les avantages de l’exécution du corps de la boucle en parallèle, en particulier lorsque le corps de la boucle est relativement petit.
Votre application est écrite en C. Étant donné que le runtime d’accès concurrentiel utilise de nombreuses fonctionnalités C++, il peut ne pas convenir lorsque vous ne pouvez pas écrire de code qui permet à l’application C de l’utiliser entièrement.

Guide pratique pour convertir une boucle OpenMP parallèle pour utiliser le runtime d’accès concurrentiel

Étant donné une boucle de base qui utilise le parallèle OpenMP et pour les directives, montre comment la convertir pour utiliser l’accès concurrentiel du runtime concurrentiel ::p arallel_for algorithm.

Guide pratique pour convertir une boucle OpenMP qui a recours à l’annulation pour utiliser le runtime d’accès concurrentiel
Étant donné une boucle OpenMP parallèlepour laquelle toutes les itérations ne doivent pas s’exécuter, montre comment la convertir pour utiliser le mécanisme d’annulation du runtime d’accès concurrentiel.

Guide pratique pour convertir une boucle OpenMP qui a recours à la gestion des exceptions pour utiliser le runtime d’accès concurrentiel
Étant donné une boucle OpenMP parallèlefor qui effectue la gestion des exceptions, montre comment la convertir pour utiliser le mécanisme de gestion des exceptions du runtime d’accès concurrentiel.

Guide pratique pour convertir une boucle OpenMP qui a recours à une variable de réduction pour utiliser le runtime d’accès concurrentiel
Étant donné une boucle OpenMP parallèlefor qui utilise la clause de réduction, montre comment la convertir pour utiliser le runtime d’accès concurrentiel.

Voir aussi

Concurrency Runtime
OpenMP
Bibliothèque de modèles parallèles
Bibliothèque d’agents asynchrones