| 1 | {{{ |
| 2 | #!html |
| 3 | <h1>TP4 : Exécution sur architecture multi-cluster</h1> |
| 4 | }}} |
| 5 | [[PageOutline]] |
| 6 | |
| 7 | = 0. Objectif = |
| 8 | |
| 9 | On cherche dans ce quatrième TP à augmenter encore le débit de la chaîne de décompression, |
| 10 | pour permettre - par exemple - de traîter des images de plus grandes dimensions, |
| 11 | tout en respectant la fréquence video. |
| 12 | Cette augmentation de débit peut être obtenue en augmentant la fréquence d'horloge, mais |
| 13 | cette approche a évidemment des limites. On essayera donc plutôt d'augmenter le parallélisme |
| 14 | de traitement du flux MJPEG. |
| 15 | |
| 16 | Pour augmenter le parallélisme, il ne suffit pas d'augmenter le nombre de processeurs dans |
| 17 | l'architecture matérielle, il faut également augmenter le nombre de tâches de l'application |
| 18 | logicielle, ce qui impose de modifier la structure du TCG. |
| 19 | |
| 20 | * La première partie du TP vise la définition d'un graphe de tâches ''multi-pipeline''. |
| 21 | * La seconde partie du TP porte sur la définition d'une architecture matérielle ''multi-clusters''. |
| 22 | * La troisième partie du TP analyse l'impact du placement des canaux de communication |
| 23 | sur les bancs mémoire dans les architectures `NUMA` (Non Uniform Memory Access). |
| 24 | |
| 25 | Commencez par créer un répertoire de travail `tp4`, et recopiez dans ce répertoire les différents |
| 26 | fichiers et/ou répertoires sources contenus dans le répertoire `tp3`. |
| 27 | |
| 28 | = 1. Parallélisation du TCG = |
| 29 | |
| 30 | Le TCG défini dans le TP1 et re-utilisé dans les TP2 et TP3 comportait 7 tâches. Il exploitait |
| 31 | un parallélisme de type ''macro-pipeline''. |
| 32 | Différentes tâches traitent différents blocs de la même image: Toutes les tâches s'exécutent |
| 33 | en parallèle, mais sur des blocs différents de l'image. |
| 34 | Il est difficile d'augmenter le nombre d'étages de ce macro-pipeline, car les tâches les plus coûteuses |
| 35 | en temps de calcul (VLD et IDCT) ne se découpent pas facilement en sous-tâches. |
| 36 | |
| 37 | [[Image(mjpeg_multi.png, align=right)]] |
| 38 | |
| 39 | On va donc exploiter un autre type de parallélisme en utilisant deux pipelines |
| 40 | de décompression. Chaque pipeline traite une image complête. |
| 41 | On introduit une tâche chargée de distribuer aternativement aux deux pipe-line le flux MJPEG. |
| 42 | Cette nouvelle tâche `split` se situera entre les tâches `tg` et `demux`. |
| 43 | La tâche `libu` doit être modifiée pour récupérer alternativement les images décompressées |
| 44 | provenant des deux pipelines, avant de les envoyer vers la tâche `ramdac`. |
| 45 | |
| 46 | Modifiez la structure du TCG dans la description DSX de l'application. |
| 47 | Vous devez introduire un nouveau modèle de tâche pour la tâche `split`, et modifiier |
| 48 | le modèle de la tâche `libu`. Il faut ensuite modifier |
| 49 | la topologie du TCG en définissant explicitement toutes les intances de tâches et tous |
| 50 | les canaux de communication nécessaires. |
| 51 | |
| 52 | Le code de la tâche `split` doit analyser octet par octet le flux MJPEG, pour détecter |
| 53 | le marqueur de début d'image (SOI = 0xffd8), de façon à l'aiguiller vers le bon canal de sortie. |
| 54 | |
| 55 | Pour valider fonctionnellement cette nouvelle description de l'application logicielle, |
| 56 | déployez-la sur station de travail POSIX. vous devez voir les mêmes images qu'avant, dans le même ordre. |
| 57 | |
| 58 | = 2. Architecture matérielle multi-processeur clusterisée = |
| 59 | |
| 60 | Pour supporter la charge induite par ces nouvelles tâches, il faut augmenter |
| 61 | le nombre d'unités de traitement (processeurs ou coprocesseurs). |
| 62 | Pour éviter que l'accès à la mémoire devienne un goulot d'étranglement, |
| 63 | il est également souhaitable d'augmenter le nombre de bancs mémoire physique, de façon |
| 64 | à répartir les données. Et lorsque le nombre d'entités communicantes (initiateurs ou cibles) augmente, |
| 65 | il est utile de structurer l'architecture en sous-systèmes. |
| 66 | |
| 67 | Cette structuration a des justifications fonctionnelles: |
| 68 | * On cherche à regrouper dans un même sous-sytème les différents composants |
| 69 | matériels qui réalisent une même partie de l'application, et communiquent fortement entre eux. |
| 70 | * Elle facilite également la réalisation matérielle : Chaque sous-système pourra être implanté |
| 71 | physiquement dans un même domaine synchrone, et utiliser sa propre horloge, |
| 72 | conformément au principe GALS (Globally Asynchronous, Locally Synchronous). |
| 73 | |
| 74 | [[Image(ClusteredNoirqMulti:clustered_noirq_multi.png, align=right)]] |
| 75 | |
| 76 | Chaque sous-système constitue un ''cluster'', et contient des processeurs, |
| 77 | de la mémoire, et dispose de son propre mécanisme d'interconnexion local. |
| 78 | |
| 79 | Les différents clusters sont interconnectés entre eux par une micro-réseau à interface |
| 80 | VCI/OCB, qui pourra être modélisé par un composant `Vgmn`. |
| 81 | |
| 82 | On utilisera comme mécanisme d'interconnexion interne à chaque cluster le composant |
| 83 | !LocalCrossbar (voir SoclibComponents). Ce composant matériel est un petit crossbar, |
| 84 | qui possède un nombre variable de ports ''initiateur'' et ''cible'' |
| 85 | permettant de connecter les composants matériels appartenant au cluster. Il possède également |
| 86 | deux ports ''initiateur'' et ''cible'' permettant l'accès au micro-réseau, représentés dans la |
| 87 | description DSX comme un seul port. |
| 88 | |
| 89 | Cette structuration aboutit donc à l'utilisation d'un mécanisme d'interconnexion à deux niveaux |
| 90 | (interconnect global: `Vgmn`, et interconnect local: `LocalCrossbar`), bien que tous les |
| 91 | composants matériels (initiateurs et cibles) continuent à partager le même espace d'adressage. |
| 92 | {{{ |
| 93 | #!comment |
| 94 | Un processeur d'un cluster peut adresser directement un banc mémoire ou un périphérique |
| 95 | appartenant à un autre cluster. La principal conséquence est que tous les composants matériels |
| 96 | de l'architecture doivent maintenant être identifiés par un double index: |
| 97 | * un index global définissant le cluster. |
| 98 | * un index local identifant le composant dans le cluster. |
| 99 | }}} |
| 100 | |
| 101 | Pour faciliter l'exploration architecturale, on souhaite définir une architecture générique |
| 102 | dont les paramètres sont: |
| 103 | * la latence minimale du Vgmn |
| 104 | * le nombre de clusters et, pour chaque cluster, |
| 105 | * le nombre de bancs mémoire |
| 106 | * le nombre de processeurs |
| 107 | Chaque cluster contiendra en outre un contrôleur de verrous (composant Locks). |
| 108 | |
| 109 | Complétez la définition de l'architecture ClusteredNoirqMulti. |
| 110 | |
| 111 | = 3. Déploiement et exploration architecturale = |
| 112 | |
| 113 | Modifiez la description DSX de l'application MJPEG: |
| 114 | * Remplacez l'instanciation de !VgmnNoirqMulti par |
| 115 | {{{ |
| 116 | archi = ClusteredNoirqMulti( cpus = [1, 2, 2, 1], |
| 117 | rams = [1, 1, 1, 1], |
| 118 | min_latency = 10 ) |
| 119 | }}} |
| 120 | * Remplacez le déploiement de `tg` et `ramdac` sur {{{archi.vgmn}}} par un déploiement |
| 121 | sur {{{archi.cluster[0]}}} et {{{archi.cluster[3]}}} respectivement. |
| 122 | * Ne touchez aucun autre paramètre, particulièrement les autres paramètre de déploiement |
| 123 | dans les rams, c'est pour la question suivante. |
| 124 | |
| 125 | [[Image(MjpegCourse:q.gif)]] Combien faut-il de cycles pour décompresser 25 images? |
| 126 | |
| 127 | La structure de l'application logicielle (TCG), et l'architecture matérielle étant définies, |
| 128 | l'exploration architecturale consiste donc à analyser l'influence du placement des |
| 129 | objets logiciels sur les composants matériels. On s'intéresse tout particulièrement |
| 130 | au placement des canaux de communication sur les bancs mémoire physiques. |
| 131 | |
| 132 | Dans ce type d'architecture multi-clusters, les temps d'accès à la mémoire sont très différents, |
| 133 | suivant qu'un processeur adresse la mémoire locale au sous-système, ou à un autre sous-système. |
| 134 | On parle d'architecture NUMA (Non Uniform Memory Access). |
| 135 | |
| 136 | Refaites le placement des canaux de communication de manière ''intelligente''. |
| 137 | |
| 138 | [[Image(MjpegCourse:q.gif)]] Combien faut-il de cycles pour décompresser 25 images? |
| 139 | |
| 140 | = 4. Compte-Rendu = |
| 141 | |
| 142 | Comme pour les TP précédents, vous rendrez une archive contenant: |
| 143 | {{{ |
| 144 | $ tar tzf binome0_binome1.tar.gz |
| 145 | tp4/ |
| 146 | tp4/rapport.pdf |
| 147 | tp4/clustered_noirq_multi.py |
| 148 | tp4/mjpeg/ |
| 149 | tp4/mjpeg/mjpeg.py |
| 150 | tp4/mjpeg/src/ |
| 151 | tp4/mjpeg/src/iqzz.c |
| 152 | tp4/mjpeg/src/libu.c |
| 153 | tp4/mjpeg/src/split.c |
| 154 | }}} |
| 155 | |
| 156 | Cette archive devra être livrée avant le mardi 6 mars 2007, 18h00 à [MailAsim:nipo Nicolas Pouillon] |