• Aucun résultat trouvé

Modélisation du programme parallèle : précédence versus flot de données 78

précédence versus flot de données

Le modèle de programme le plus couramment employé par les algorithmes d’ordon-nancement est le graphe de précédence G = (V;E). Les nœuds de ce graphe sont des tâches (une tâche est une séquence d’instructions élémentaires) et les arcs de ce graphe re-présentent les précédences entre ces tâches. Généralement, une précédence(u;v)indique que l’exécution de la tâchevnécessite des résultats produits par la tâcheu. Les tâches de ce graphe peuvent être annotées par leur coût d’exécution. De même les arcs peuvent être annotés par une valeur ; la valeur de l’arc(u;v)peut correspondre par exemple selon le modèle de machine considéré au volume de données communiqué entreuetv, ou encore au délai nécessaire pour communiquer ces données entreuetv.

Ce graphe de précédence, une fois annoté par des coûts sur les arcs, peut être consi-déré comme un graphe de flot de données. Cependant, il ne permet pas de représenter complètement les diffusions et les réductions de données entre tâches. Par exemple, une diffusion d’une donnée produite par la tâche u vers les tâches v

1 ;:::;v

l est représenté par l arcs. Même si les tâches v

1 ;:::;v

l sont exécutées sur un même nœud, ce graphe modélise toujourslcommunications de la donnée produite paru. Or cela n’est pas

néces-Modélisation du programme parallèle : précédence versus flot de données 5.3 sairement le cas si le modèle d’exécution utilise un mécanisme de cache des données sur chaque processeur comme le fait par exemple le modèle d’exécution d’Athapascan-1.

Au contraire, le graphe de flot de données présenté dans la section 4.2 page 56 permet de représenter plus précisément les opérations de diffusion et de réduction des données. Il est donc plus précis pour modéliser un programme Athapascan-1.

Par ailleurs, le graphe de précédence se déduit directement du graphe de flot de don-nées en considérant le sous graphe constitué des noeuds tâches et des arcs entre les noeuds tâchest

i ett

j si un ou plusieurs flot de données vont det iàt

j.

5.3.1 Grandeurs caractéristiques d’un graphe de flot de

données

Les notations suivantes seront utilisées dans la suite du chapitre pour caractériser le flot de données G défini dans la section 4.2 page 56 et qui modélise l’exécution d’un programme parallèle [110] :

n: désigne le nombre de tâches créées, donc le nombre de tâches du graphe.

n

d: désigne le nombre total d’objets partagés passés en paramètre de tâches, autrement dit la somme des degrés des nœuds tâches du graphe (en ne comptant pas les arcs représentant les créations de tâches).

T

1: désigne le temps séquentiel d’exécution des tâches du graphe, c’est-à-dire la somme des coûts d’exécution de chaque tâche.

T

1: désigne le temps d’exécution d’un plus long chemin du graphe de flot de données dans lequel le coût des communications est ignoré. C’est aussi une borne inférieure sur le temps d’exécution du graphe, sur un nombre infini de processeurs en ignorant les communications (modèle PRAM).

C

1: désigne la somme des volumes de données accédées par chacune des tâches.

C

max: désigne le nombre maximum de données communiquées sur un chemin du graphe.

C max

: désigne le nombre maximum de données communiquées sur un chemin du graphe

G 0

identique au grapheGsi ce n’est que pour chaque tâche, le volume de données entrant par un arc dans cette tâche est aligné sur le plus grand volume de données entrant dans cette tâche. Cette caractéristique du graphe sera utilisée à la place de

C

5.3.2 Degré de connaissance du graphe de flot de données à

l’exécution

À un instant donné de l’exécution d’une application, le système chargé de l’exécution dispose du graphe de flot de données décrivant les tâches créées et non encore exécutées. Le graphe représentant l’exécution a posteriori n’est donc pas entièrement connu avant la fin de l’exécution. Ainsi, suivant le type d’application, une partie plus ou moins grande de ce graphe peut être connue à un instant donné.

Par ailleurs, le graphe connu par le système à un instant donné de l’exécution peut être annoté par des informations fournies par le programmeur. Par exemple, dans le cas d’un programme Athapascan-1, nous avons vu dans la section 3.1.6 page 46 que l’utilisateur pouvait indiquer, lors de la création d’une tâche, une estimation de son coût ou bien une fonction permettant d’évaluer son coût en fonction de la taille de ces paramètres.

Le degré de connaissance du graphe, à un instant donné de l’exécution, est alors très variable :

1. La structure du graphe :

– Structure connue : Si seule la tâche racine génère d’autres tâches, alors la structure du graphe de flot de données est entièrement connue à la fin de l’exé-cution de la tâche racine. C’est par exemple le cas du programme d’élimina-tion de Gauss par colonnes vu dans la secd’élimina-tion 3.2.2 page 49.

– Structure inconnue : L’ensemble des tâches est créé au fur et à mesure du déroulement de l’exécution. C’est par exemple le cas d’un programme créant récursivement des tâches comme l’exemple du calcul dun

èmeterme de la suite de Fibonacci vu dans la section 3.2.1 page 48.

– Structure caractérisée : L’utilisateur fournit, en début d’exécution, une infor-mation caractérisant la structure du graphe. La structure peut par exemple être un arbre, un arbre binaire, un graphe de type série-parallèle.

2. Une estimation du coût des tâches :

– Coût connu à la création : Une estimation du coût des tâches est donnée lors de leurs créations.

– Coût connu lorsque la tâche est prête : Une estimation du coût des tâches est obtenue lorsqu’elles deviennent prêtes, via un calcul sur leurs paramètres effectifs.

– Coût inconnu : Aucune estimation du coût des tâches n’est donnée. 3. Une estimation de la taille des objets partagés :

– Taille connue à la création de l’objet : Une estimation de la taille des objets partagés est donnée lors de leur création. Cette taille étant supposée constante

Algorithmes d’ordonnancement 5.4 pendant l’exécution ; i.e. les tâches modifiant un objet partagé ne modifient pas sa taille.

– Taille connue après chaque modification de l’objet : Une estimation de la taille est donnée pour chaque valeur prise par un objet partagé. Une telle estimation peut par exemple être fournie lors de chaque modification de l’objet partagé. – Taille inconnue : La taille d’une valeur d’un objet partagé ne peut pas être

estimée (où plutôt, le programmeur n’a pas fourni cette estimation lors de la modification de l’objet).

Ce degré d’information connue à l’exécution sur le graphe est très variable et dépend du programme ; nous allons cependant voir que cette connaissance influence la manière dont le programme pourra être ordonnancé.