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] |