Changes between Version 16 and Version 17 of MjpegCourse/Coproc
- Timestamp:
- Mar 6, 2007, 6:58:52 PM (18 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
MjpegCourse/Coproc
v16 v17 87 87 == mettre ici le dessin contenant le threader == 88 88 89 Pour utiliser un tel coprocesseur ''virtuel'', il faut modifier deuxchoses dans la description DSX:90 * dans la définition du modèle de la tâche {{{idct}}}, il faut ajouter l'implémentation `SyntheticTask()` 89 Pour utiliser un tel coprocesseur ''virtuel'', il faut modifier trois choses dans la description DSX: 90 * dans la définition du modèle de la tâche {{{idct}}}, il faut ajouter l'implémentation `SyntheticTask()`. Le coprocesseur matériel étant paramètrable, ill faut également définir un nouveau paramètre `EXEC_TIME` dans la liste des paramètres de la tâche {{{idct}}}. Ce paramètre permet de spécifier le nombre de cycles utilisés par le coprocesseur matériel pour effectuer la transformation IDCT d'un bloc de 64 pixels. 91 91 {{{ 92 92 idct = TaskModel( … … 97 97 stack_size = 1024, 98 98 sources = [ 'src/idct.c' ], 99 defines = [ 'WIDTH', 'HEIGHT' ] ), 100 SyntheticTask() ] ) 99 defines = [ 'WIDTH', 'HEIGHT','EXEC_TIME' ] ), 100 SyntheticTask() ] ) 101 }}} 102 * La valeur du paramètre EXEC_TIME doit être définie au moment où on instancie la tâche {{{idct}}} dans le TCG. 103 {{{ 104 Task( 'idct0' , idct , 105 portmap = { 'output':idct_libu, 106 'input' :iqzz_idct }, 107 defines = { 'XSIZE':'48', 'YSIZE':'48', 'EXEC_TIME':'64'} ) 101 108 }}} 102 109 * Dans la partie déploiement, il faut déployer la tâche {{{idct}}} comme une tâche matérielle (comme on l'a fait pour les tâches {{{ramdac}}} ou {{{tg}}}. … … 105 112 }}} 106 113 107 Après synthèse, le coprocesseur matériel IDCT (comme beaucoup de coprocesseurs matériels de type ''flot de données'')114 Le coprocesseur matériel IDCT (comme beaucoup de coprocesseurs matériels de type ''flot de données'') 108 115 exécute une boucle infinie dans laquelle il effectue successivement les actions suivantes: 109 116 1. recopie d'un bloc de 64 coefficients du canal MWMR d'entrée vers une mémoire locale BUFIN, … … 111 118 1. recopie de ces 64 pixels de la mémoire locale BUFOUT vers le canal MWMR de sortie. 112 119 113 [[Image(MjpegCourse:q.gif)]] Q2. Combien de coefficients sont transférés par cycle sur l'interface FIFO d'entrée? Combien de pixels sont114 transférés par cycle sur l'interface FIFO de sortie? En déduire les durées minimales (en nombre de cycles) pour les étapes 1 et 3 ci-dessus.115 116 120 Les temps de communication correspondant aux étapes 1 et 3 sont précisément décrits par le simulateur SystemC, 117 121 qui reproduit (cycle par cycle) le comportement des interfaces FIFO entre le threader et le contrôleur MWMR 118 122 (y compris en cas de contention pour l'accès à la mémoire). 119 123 120 En revanche, le nombre de cycles nécessaires pour exécuter l'étape 2 ci-dessus (temps de calcul "interne" à la tâche logicielle) 121 n'est pas défini par le code de la tâche logicielle. Si on ne précise rien, cela correspond à un temps d'exécution du calcul 122 en "zéro" cycles. Pour préciser un nombre de cycles d'exécution, il faut modifier le code C de la tâche {{{idct}}}, et insérer, 124 [[Image(MjpegCourse:q.gif)]] Q2. Combien de coefficients sont transférés par cycle sur l'interface FIFO d'entrée? Combien de pixels sont 125 transférés par cycle sur l'interface FIFO de sortie? En déduire les durées minimales (en nombre de cycles) pour les étapes 1 et 3 ci-dessus. 126 127 Le nombre de cycles nécessaires pour exécuter l'étape 2 ci-dessus (temps de calcul pour un bloc de 64 pixels) est 128 défini par la valeur du paramètre EXEC_TIME. Si on ne précise rien, cela correspond à un temps d'exécution de "zéro" cycles. 129 Pour préciser un nombre de cycles d'exécution, il faut modifier le code C de la tâche {{{idct}}}, et insérer, 123 130 entre les deux primitives ''srl_mwmr_read()'' et ''srl_mwmr_write()'', 124 un appel à la la fonction bloquante ''srl_busy_cycles(ncycles)''. L'argument ''ncycles'' est le nombre de cycles d'attente entre les 125 deux primitives de communication, et il modélise donc le temps de calcul (voir SrlApi). 126 {{{ 131 un appel à la la fonction bloquante ''srl_busy_cycles()''. {{{ 127 132 srl_mwmr_read(); 128 133 ... 129 srl_busy_cycles( n);134 srl_busy_cycles( EXEC_TIME ); 130 135 ... 131 136 srl_mwmr_write(); 132 137 }}} 138 L'argument EXEC_TIME définit le nombre de cycles d'attente entre les 139 deux primitives de communication, et modélise donc le temps de calcul (voir SrlApi). 133 140 134 141 [[Image(MjpegCourse:q.gif)]] Q3. pour quelle raison peut-on affirmer sans aucune expérimentation (c'est à dire sans aucune simulation),