| 14 | | |
| | 14 | |
| | 15 | Nous allons nous concentrer sur la traduction en matériel de la tâche la plus gourmande |
| | 16 | en ressources du TCG: la tâche `Idct`. |
| | 17 | |
| | 18 | Nous repartirons de la plateforme du [MjpegCourse/Multiproc TP3]: [MjpegCourse/VgmnNoirqMulti VgmnNoirqMulti]. |
| | 19 | Sur la base de cette plateforme à deux processeurs Mips, nous ajouterons un composant dédié au traitement de l'`Idct`. |
| | 20 | |
| | 21 | Reprenez les fichiers du TP2: |
| | 22 | * La description de la plateforme |
| | 23 | * La description de l'application |
| | 24 | * Le code des tâches (`Libu` ne gère qu'un seul pipeline et `Split` n'existe pas) |
| | 25 | |
| | 26 | [[Image(MjpegCourse:q.gif)]] Pour un déploiement entièrement logiciel, quel est le temps |
| | 27 | nécessaire pour décoder 25 images ? |
| | 28 | |
| | 29 | = 1. Tâche matérielle virtuelle = |
| | 30 | |
| | 31 | == 1.1. Déploiement == |
| | 32 | |
| | 33 | Ici, la tâche sera virtuellement matérielle dans le sens où nous utiliserons le code |
| | 34 | C de notre tâche pour implémenter le comportement matériel de l'`Idct`. |
| | 35 | |
| | 36 | Ajoutez une déclaration à la tâche `idct`: |
| | 37 | {{{ |
| | 38 | idct = TaskModel( |
| | 39 | 'idct', |
| | 40 | infifos = [ 'input' ], |
| | 41 | outfifos = [ 'output' ], |
| | 42 | impl = [ SwTask( 'idct', |
| | 43 | stack_size = 1024, |
| | 44 | sources = [ 'src/idct.c' ], |
| | 45 | defines = [ 'WIDTH', 'HEIGHT' ] ), |
| | 46 | Synthetic() |
| | 47 | ] ) |
| | 48 | }}} |
| | 49 | L'implémentation `Synthetic()` doit être accompagnée d'une déclaration de tâche logicielle |
| | 50 | (`SwTask`) et permet la synthèse virtuelle de la tâche. On peut alors déployer la tâche comme si |
| | 51 | elle était matérielle, son comportement est simulé. |
| | 52 | |
| | 53 | [[Image(MjpegCourse:q.gif)]] Avec cette tâche déployée en coprocesseur virtuel, quel est le temps |
| | 54 | nécessaire pour décoder 25 images ? |
| | 55 | |
| | 56 | == 1.2. Précision temporelle == |
| | 57 | |
| | 58 | Pour rendre la tâche matérielle virtuelle plus exacte en temps de simulation, on peut ajouter des directives |
| | 59 | dans le code source des tâches pour préciser le temps qu'il faudrait pour réaliser la même action en matériel: |
| | 60 | `srl_busy_cycles` (voir SrlApi). |
| | 61 | |
| | 62 | Insérez dans le code de votre `Idct` un temps de traitement de 8 cycles entre la lecture entière d'un bloc et |
| | 63 | l'écriture du résultat. |
| | 64 | |
| | 65 | [[Image(MjpegCourse:q.gif)]] Quel est le temps de simulation nécessaire pour 25 images ? |
| | 66 | |
| | 67 | = 2. Tâche matérielle = |
| | 68 | |
| | 69 | Maintenant nous allons utiliser un coprocesseur dédié au traitement de l'`Idct`. |
| | 70 | |
| | 71 | Remplacez la déclaration `Synthetic()` par une déclaration de coprocesseur matériel `HwTask( IdctCoproc )`. |
| | 72 | |
| | 73 | [[Image(MjpegCourse:q.gif)]] Quel est le temps de simulation nécessaire pour 25 images ? |
| | 74 | |
| | 75 | [[Image(MjpegCourse:q.gif)]] Qu'en déduisez-vous sur la différence entre les deux possibilités pour tester |
| | 76 | une implémentation matérielle ? |
| | 77 | |
| | 78 | [[Image(MjpegCourse:q.gif)]] Quel intérêt y a-t-il à pouvoir caractériser précisément le temps de traitement |
| | 79 | d'une tâche matérielle à partir d'un code en C ? |
| | 80 | |
| | 81 | = 3. Compte-Rendu = |
| | 82 | |
| | 83 | Comme pour les TP précédents, vous rendrez une archive contenant: |
| | 84 | {{{ |
| | 85 | $ tar tzf binome0_binome1.tar.gz |
| | 86 | tp5/ |
| | 87 | tp5/rapport.pdf |
| | 88 | tp5/vgmn_noirq_multi.py |
| | 89 | tp5/mjpeg/ |
| | 90 | tp5/mjpeg/mjpeg.py |
| | 91 | tp5/mjpeg/src/ |
| | 92 | tp5/mjpeg/src/iqzz.c |
| | 93 | tp5/mjpeg/src/idct.c |
| | 94 | tp5/mjpeg/src/libu.c |
| | 95 | }}} |
| | 96 | |
| | 97 | Cette archive devra être livrée avant le mardi 13 mars 2007, 18h00 à [MailAsim:nipo Nicolas Pouillon] |