Changes between Version 101 and Version 102 of SoclibCourseTp4
- Timestamp:
- Dec 12, 2013, 11:51:42 AM (11 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
SoclibCourseTp4
v101 v102 197 197 == 5.1 architecture matérielle == 198 198 199 Vous devez modifier le fichier '''tp4_top.cpp''' pour créer un nouveau fichier '''tp4_top_multi.cpp''' . 200 201 Pour écrire ce modèle générique, vous suivrez les recommandations suivantes: 199 Vous devez modifier le fichier '''tp4_top.cpp''' pour créer un nouveau fichier '''tp4_top_multi.cpp''', en suivant les recommandations suivantes: 202 200 203 201 * On vérifiera dans le code de la top-cell que le paramètre NPROCS est plus grand que 0 et inférieur ou égal à 4. … … 207 205 * Pour les tableaux de signaux, il est recommandé d'utiliser le constructeur générique de tableaux '''alloc_elems<type>(name, size)'''. Ce constructeur est défini dans le fichier '''alloc_elems.h''', qu'il ne faut pas oublier d'inclure dans la top-cell. 208 206 209 * Vous utiliserez une boucle indexée par l'index du processeur pour les construct teurs des composants PROC[i].207 * Vous utiliserez une boucle indexée par l'index du processeur pour les constructeurs des composants PROC[i]. 210 208 211 209 * Chaque processeur a besoin de son propre concentrateur d'interruption. Le composant matériel !VciIcu est un composant mono-canal, qui ne peut servir qu'un seul processeur. Il faut donc utiliser le composant matériel multi-canaux !VciMultiIcu, qui peut servir jusqu'à 8 processeurs. Vous pouvez consulter la documentation [https://www.soclib.fr/trac/dev/wiki/Component/VciMultiIcu ici]. … … 213 211 * Pour ce qui concerne les timers, on souhaite avoir un timer indépendant pour chaque processeur, mais puisque le composant !VciTimer peut contenir jusque 256 timers indépendants, on utilisera un seul composant !VciTimer. 214 212 215 * Pour ce qui concerne le contrôleur DMA, on souhaite également avoir un canal DMA indépendant pour chaque 216 processeur. Il faut donc utiliser le composant matériel !VciMultiDma dont vous pouvez consulter la documentation 217 [https://www.soclib.fr/trac/dev/wiki/Component/VciMultiDma ici]. 218 219 * Puisque chaque processeur peut exécuter 4 tâches en parallèle, et que chaque tâche doit disposer de son propre 220 terminal écran/clavier, le nombre de terminaux controlés par le composant !VciMultiTty est égal à 4*NPROCS. 221 222 * Pour ce qui concerne l'accès au disque, on aura un seul contrôleur de disque !VciBlockDevice pour toutes les applications. 213 * Pour ce qui concerne le contrôleur DMA, on souhaite également avoir un canal DMA indépendant pour chaque processeur. Il faut donc utiliser le composant matériel !VciMultiDma dont vous pouvez consulter la documentation [https://www.soclib.fr/trac/dev/wiki/Component/VciMultiDma ici]. 214 215 * Puisque chaque processeur peut exécuter 4 tâches en parallèle, et que chaque tâche doit disposer de son propre terminal écran/clavier, le nombre de terminaux controlés par le composant !VciMultiTty est égal à 4*NPROCS. 216 217 * Pour ce qui concerne l'accès au disque, on aura un seul contrôleur de disque !VciBlockDevice partagé par toutes les applications. 223 218 224 219 * Pour l'index des initiateurs (SRCID), vous utiliserez les valeurs 0 à (NPROCS-1) pour les processeurs, et les valeurs NPROCS et (NPROCS+1) pour le composant IOC et pour le composant DMA respectivement. … … 228 223 * Puisque l'architecture contient maintenant plusieurs périphériques multi-canaux (ICU, TTY, TIMER, DMA) les longueurs des segments alloués à ces périphériques doivent être ajustées en conséquence. 229 224 230 * L'interruption IRQ_IOC sera connectée à l'entrée p_irq_in[0] du composant ICU. Les 4 interruptions répliquées IRQ_DMA[0:3] seront connectée aux entrées p_irq_in[4:7]. Les 4 interruptions IRQ_TIM[0:3] seront connectées aux entrées p_irq_in[8:11] Les 16 interruptions IRQ_TTY[0:15] seront connectées aux entrées p_irq_in[16:31].225 * Pour ce qui concerne le cablage des interruptions, l'interruption IRQ_IOC sera connectée à l'entrée p_irq_in[0] du composant ICU. Les 4 interruptions répliquées IRQ_DMA[0:3] seront connectée aux entrées p_irq_in[4:7]. Les 4 interruptions IRQ_TIM[0:3] seront connectées aux entrées p_irq_in[8:11] Les 16 interruptions IRQ_TTY[0:15] seront connectées aux entrées p_irq_in[16:31]. 231 226 232 227 '''Question''' : Pour quelle raison les valeurs stockées dans les 4 registres de masque ICU_MASK[k] associés aux 4 canaux du composant !VciMultiIcu doivent-elles être non-recouvrantes? … … 254 249 255 250 On commence par générer le code binaire pour une architecture comportant seulement 2 processeurs, 256 de façon à exécuter en parallèle des deux programmes ''main'' et ''main_display'' utilisés au début de ce TP .251 de façon à exécuter en parallèle des deux programmes ''main'' et ''main_display'' utilisés au début de ce TP sur deux processeurs P0 et P1. 257 252 On s'efforcera cependant que ce code de boot soit facilement extensible pour s'adapter à des architectures contenant plus de 2 processeurs 258 253 259 254 Créez un nouveau répertoire '''soft_multi''', et recopiez dans ce répertoire les fichiers contenus dans le répertoire '''soft''', car tous les fichiers doivent être modifiés. 260 255 261 '''Question''' : Modifiez le fichier '''reset.s''' pour initialiser le pointeur de pile ($29 dans le cas du MIPS32) à une valeur dépendant du ''proc_id''. Chaque tâche disposera d'une pile de 64 Koctets. Quelle doit être la longueur du segment de pile défini dans la table des segments de la top-cell pour 2 processeurs? Pour 8 processeurs? 262 263 '''Question''' : Modifiez le fichier '''reset.s''' pour que chaque processor PROC[i] initialize le registre de masque du composant ICU[i] qui lui est associé. Attention: les adresses de base des segment associés aux différents composants ICU[i] ont des valeurs différentes... 264 265 '''Question''' : Modifiez le fichier '''reset.s''' pour initialiser le registre EPC dans le cas du MIPS32 à une valeur dépendant du ''proc_id''. On définira une table de sauts à 8 entrées indexée par le ''proc_id''. Les deux premières cases contiendront les adresses des deux programmes ''main_0'' et ''main_1''. Les autres entrées ne seront pas utilisées, mais pourront être initialisées avec l'adresse de la fonction système ''_exit''. 266 267 '''Question''' : Modifiez le fichier '''Makefile''' du répertoire '''soft''' pour que soient compilés (en plus du code système et du fichier '''reset.s''') les deux programmes '''main_0.c''' et '''main_1.c'''. 268 269 '''Question''' : Modifiez dans le fichier '''ldscript''' la valeur de la variable qui informe le système d'exploitation du nombre de processeurs présents dans l'architecture matérielle. 270 271 '''Question''' : Compilez le logiciel embarqué, puis lancez l'exécution sur le simulateur '''simulator_multi.x''', avec 2 processeurs. 256 '''Question''' : Modifiez le fichier '''reset.s''' pour initialiser le pointeur de pile ($29 dans le cas du MIPS32) à une valeur dépendant du ''proc_id''. Chaque tâche disposera d'une pile de 64 Koctets. Quelle doit être la longueur du segment de pile défini dans la table des segments de la top-cell pour 2 processeurs? Pour 4 processeurs? 257 258 '''Question''' : Modifiez le fichier '''reset.s''' pour que chaque processor PROC[i] initialize le registre de masque du composant ICU[i] qui lui est associé. Attention: les adresses des registres dépendent du canaL... 259 260 261 '''Question''' : Modifiez le fichier '''reset.s''' pour initialiser le registre EPC à une valeur dépendant du ''proc_id''. 262 263 '''Question''' : Modifiez le fichier '''Makefile''' du répertoire '''soft''' pour que soient compilés (en plus du code système et du code de boot '''reset.s''') les deux programmes '''main.c''' et '''main_display.c'''. 264 265 '''Question''' : Modifiez dans le fichier '''config.h''' la valeur de la variable qui informe le système d'exploitation du nombre de processeurs présents dans l'architecture matérielle. 266 267 '''Question''' : Compilez le logiciel embarqué, puis lancez l'exécution sur le simulateur '''simulator_multi.x''', avec NPROCS = 2 processeurs. 272 268 273 269 == 5.4 Exécution parallèle sur architecture octo-processeurs == 274 270 275 On souhaite maintenant exécuter huit programmes en parallèle sur huitprocesseurs.276 277 '''Question''' : Ecrivez six autres petits programmes ''main_2'' à ''main_7''. Si vous manquez d'imagination, vous pouvez vous contenter de répliquer le code du programme ''main_0''. Si ces programmes utilisent les interruptions générées par le timer, n'oubliez pas que chaque processeur ne doit configurer que le timer qui lui appartient.271 On souhaite maintenant exécuter 4 programmes en parallèle sur 4 processeurs. 272 273 '''Question''' : Ecrivez deux autres petits programmes qui s'exécuteront sur les deux autres processeurs. Si vous manquez d'imagination, vous pouvez vous contenter de répliquer le code du programme ''main.c''. Si ces programmes utilisent les interruptions générées par le timer, n'oubliez pas que chaque processeur ne doit configurer que le timer qui lui appartient. 278 274 279 275 '''Question''' : Modifiez les fichiers '''reset.s''', '''ldscript''', et '''Makefile''' du répertoire '''soft''' pour les adapter au cas de 8 processeurs, compilez le logiciel embarqué puis lancez l'exécution sur le simulateur '''simulator_multi.x''', avec 8 processeurs. 280 276 281 '''Question''' : Le GIET supporte des architectures contenant jusque 8 processeurs, et chaque processeur peut exécuter jusque 4 tâches en multiplexage temporel. Nous avons cependant limité l'architecture générique à 4 processeurs. 282 Quel est le facteur qui justifie cette limitation? 277 '''Question''' : Le GIET supporte des architectures contenant jusque 8 processeurs, et chaque processeur peut exécuter jusque 4 tâches en multiplexage temporel. Nous avons cependant limité l'architecture générique à 4 processeurs. Quel est le facteur qui justifie cette limitation? 283 278 284 279 = 6 Compte-rendu =