Ecole Polytechnique






Cours : ``Parallélisme''
Travaux dirigés
E. Goubault & M. Martel

TDs 1 et 2

8 et 15 janvier 2002




1  Démarrage de threads simples

Question
Faire un programme JAVA qui démarre deux threads: Pour ce faire, il faut créer deux classes (une par processus) qui chacune sont des sous-classes de Thread, et une autre classe qui contient un main lançant les deux processus. L'entier en mémoire partagée sera en fait une ``classe enveloppante'' pour les entiers, on pourra utiliser par exemple la classe suivante:

public class UnEntier {
    int val;
    
    public UnEntier(int x) {
        val = x;
    }

    public int intValue() {
        return val;
    }

    public void setValue(int x) {
        val = x;
    }
}

2  Threads récursifs: Fibonacci

Question
Ecrire un calcul de la fonction f de Fibonacci, définie par la récurrence, en utilisant des threads JAVA. L'idée est de paralléliser l'algorithme récursif naturel permettant de calculer f (que l'on pourra écrire dans un premier temps si l'on ne se sent plus très à l'aise avec JAVA). Mais pour calculer f(n+2), au lieu de s'appeler soi-même deux fois pour calculer f(n+1) et f(n), on créera un thread pour calculer f(n+1) et un autre pour calculer f(n). Ainsi, on définira une classe,

public class Fibon extends Thread {
...
    public void run() {
    ...
    }
}
dont la méthode run() sera en charge de calculer la fonction f. Pour ce faire il faut que la classe Fibon contienne un champ argument, et un champ résultat, ce dernier pouvant ``survivre'' dans la mémoire partagée au thread qui le calcule. Ainsi nous devons utiliser une ``classe enveloppante'' pour le résultat. On pourra utiliser pour ce faire la classe UnEntier vue précedemment.

On programmera donc,

3  Réduction

On dispose d'un tableau t contenant n éléments de type int. On souhaite écrire un programme calculant les sommes partielles des éléments de t. Pour cela, on crée n threads, le thread p étant chargé de calculer Si=0i=p-1t[i].

Contrainte : chaque thread peut réaliser au plus O(log n) opérations.

Comment améliorer la complexité en nombre de threads (qui est O(n) dans l'algorithme décrit ci-dessus) sans modifier la complexité en temps?

4  Multiplication Matrice-Vecteur sur Réseau Systolique



On veut calculer le produit matrice-vecteur :
y=Ax
A est une matrice carrée d'ordre n et x et y sont des vecteurs à n composantes.
  1. Donner les équations récurrentes définissant le calcul.
  2. Construire un réseau à une dimension calculant la multiplication matrice-vecteur à l'aide des cellules MAC montrées à la Figure X.
  3. Combien de cellules sont nécessaires?
  4. Donner la latence du réseau. Quelle est sont efficacité pour n grand?

5  Composantes Connexes d'une Image

Ecrire un programme permettant de calculer les composantes 4-connexes d'une image. On créera un thread par pixel plus un thread ``serveur'' chargé de centraliser l'avancement du travail des différents threads et de décider de l'arrêt du programme. Les pixels de chaque composante devront être étiquetés par des nombres distincts.

6  Crible d'Erathostène

Question
Ecrire un programme JAVA ``par passage de messages'' affichant la suite des nombres premiers en utilisant la méthode du crible : un processus est chargé de générer les entiers naturels, dont on élimine d'abord les multiples de 2, puis 3, 5, etc. au moyen de processus filtrants successifs. On utilisera les deux classes suivantes du cours:

import java.util.*;

public class MsgQueue {
    Vector queue = new Vector();

    public synchronized void send(Object obj) {
        queue.addElement(obj); 
    }

    public synchronized Object recv() {
        if (queue.size() == 0)
            return null;
        Object obj = queue.firstElement();
        queue.removeElementAt(0);
        return obj;
    }
}
Et:

public class Process {
    MsgQueue In;
    MsgQueue Out;

    public Process(MsgQueue i, MsgQueue o) {
        In = i;
        Out = o;
    }

    public void send(int x) {
        Out.send(new Integer(x));
// System.out.println(Thread.currentThread().getName()+": send("+x+")");
    }

    public int recv() {
        Object x = In.recv();
        while (x == null)
            x = In.recv();
        int res = ((Integer) x).intValue();
// System.out.println(Thread.currentThread().getName()+": recv "+res);
        return res;
    }
}

7  Tri de Hoare

Question
Programmer le quicksort d'une liste d'entiers en essayant de paralléliser l'algorithme séquentiel. Que gagne-t'on en complexité (moyenne, pire cas ?)


This document was translated from LATEX by HEVEA.