{{{#!html

INDEX

}}} [[PageOutline]] **DOCS** → [__**[wiki:Howto-TP Config]**__] [__**[htdocs:cours/doc_MIPS32.pdf MIPS U]**__] [__**[wiki:Doc-MIPS-Archi-Asm-kernel MIPS K]**__] [__**[http://support.typora.io/Markdown-Reference markdown]**__] [__**[htdocs:files/CR031_TPx_Nom1_Nom2.md.tgz CR.md]**__] \\**COURS** → [__**[htdocs:cours/Archi-2-B1-reboot-2p.pdf 1]**__ __([htdocs:cours/Archi-2-B1-code-2p.pdf +code]__) __([htdocs:cours/Archi-2-B1-outils-2p.pdf +outils]__)] [__**[htdocs:cours/Archi-2-B2-interruptions-2p.pdf 2]**__] [__**[htdocs:cours/Archi-2-B3-cache-archi-2p.pdf 3]**__] [__**[htdocs:cours/Archi-2-B4-cache-perf-2p.pdf 4]**__] [__**[htdocs:cours/Archi-2-B5-threads-2p.pdf 5]**__] [__**[htdocs:cours/Archi-2-B6-alloc-2p.pdf 6]**__] [__**[htdocs:cours/Archi-2-B7-synchro-2p.pdf 7]**__] [__**[htdocs:cours/Archi-2-B8-initiateurs-2p.pdf 8]**__] [__**[htdocs:cours/Archi-2-B9-ZDL-2p.pdf 9]**__] \\**TME → ** [__**[wiki:AS6-TME-B1 1]**__] [__**[wiki:AS6-TME-B2 2]**__] [__**[wiki:AS6-TME-B3 3]**__] [__**[wiki:AS6-TME-B4 4]**__] [__**[wiki:AS6-TME-B5 5]**__] [__**[wiki:AS6-TME-B6 6]**__] [__**[wiki:AS6-TME-B7 7]**__] [__**[wiki:AS6-TME-B8 8]**__] [__**[wiki:AS6-TME-B9 9]**__] \\**CODE → ** [__**[htdocs:files/kO6a2bin.tgz gcc + soc]**__] [__**[htdocs:files/tp1.tgz 1]**__] [__**[htdocs:files/tp2.tgz 2]**__] [__**[htdocs:files/tp3.tgz 3]**__] [__**[htdocs:files/tp4.tgz 4]**__] [__**[htdocs:files/tp5.tgz 5]**__] [__**[htdocs:files/tp6.tgz 6]**__] [__**[htdocs:files/tp7.tgz 7]**__] [__**[htdocs:files/tp8.tgz 8]**__] [__**[htdocs:files/tp9.tgz 9]**__] {{{#!html

8 - Périphériques initiateurs }}} {{{#!protected Pas de question de cours cette fois. Je vais vous demander de lire et de commenter dans le compte-rendu les codes proposés. -- 01_sequentiel [[Image(htdocs:img/image-seq.png,nolink,left,height=230)]] Dans cette version, il n'y a pas d'OS, tout est fait dans la fonction `kinit()` Les trois étapes (lecture disque, traitement, affichage) sont faites séquentiellement - Ouvrez le code pour voir la boucle de traitement. - Faites tourner la simulation, la durée de chaque étape s'affichent. Que pouvez-vous en conclure ? - Essayez de retirer les invalidations du cache (dans `harch.c`), observez et expliquer le comportement. - Expliquez l'usage des couples de variables globales (`BDBusy` et `BDLock`) et (`DMABusy` et `DMALock`) utilisées pour la synchronisation des étapes. -- 02_parallel [[Image(htdocs:img/image-parallel.png,nolink,left,height=230)]] Dans cette version, les trois étapes sont faites en parallèle sous la forme d'un pipeline avec deux couples de buffer utilisés en altenance. - Disk->BD->BUFIN[0] - Disk->BD->BUFIN[1] & BUFIN[0]->CPU->BUFOUT[O] - Disk->BD->BUFIN[0] & BUFIN[1]->CPU->BUFOUT[1] & BUFOUT[0]->DMA->FBF - Disk->BD->BUFIN[1] & BUFIN[0]->CPU->BUFOUT[0] & BUFOUT[1]->DMA->FBF - Disk->BD->BUFIN[0] & BUFIN[1]->CPU->BUFOUT[1] & BUFOUT[0]->DMA->FBF - Disk->BD->BUFIN[1] & BUFIN[0]->CPU->BUFOUT[0] & BUFOUT[1]->DMA->FBF - Disk->BD->BUFIN[0] & BUFIN[1]->CPU->BUFOUT[1] & BUFOUT[0]->DMA->FBF - Disk->BD->BUFIN[1] & BUFIN[0]->CPU->BUFOUT[0] & BUFOUT[1]->DMA->FBF - etc. Questions - Qu'est ce qu'on gagne à procéder ainsi ? - Est-ce qu'on peut gagner plus ? ## 03_multicore Dans cette version, on utilise plusieurs cores pour faire le calcul en parallèle - Que peut-on espérer gagner ? - Utilisez de 1 à 8 cores et tracer une courbe de speedup ? Qu'en concluez-vous ? (notez que la simulation se fige acutuellement mais je n'ai pas eu le temps de débugger...) - Expliquez le rôle de la variable working. - Retirez l'invalidation du cache de la fonction compute(), observez et expliquez. - Pourquoi certaines parties ne doivent être traitées que par le CPU 0 ?