En informatique , l' opérateur de réduction est un type d' opérateur couramment utilisé en programmation parallèle pour réduire les éléments d'un tableau à un seul résultat. Les...
Worldlex WikiFrancaisLecture gratuite
En informatique , l' opérateur de réduction est un type d' opérateur couramment utilisé en programmation parallèle pour réduire les éléments d'un tableau à un seul résultat. Les opérateurs de réduction sont associatifs et souvent (mais pas nécessairement) commutatifs . La réduction d'ensembles d'éléments est une composante essentielle de modèles de programmation tels que MapReduce , où un opérateur de réduction est appliqué ( mappé ) à tous les éléments avant leur réduction. D'autres algorithmes parallèles utilisent les opérateurs de réduction comme opérations principales pour résoudre des problèmes plus complexes. De nombreux opérateurs de réduction peuvent être utilisés pour la diffusion afin de distribuer des données à tous les processeurs.
Théorie
Un opérateur de réduction permet de décomposer une tâche en plusieurs sous-tâches en calculant des résultats partiels qui servent à obtenir un résultat final. Il permet d'exécuter certaines opérations séquentielles en parallèle et de réduire le nombre d'étapes nécessaires à ces opérations. L'opérateur de réduction stocke le résultat des sous-tâches dans une copie privée de la variable. Ces copies privées sont ensuite fusionnées en une copie partagée à la fin.
Un opérateur est un opérateur de réduction si :
Il peut réduire un tableau à une seule valeur scalaire.
Le résultat final devrait pouvoir être obtenu à partir des résultats des tâches partielles qui ont été créées.
Ces deux conditions sont satisfaites pour les opérateurs commutatifs et associatifs appliqués à tous les éléments du tableau.
Parmi les opérateurs qui satisfont à ces exigences, on peut citer l'addition, la multiplication et certains opérateurs logiques (et, ou, etc.).
Un opérateur de réduction
Exemple
Supposons que nous ayons un tableauLa somme de ce tableau peut être calculée séquentiellement en réduisant successivement le tableau à une seule somme à l'aide de l'opérateur « + ». En commençant la sommation au début du tableau, on obtient : L'opérateur « + » étant commutatif et associatif, il s'agit d'un opérateur de réduction. Cette réduction peut donc être effectuée en parallèle sur plusieurs cœurs : chaque cœur calcule la somme d'un sous-ensemble du tableau, et l'opérateur de réduction fusionne les résultats. L'utilisation d'une réduction par arbre binaire permettrait à 4 cœurs d'effectuer le calcul.,,, etDeux cœurs peuvent alors effectuer des calculs.et, et enfin un seul cœur calculeDonc, un total de 4 cœurs peuvent être utilisés pour calculer la somme.marches au lieu desétapes requises pour la version séquentielle. Cette technique d'arbre binaire parallèle calculeBien sûr, le résultat est le même, mais uniquement grâce à l'associativité de l'opérateur de réduction. La commutativité de cet opérateur serait importante s'il existait un cœur maître distribuant le travail à plusieurs processeurs, car les résultats pourraient alors lui revenir dans n'importe quel ordre. La propriété de commutativité garantit que le résultat sera identique.
La norme IEEE 754-2019 définit quatre types de réductions de sommes et trois types de réductions de produits mis à l'échelle. Comme il s'agit d'opérateurs de réduction, la norme précise que « les implémentations peuvent être associées dans n'importe quel ordre ou évaluées dans n'importe quel format plus large ».
Contre-exemple
La multiplication matricielle n'est pas un opérateur de réduction car elle n'est pas commutative. Si les processus pouvaient renvoyer leurs résultats de multiplication matricielle dans n'importe quel ordre au processus maître, le résultat final calculé par ce dernier serait probablement incorrect si les résultats arrivaient dans le désordre. Cependant, la multiplication matricielle étant associative, le résultat serait correct à condition de respecter l'ordre des opérations, comme dans la technique de réduction par arbre binaire.
Algorithmes
Algorithmes d'arbres binomiaux
Concernant les algorithmes parallèles, il existe deux principaux modèles de calcul parallèle : la machine à accès aléatoire parallèle (PRAM), extension de la RAM avec mémoire partagée entre les unités de traitement, et l’ ordinateur parallèle synchrone (BSPC) , qui prend en compte la communication et la synchronisation . Ces deux modèles ont des implications différentes sur la complexité temporelle ; par conséquent, deux algorithmes seront présentés.
Algorithme PRAM
Cet algorithme représente une méthode largement répandue pour traiter les entrées oùest une puissance de deux. La procédure inverse est souvent utilisée pour la diffusion d'éléments.
Visualisation de l'algorithme avec p = 8, m = 1 et l'addition comme opérateur de réduction
pouràfaire
pouràfaire en parallèle
siest actif alors
si un peudeest alors défini
ensembleinactif
sinon si
L'opérateur binaire pour les vecteurs est défini élément par élément de telle sorte que
L'algorithme suppose en outre qu'au débutpour tousetest une puissance de deux et utilise les unités de traitementÀ chaque itération, la moitié des unités de traitement deviennent inactives et ne participent plus aux calculs. La figure illustre l'algorithme utilisant l'addition comme opérateur. Les lignes verticales représentent les unités de traitement chargées du calcul des éléments de chaque ligne. Les huit éléments d'entrée sont situés en bas et chaque étape de l'animation correspond à une étape parallèle de l'exécution de l'algorithme. Un processeur actifévalue l'opérateur donné sur l'élémentil détient actuellement etoùest l'indice minimal satisfaisanti j>je{\displaystyle j>i}i , de sorte quedevient un processeur inactif à l'étape actuelle.etne sont pas nécessairement des éléments de l'ensemble d'entréeLes champs sont écrasés et réutilisés pour les expressions précédemment évaluées. Afin de coordonner les rôles des unités de traitement à chaque étape sans provoquer de communication supplémentaire entre elles, les unités de traitement sont indexées par des numéros.àest utilisé. Chaque processeur examine son- le bit de poids faible et décide s'il faut le désactiver ou calculer l'opérateur sur son propre élément et sur l'élément dont l'indice est celui où leLe bit n-ième n'est pas activé. Le schéma de communication sous-jacent de l'algorithme est un arbre binomial, d'où son nom.
Seulement Il conserve le résultat final et est donc le processeur racine. Pour une opération Allreduce , le résultat doit être distribué, ce qui peut être fait en ajoutant une diffusion depuisDe plus, le nombreLe nombre de processeurs est limité à une puissance de deux. Cette limitation peut être levée en complétant le nombre de processeurs à la puissance de deux supérieure. Il existe également des algorithmes plus adaptés à ce cas d'utilisation.
Analyse d'exécution
La boucle principale est exécutée.fois, le temps nécessaire pour la partie effectuée en parallèle est deUne unité de traitement combine deux vecteurs ou devient inactive. Ainsi, le temps parallèlepour la PRAM estLa stratégie de gestion des conflits de lecture et d'écriture peut être aussi restrictive qu'une lecture exclusive et une écriture exclusive (EREW). L'accélérationde l'algorithme estet par conséquent l' efficacité estL'efficacité s'en trouve affectée car la moitié des unités de traitement actives deviennent inactives après chaque étape.Les unités sont actives à l'étape.
Algorithme de mémoire distribuée
Contrairement à l'algorithme PRAM, dans le modèle de mémoire distribuée , la mémoire n'est pas partagée entre les unités de traitement et les données doivent être échangées explicitement entre elles. Par conséquent, les données doivent être échangées explicitement entre les unités, comme on peut le constater dans l'algorithme suivant.
pouràfaire
pouràfaire en parallèle
siest actif alors
si un peudeest alors défini
envoyerà
ensembleinactif
sinon si
recevoir
La seule différence entre l' algorithme distribué et la version PRAM réside dans l'inclusion de primitives de communication explicites ; le principe de fonctionnement reste le même.
Analyse d'exécution
La communication entre les unités engendre une certaine surcharge. Une analyse simple de l'algorithme utilise le modèle BSP et intègre le temps.nécessaire pour initier la communication etle temps nécessaire pour envoyer un octet. Le temps d'exécution résultant est alors :, commeLes éléments d'un vecteur sont envoyés à chaque itération et ont une tailleen tout.
algorithme de pipeline
Visualisation de l'algorithme de pipeline avec p = 5, m = 4 et l'addition comme opérateur de réduction.
Pour les modèles de mémoire distribuée, l'utilisation d'une communication pipelinée peut s'avérer judicieuse. C'est notamment le cas lorsqueest petit par rapport àEn général, les pipelines linéaires divisent les données ou les tâches en éléments plus petits et les traitent par étapes. Contrairement aux algorithmes d'arbre binomial, l'algorithme pipeliné exploite le fait que les vecteurs ne sont pas inséparables, mais que l'opérateur peut être évalué pour des éléments individuels :
pouràfaire
pouràfaire en parallèle
si
envoyerà
si
recevoirdepuis
Il est important de noter que les opérations d'envoi et de réception doivent être exécutées simultanément pour que l'algorithme fonctionne. Le vecteur de résultat est stocké à l'adresse suivante :À la fin, l'animation associée illustre l'exécution de l'algorithme sur des vecteurs de taille quatre avec cinq unités de traitement. Deux étapes de l'animation visualisent une étape d'exécution parallèle.
Analyse d'exécution
Le nombre d'étapes dans l'exécution parallèle est, ça prendétapes jusqu'à ce que la dernière unité de traitement reçoive son premier élément et des éléments supplémentairesjusqu'à ce que tous les éléments soient reçus. Par conséquent, le temps d'exécution dans le modèle BSP est de, en supposant queest la taille totale en octets d'un vecteur.
Bien queayant une valeur fixe, il est possible de regrouper logiquement les éléments d'un vecteur et de le réduire.Par exemple, un problème avec des vecteurs de taille quatre peut être traité en divisant les vecteurs en deux éléments (les deux premiers et les deux derniers), qui sont toujours transmis et calculés ensemble. Dans ce cas, le volume de données transmis à chaque étape est doublé, mais le nombre d'étapes est approximativement divisé par deux. Cela signifie que le paramètreest divisée par deux, tandis que la taille totale en octetsreste inchangé. La durée d'exécutioncar cette approche dépend de la valeur de, qui peut être optimisé sietsont connus. C'est optimal pour, en supposant que cela aboutisse à un plus petitqui divise l'original.
Applications
La réduction est l'une des principales opérations collectives implémentées dans l' interface de passage de messages (MPI) , où les performances de l'algorithme utilisé sont importantes et constamment évaluées pour différents cas d'utilisation. Les opérateurs peuvent être utilisés comme paramètres pour MPI_Reduceet MPI_Allreduce, à la différence que le résultat est disponible sur une seule unité de traitement (racine) ou sur toutes.
OpenMP propose une clause de réduction pour décrire comment les résultats des opérations parallèles sont collectés.
MapReduce s'appuie fortement sur des algorithmes de réduction efficaces pour traiter de grands ensembles de données, même sur d'énormes clusters.
Certains algorithmes de tri parallèle utilisent des réductions pour pouvoir traiter de très grands ensembles de données.