Bonjour.
Je vous explique rapidement le contexte :
Du calcul matriciel (un bête produit de matrices) dans un environnement distribué.
Les processus de calculs vont demander les lignes de la matrice A à un processus qu'on va appeler lineserv, et les colonnes de la matrice B à un processus colserv.
Les matrices sont théoriquement trop grandes pour être stockées en mémoire d'une seule machine. Donc lineserv va lancer d'autres processus (qu'on va appeler lineserv2) sur d'autres machines qui ne s'occuperont que d'un certain nombre de lignes et leur donnera les lignes.
Seul lineserv a accès au fichier contenant la matrice, les lineserv2 récupèrent leur lignes via le réseau.
Une fois les lignes dispatchées, lineserv devra répondre aux requêtes des processus de calcul qui demandent les lignes numéro x à y en faisant suivre des requêtes plus restreintes aux lineserv2.
J'espère que je suis clair. :p
Le nombre de lineserv2 est fixé. On connaît la taille de la matrice (elle est carrée mais peu importe). Bien entendu, le nombre de ligne de tous les lineserv2 doit être équivalent. C'est à dire que le lineserv2 le plus chargé a (au pire) une ligne de plus que le moins chargé.
Le problème est :
Je lis les lignes une à une, et je dois les envoyer une à une aux lineserv2. Sachant que je connais la taille de la matrice et le nombre de groupe de ligne (1 lineserv2 = 1 groupe de ligne), comment répartir au mieux les lignes entre les groupes ?
Ça, à la limite, c'est pas très difficile.
la ligne i, je la met dans le groupe (i*matsize)/nb_group, (c'est une division entière bien évidemment).
Mais ça se gâte quand je dois retrouver le numéro du groupe qui possède une ligne donnée.
(l*nb_group)/matsize ne marche pas bien. En effet, si je réparti les lignes avec la formule sus-cité, les "gros groupes" sont les derniers groupes. Alors que cette formule se comporte comme si les "gros groupes" étaient les premiers.
Additionnellement, à partir du numéro d'un groupe, je dois être capable de déterminer son intervalle de ligne. (Pour transmettre aux lineserv2 des requêtes qui ne dépassent pas de leur champ d'action. Mais aussi parce que, avant d'envoyer d'envoyer les lignes aux lineserv2 je doit leur dire combien de ligne je leur envoie pour qu'ils réservent assez de mémoire.)
Et tout ça en O(1) en temps. Et si possible O(1) en espace mémoire.
Pour ceux qui ont pas tout suivi, plus mathématiquement ça donne :
J'ai un ensemble E ordonné et fini.
Je veux regrouper ces éléments de E dans des groupes G (pas des groupes mathématiques :p) de telle sorte que chaque élément de E se trouve dans un et un seul groupe de G.
Je veux pouvoir déterminer le numéro du groupe où se trouver un élément x de E.
Je veux pouvoir déterminer le plus grand et le plus petit élément de chaque groupe.
Tout ça en O(1).
NB : on se place dans le cas général où le nombre de groupe ne divise pas la taille de la matrice.
Voilà, désolé de la longueur, j'espère avoir été clair.
Merci d'avance.
Celelibi.
Partager