Changes between Version 74 and Version 75 of SoclibCourseTp4


Ignore:
Timestamp:
Dec 11, 2010, 4:34:28 PM (14 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SoclibCourseTp4

    v74 v75  
    179179== 5.1 architecture matérielle ==
    180180
    181 Modifiez le fichier '''tp3_top.cpp''' et renommez-le '''tp3_top_multi.cpp''' .
     181Vous devez modifier le fichier '''tp4_top.cpp''' pour créer un nouveau fichier '''tp4_top_multi.cpp''' .
    182182Chaque processeur aura son propre concentrateur d'interruption (un composant ICU par processeur).
    183183Comme chaque processeur peut - en principe - exécuter plusieurs tâches en pseudo-parallélisme, et que chaque tâche possède un terminal privé, on peut avoir un grand nombre de terminaux. On aura donc un contrôleur TTY indépendant pour chaque processeur.
    184 Pour ce qui concerne les TIMERs, on souhaite avoir un timer indépendant pour chaque processeur, mais puisque le
     184Pour ce qui concerne les timers, on souhaite avoir un timer indépendant pour chaque processeur, mais puisque le
    185185composant !VciTimer peut contenir jusque 256 timers indépendants, on utilisera un seul composant !VciTimer.
    186186
    187187 * Le GIET ne pouvant supporter que 8 processeurs, on vérifiera que le paramètre NPROCS est inférieur ou égal à 8.
    188188
    189  * Il faut définir des tableaux de pointeurs pour les composants répliqués PROC[i], TTY[i] et ICU[i], ainsi que pour les différents signaux connectés à ces composants.
     189 * Il faut définir des tableaux de pointeurs indexés par l'index du processeurs (proc_id) pour les composants répliqués PROC[i], TTY[i] et ICU[i] ainsi que pour les signaux connectés à ces composants.
     190
     191 * 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.
    190192
    191193 * Il faut utiliser une boucle indexée par l'index du processeur pour les constructteurs des composants PROC[i], ICU[i], et TTY[i].
     
    199201 * Il faut définir NPROCS segments pour les NPROCS TTY[i]. L'adresse de base du segment associé au composant ICU[i] est définie comme : seg_tty_base + 0x00100000 * proc_id (cette contrainte est imposée par le GIET).
    200202
    201  * Il faut utiliser des boucles indexées par l'index du processeur pour connecter les composants répliqués.
     203 * Pour la net-list, il faut utiliser des boucles indexées par l'index du processeur pour connecter les composants répliqués et signaux répliqués.
    202204 
    203205 * Les interruptions non-répliquées (IRQ_IOC, IRQ_DMA) seront connectées au contrôleur d'interruptions ICU[0]. Les interruptions répliquées IRQ_TTY[i] et IRQ_TIMER[i] seront connectées au concentrateur d'interruptions ICU[i].
     
    214216
    215217Le mécanisme est le suivant :
    216  * Tous les processeurs exécutent le même ''code de boot, mais l'exécution de ce code dépend de l'index du processeur. L'index du processeur (''proc_id'') étant stocké dans un registre système (registre $15 pour le processeur MIPS32), sa valeur peut être testée par le logiciel. Cette valeur est initialisée par le constructeur, ce qui modélise une valeur ''cablée'' lors de la fabrication de la puce.
     218 * Tous les processeurs exécutent le même ''code de boot, mais l'exécution de ce code dépend de l'index du processeur. L'index du processeur (''proc_id'') étant stocké dans le registre système ($15, 1) du processeur MIPS32, sa valeur peut être testée par le logiciel. Remarquez que la valeur de ce registre est initialisée par le constructeur, ce qui modélise une valeur ''cablée'' lors de la fabrication de la puce.
    217219 * Les tâches s'exécutant en parallèle, chaque tâche (et donc chaque processeur) doit disposer de sa propre pile d'exécution. On définit un seul segment pour les différentes piles d'exécution, mais les ponteurs de pile des différents processeurs doivent  être initialisés à des  valeurs différentes en fonction du ''proc_id''.
    218  * Chaque tâche correspondant à un programme utilisateur différent, les points d'entrée de chaque tache (registre EPC dans le cas du MIPS32) doivent être initialisées à des valeurs différentes (main_0, main_1, main_2, etc...) en fonction du ''proc_id''.
    219 
    220 '''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 taille minimale du segment de pile défini dans la table des segments de la top-cell?
    221 
    222 '''Question''' : Modifiez le fichier '''reset.s''' pour initialiser le point d'entrée (registre EPC dans le cas du MIPS32) à une valeur dépendant du ''proc_id''. On définira une table de sauts indexé par le proc_id et contenant les adresses ''main_0'' à ''main_7''. Ces adresses correspondent aux 8 point d'entrée de 8 programmes utilisateurs susceptibles de s'exécuter sur l'architecture multi-processeurs.
    223 
    224 '''Question''' : Modifiez le fichier '''Makefile''' du répertoire '''soft''' pour que soient compilés le fichier '''teset.s''' ainsi modifié, et les deux programmes '''main_0.c''' et '''main_1.c''' de la section 4.
    225 
    226 '''Question''' : Lancez l'exécution sur le simulateur  '''simulator_multi.x''', avec 2 processeurs. 
    227 
    228 == 5.3 Exécution paralléle de programmes non-coopératifs ==
    229 
    230 On souhaite pour commencer lancer l'exécution parallèle des deux programmes main_0 et main_1 définis précédemment sur une architecture à deux processeurs.
    231 
    232 '''Question''' : Modifiez le fichier '''Makefile''' du répertoire '''soft''' pour générer le logiciel embarqué, puis lancez la simulation sur une architecture à 2 processeurs.
    233 
    234 == 5.4 Programme coopératif multi-tâches ==
     220 * Chaque processeur exécutant un programme utilisateur différent, le points d'entrée du programme utilisateur  (registre EPC dans le cas du MIPS32) doit être initialisé à une valeur différentedépendant du proc_id  (main_0, main_1, main_2, ... main_7).
     221
     222== 5.3 Exécution parallèle sur architecture bi-processeurs ==
     223 
     224On commence par générer le code binaire pour une architecture comportant seulement 2 processeurs,
     225de façon à exécuter en parallèle des deux programmes ''main_0'' et ''main_1'' définis dans la section précédente.
     226On s'efforcera cependant que ce code de boot soit facilement extensible pour s'adapter à des architectures contenant plus de 2 processeurs
     227
     228'''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?
     229
     230'''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...
     231
     232'''Question''' : Modifiez le fichier '''reset.s''' pour initialiser le point d'entrée (registre EPC dans le cas du MIPS32) à une valeur dépendant du ''proc_id''. On définira une table de sauts indexé par le proc_id et contenant les adresses des deux programmes ''main_0'' à ''main_1''. Une table de saut est facilement extensible si on a plus de 2 processeurs.
     233
     234'''Question''' : Modifiez le fichier '''Makefile''' du répertoire '''soft''' pour que soient compilés le fichier '''reset.s''' ainsi modifié, ainsi que les deux programmes '''main_0.c''' et '''main_1.c'''.
     235
     236'''Question''' : Modifiez dans le fichier '''ldscript''' la variable qui informe le ssystème d'exploitation du nombre de
     237processeurs présents dans l'architecture matérielle.
     238
     239'''Question''' : Compilez le logiciel embarqué, puis lancez l'exécution sur le simulateur  '''simulator_multi.x''', avec 2 processeurs. 
     240
     241== 5.4 Exécution parallèle sur architecture octo-processeurs ==
     242
     243On souhaite maintenant exécuter huit programmes en parallèle sur 8 processeurs.
     244
     245'''Question''' : Ecrivez six autres petits programmes ''main_2'' à ''main_7''. Si vous manquez d'imagination, vous pouvez vous contenter de dé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.
     246
     247'''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. 
    235248
    236249= 6 Compte-rendu =