• Aucun résultat trouvé

9.3 Mémoires externes en BSML

9.3.1 Rappel des E/S en OCaml

9.3.3 Solution proposée . . . 170 9.3.4 Nouveau modèle, le modèle EM-BSP2 . . . 171 9.3.5 Nouvelles primitives . . . 173

9.4 Sémantique dynamique . . . 175 9.5 Coût des nouvelles primitives et expérimentations . . . 178

9.5.1 Coût EM2-BSP des primitives . . . 178 9.5.2 Implantation des primitives . . . 181 9.5.3 Exemple d’utilisation de nos primitives . . . 182 9.5.4 Expérimentations . . . 185

9.A Preuve du théorème . . . 186

P

OURdes applications à grande échelle où le traitement parallèle est utile et où la quantité de don-nées à manipuler excède souvent la somme totale de toutes les mémoires principales (aussi appelées mémoires vives ou RAM) des machines disponibles, l’utilisation de disques externes, appelés aussi mémoires secondaires (ou externes), devient une nécessité. Dans ce chapitre, nous présentons une biblio-thèque de dispositifs d’entrées/sorties (E/S) pour BSML sur les potentiels disques parallèles d’une machine BSP. Comme à l’accoutumée, nous donnerons une sémantique dynamique formelle ainsi qu’un modèle de coût pour ces accès aux disques. Sont également donnés quelques résultats expérimentaux de l’exécution d’un programme sur notre grappe de tests.

9.1 Introduction

Pour remédier aux problème des grandes quantités de données à traiter, une première solution pour augmen-ter la capacité de mémoire disponible est d’employer le mécanisme de mémoire virtuelle des systèmes d’ex-ploitation modernes. Ce mécanisme de pagination a été établi comme une méthode standard pour contrôler et fournir, via les mémoires externes, une plus grande capacité de mémoire qui est nécessaire aux applica-tions. Son principal avantage est de permettre aux applications de disposer d’un grand espace de mémoire virtuelle, sans avoir à tenir compte de la gestion de ces disques.

Malheureusement, cette solution est inefficace pour la pratique du calcul scientifique et ce quel que soit le système de pagination utilisé [60]. Les algorithmes et les structures de données existants sont souvent mal adaptés aux applications out-of-core. Pour obtenir de meilleurs temps d’exécution, ce genre d’application doit alors être restructuré avec des algorithmes comportant explicitement des entrées/sorties sur les données

     P/M P/M P/M P/M P/M DisqueD−1 Disque0 Bus interne CPU Mémoire @ Réseau

Figure 9.1 —Une machine BSP avec de la mémoire secondaire

des mémoires externes. De tels algorithmes sont généralement appelés «à mémoires externes» (external

memory algorithms dans la litérature anglo-saxonne) et sont donc conçus pour les problèmes informatiques

dans lesquels la taille de la mémoire principale de l’ordinateur (parallèle ou non) est seulement une petite fraction de la taille du problème [267, 268, 269].

Cette astreinte d’une réécriture complète des algorithmes est en grande partie due au besoin de localité des données et n’est pas nécessaire pour les algorithmes séquentiels en mémoire RAM ou les algorithmes parallèles PRAM (où chaque accès à une donnée a un coût constant). Ce n’est plus le cas dans un environ-nement à mémoires secondaires, où le coût d’accès à une donnée peut être bien plus important si celle-ci se trouve non pas dans la mémoire interne mais dans l’une des mémoires externes. Une application accroît alors ses performances si elle diminue ce nombre d’accès : elle ne doit garder dans sa mémoire principale que ce qui lui est nécessaire sur le moment.

La recherche d’algorithmes efficaces utilisant les mémoires secondaires a récemment suscité une atten-tion considérable. Au cours de ces dernières années, des modèles complets de calcul et de coût qui incor-porent des disques et des processeurs multiples ont été proposés [181, 267, 269], mais rarement avec tous les éléments décrits ci-dessus. Dans les articles [91, 93], les auteurs ont proposé un modèle abstrait, à la BSP, pour les machines parallèles incorporant des disques parallèles. Ce modèle est basé sur le modèle BSP où chaque machine a accès à une mémoire externe, sous la forme d’un ensemble de disques. Cette mémoire externe est alors manipulée par des opérations d’entrées/sorties.

Notre recherche visant à combiner le modèle BSP avec la programmation fonctionnelle, nous devons naturellement prolonger également notre langage avec des opérations d’entrées/sorties pour rendre possible la programmation de ce type d’algorithmes.

Ce chapitre est la suite directe de notre travail sur les dispositifs impératifs de BSML. Il est organisé comme suit : tout d’abord, nous présenterons brièvement le modèle BSP avec mémoires externes comme il est décrit dans [91]. Ensuite, ensuite nous expliciterons les problèmes qui apparaissent en BSML lorsque l’on veut naïvement ajouter les opérations classiques d’entrées/sorties d’OCaml. Nous donnerons alors les nouvelles primitives de notre langage, ainsi qu’une sémantique dynamique et un modèle de coût associés à cette extension. Nous terminerons avec un exemple complet utilisant ces primitives.

9.2 Mémoires externes

9.2.1 Modèle EM-BSP

Les ordinateurs modernes comportent typiquement plusieurs niveaux de mémoire tels que la mémoire prin-cipale (appelé couramment mémoire vive ou RAM), les caches (ou tampons) systèmes du processeur et des périphériques ainsi que la mémoire externe sous la forme de disques durs. Ce grand nombre de niveaux rend la modélisation complète d’un ordinateur bien trop compliquée et de tels modèles auraient l’inconvénient de ne pas pouvoir être portables. Nous nous limitons donc à un modèle à deux niveaux (mémoire principale et mémoires externes), tel qu’il est décrit dans [269], car la différence de rapidité d’accès entre les disques et la mémoire principale est bien plus significative qu’avec les autres niveaux. Sur ce principe, [93] a étendu le modèle BSP pour inclure des mémoires externes locales (appelées aussi mémoires secondaires dans un modèle à deux niveaux). La figure 9.1 illustre cette idée. Chaque processeur de la machine BSP, a, en plus de sa mémoire principale, une mémoire externe (EM) sous la forme d’un ensemble de disques. Cette idée étend le modèle BSP en sa version avec mémoire externe, appelée EM-BSP, avec les paramètres suivants :

167 9.2. MÉMOIRES EXTERNES

1. M est la taille en octets de la mémoire principale en chaque processeur,

2. D est le nombre de disques en chaque processeur,

3. B est la taille en octets d’un bloc de transfert en chaque disque,

4. G est le ratio de capacité de calcul local (nombre d’opérations de calculs locaux) divisé par la capacité

locale d’entrées/sorties (nombre de blocs de tailleB pouvant être tranférés entre les disques et la

mémoire principale) par unité de temps.

Dans de nombreuses machines parallèles, tous les ordinateurs composant la machine BSP ont bien le même nombre de disques. Ce modèle, dans l’esprit d’uniformité du modèle BSP, se restreint à ce cas. Notons aussi que le modèle interdit différentes tailles de mémoires principales.

Chaque disque est noté parD0, D1, . . . , DD−1et est constitué d’une séquence de plages (tracks en an-glais). Chacune de ces plages est en accès direct et contient exactement un bloc deB octets. Chaque

proces-seur peut utiliser, de manière concurrente, tous cesD disques et ainsi transférer depuis ou vers la mémoire

principaleD × B octets en une seule opération d’entrée/sortie. Cette opération aura alors un coût constant G. Dans une telle opération, seule une plage par disque est accessible. Il n’est pas spécifié quelle est la

plage utilisée en chaque disque. Notons qu’une opération impliquant moins de disques n’entraîne pas l’uti-lisation d’une autre constante queG : toute opération d’écriture ou de lecture sur les disques se fera en un

temps constantG. Notons aussi que chaque ordinateur composant la machine BSP est capable de contenir

plusieurs blocs provenant des disques, c’est-à-direM ≫ DB.

Comme dans le modèle BSP, un programme EM-BSP est structuré en une succession de super-étapes. Le coût des communications est identique. Le modèle EM-BSP autorise l’utilisation de plusieurs opérations d’entrée/sortie sur les disques lors de la phase de calcul d’une étape. Le coût total de chaque super-étape est donc défini ainsi :

tcomp,E/S+ tcomm+ l

oùtcomp,E/S est le coût des calculs locaux et des opérations d’E/S durant les super-étapes, c’est-à-dire

tcomp,E/S=Psmaxi(ws i+ms

i) où ms

i est le temps de calcul utilisant la mémoire secondaire au processeur

i pendant la super-étape s. La figure 9.2 donne le coût EM-BSP d’algorithmes BSP classiques en utilisant le

résultat de simulation des algorithmes BSP dans le modèle EM-BSP décrit dans [93]. Le modèle séquentiel utilisant plusieurs disques est celui de [269] où les paramètres des disques sont ceux du modèle EM-BSP, mais pour un seul et unique processeur.

9.2.2 Présentation d’algorithmes existant en mémoires externes

Notre premier exemple est l’inversion d’une matrice. Celle-ci est largement employée dans les applications scientifiques comme méthode directe pour résoudre les systèmes linéaires. Le calcul de l’inverse d’une matriceA peut être dérivé de sa factorisation dite LU. [61] présente, à cet effet, la factorisation LU par

blocs. Pour cet algorithme parallèle de factorisation, la matrice est divisée en blocs de colonnes appelés

super-blocs. La taille du super-bloc est déterminée par la quantité de mémoire physique disponible dans la

mémoire principale : seuls les blocs du super-bloc courant sont dans cette mémoire centrale, les autres sont conservés sur les disques. L’algorithme factorise la matrice de gauche à droite, super-bloc par super-bloc. Chaque fois qu’un nouveau bloc de la matrice est mis dans la mémoire principale (appelée le super-bloc actif ), tous les pivotements précédents et les mises à jour d’après un historique de l’algorithme sont appliquées au super-bloc actif. Une fois que le dernier super-bloc est factorisé, la matrice est relue pour appliquer le pivotement restant sur les précédents super-blocs. Notons que le calcul est fait «data in place», c’est-à-dire sans aucun échange des données de la matrice mais par des échanges des pivotements effectués. La matrice a donc tout d’abord été distribuée sur les processeurs. Pour un bon équilibrage des charges, une distribution cyclique des données est employée.

L’article [66] présente des algorithmes PRAM utilisant une mémoire externe centralisée pour des pro-blèmes sur les graphes tels que le calcul des composants bi-connexes. L’un d’eux est le problème des 4 couleurs d’un graphe appliqué au problème dit du list ranking : déterminer pour chaque nœudv d’une liste,

le rang de ce nœud défini par le nombre de liens depuisv jusqu’à la fin de la liste. La méthode utilisée pour

résoudre un tel problème est de mettre à jour des groupes de nœuds de la liste (en recolorisant les nœuds du groupe) sans avoir à trier ou parcourir la liste entière. Comme avant, l’algorithme travaille groupe par groupe, avec seulement un groupe dans la mémoire centrale.

1 6 8 C H A P IT R E 9 . M É M O IR E S E X T E R N E S E N B

Problème Coût séquentiel avec E/S

(un processeur, plusieurs disques)

Coût BSP (multiples processeurs, pas de disque)

Coût EM-BSP (multiples processeurs, multiples disques)

Tri Θ(G × BDn logM/B(Bn)) L = l tcomp = O(n log(n)p ) H = O(n p) tcomp = O(˜ n log(n)p )

tcomm = O(g(˜ np + log(pBn ))) tE/S = O(G˜ pBDn ) L = O(l × D × log(˜ pBn )) Permutation Θ(G × min(n D, n DBlogM/B(n B))) idem idem Transposé d’une ma-trice (avec r lignes, c colonnes et n = r×c) Θ(G × n BD×log(min(M,r,c,nB)) log(M B) ) idem idem

169 9.3. MÉMOIRES EXTERNES EN BSML

Le dernier exemple est le problème de la recherche de motifs qui consiste à déterminer laquelle desk

chaînes de caractères données est «sous-chaîne» d’une première chaîne de caractères. D’importantes appli-cations, notamment en biologie, utilisent de très grandes chaînes de caractères (comme le génome d’un être vivant) et requièrent des algorithmes performants de recherches de motifs. [104] décrit un algorithme pour ce problème, avec un nombre constant de super-étapes, basé sur la distribution d’une structure de données appropriée sur les processeurs et les disques durs pour réduire et équilibrer le coût des communications d’une recherche naïve. Cette structure de données est basée sur la construction d’arbres équilibrés à partir des suffixes des chaînes de caractères. L’algorithme travaille sur le plus long préfixe commun de ces arbres et ceci par ordre lexicographique. On tire profit des disques en maintenant seulement une partie des arbres dans la mémoire principale et en rassemblant les parties des arbres pendant les super-étapes.

9.3 Mémoires externes en BSML

9.3.1 Rappel des E/S en OCaml

Les fonctions d’entrées/sorties de OCaml calculent une valeur, mais durant ce calcul, elles effectuent une modification de l’état de la mémoire externe. Deux types sont prédéfinis :in_channeletout_channelpour respectivement les canaux de communication d’entrées et de sorties. Les canaux peuvent être vus comme des «pointeurs» sur les fichiers. La création d’un canal utilise une des fonctions suivantes :

open_in: string→in_channel et open_out: string→out_channel

open_inouvre un fichier en lecture s’il existe (déclenche une exception sinon) etopen_outcrée le fichier indiqué s’il n’existe pas ou l’écrase sinon (supprime son contenu pour permettre l’écriture de nouvelles données). Les fonctions de fermetures des canaux sont :

close_in: in_channel→unit et close_out: out_channel→unit

La bibliothèque standard de OCaml propose ensuite un grand nombre de fonctions de manipulation des canaux, notamment de manipuler les fichiers «à la Unix», caractère par caractère1. Les fonctions de plus «haut niveau» (qui donc nous intéressent), permettent l’écriture ou la lecture de n’importe quel type de données2. Ces fonctions sont :

to_channel: out_channel→α →unit et from_channel: in_channel→α

La fonctionto_channel prend en argument un canal de sortie, une valeur et l’écrit sur le fichier pointé par le canal. Cette valeur a été préalablement sérialisée (on parle aussi de linéarisation, serialize dans la littérature anglo-saxonne) afin d’être transformée en une séquence d’octets. Réciproquement, la fonction from_channellit sur le canal une valeur et la retourne. Plusieurs valeurs peuvent être stockées dans un même fichier. Elles pourront être lues séquentiellement.

Documents relatifs