Les clusters de calculs
Concevoir des programmes distribués
Comprendre le problème et le programme
Concevoir des programmes distribués implique un certain nombre de contraintes et plus particulièrement un certain nombre de questions à se poser:
- Est ce qu'une exécution parallèle de l'application peut apporter un gain de performance ?
- Comment répartir au mieux cette exécution ?
- Les traitements sont ils indépendants ?
- Les données traitées sont elles indépendantes ?
- Quand et pourquoi communiquer ?
- Etc...
Ce sont toutes ces questions qui doivent être prises en compte durant tout le processus de conception d'un programme distribué visant les clusters comme milieux d'exécution.
Parallélisme
La première étape de la conception d'un programme distribué est de déterminer son degré de parallélisation. En effet il est nécessaire de trouver les parties les plus gourmandes en terme de temps de calcul de l'application.
Pour cela, il faut qu'il y ait une certaine indépendance dans le traitement des données:
- soit le traitement sur une partie des données est indépendant du traitement des autres
- soit il existe des tâches qui peuvent être traitées indépendamment des autres
Dans tous les cas le programmeur est responsable du parallélisme des tâches.
Partitionnement
Il s'agit de l'étape la plus importante dans la conception d'un programme parallèle.
Cette étape consiste à découper le problème, soit en terme de données indépendantes, soit en terme de fonctionnalités.
Le gain apporté par la parallélisation va dépendre de cette décomposition.
Il existe deux types de partitionnement :
- décomposition par domaine
- décomposition par fonction
Pour la décomposition par domaine, la donnée associée au problème est décomposée. Chaque tâche travaille sur une portion de donnée indépendante.
Décomposition par domaine
Dans l'approche par décomposition de fonction, la parallélisation vise le calcul qui doit être effectué plutôt que les données manipulées par le calcul.
Ainsi le problème est décomposé suivant le travail devant être effectué et chaque tâche effectue une portion du calcul total.
Décomposition par fonction
Il est tout à fait possible de jumeler ces 2 approches pour augmenter la granularité et l'opportunité de la parallélisation. Toutefois, il faut bien garder à l'esprit que l'efficacité d'une parallélisation va dépendre principalement de ce facteur de décomposition et des dépendances qui lui sont liées.
Communication
Lors de la conception d'un programme parallèle il faut se poser la question : pourquoi et quand communiquer ?
Nous avons vu précédemment quels étaient les différents support réseau disponible et le principe de communication par transmission de messages.
Les communications entre les différents dépendent beaucoup de la tâche à effectuer. La communication est obligatoire lorsque les taches doivent échanger des données et c'est le cas dans la plupart des programmes parallèles : la grande majorité des calculs, pour être menés à bien, ont besoin d'une partie des résultats des autres noeuds voisins.
Les facteurs à considérer sont les coûts de communications car la communication inter-tâches implique des frais généraux : des cycles et des ressources pouvant être employés pour le calcul sont utilisés pour l'empaquetage des données à transmettre.
D'autres facteurs sont la synchronisation qui peut entraîner des temps d'attente et le trafic de communication peut saturer la bande passante du réseau aggravant les performances.
Le programmeur doit être conscient des facteurs affectant la performance durant les communications.
Nous allons voir dans la suite 2 implémentations disponibles pour la gestion de la communication au sein de programmes distribués.