Changes between Version 19 and Version 20 of MjpegCourse/Coproc


Ignore:
Timestamp:
Mar 6, 2007, 8:09:19 PM (17 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • MjpegCourse/Coproc

    v19 v20  
    5555[[Image(MjpegCourse:q.gif)]] Q1.  Rappelez le temps
    5656nécessaire pour décoder 25 images, dans le cas d'un déploiement
    57 utilisant 2 processeurs, lorsque la tâche {{{idct}}} est placée sur le premier processeur,
     57utilisant 3 processeurs, lorsque la tâche {{{idct}}} est placée sur le premier processeur,
    5858que la tâche {{{vld}}} est placée sur le second processeur,
    5959et que toutes les autres tâches logicielles se partagent le troisième processeur.
     
    6868et ce nombre est inversement proportionnel au temps de calcul.
    6969
    70 Pour éviter de gaspiller du silicium, il faut donc - avant de se lancer dans la synthèse - évaluer précisément
     70Pour éviter de gaspiller du silicium, il faut - avant de se lancer dans la synthèse - évaluer précisément
    7171la puissance de calcul requise pour le coprocesseur, une fois celui-ci placé
    7272dans son environnement de travail. Il faut donc faire de l'exploration
     
    7878Pour ce qui concerne le matériel, ce composant ''threader'' s'interface avec le composant matériel
    7979''contrôleur MWMR'', mais il est également capable de communiquer avec la tâche logicielle {{{idct}}},
    80 de façon a utiliser ce code pour effectuer les calculs qui devront être réalisés par le
     80de façon a utiliser le code existant - sans modification - pour effectuer les calculs qui devront être réalisés par le
    8181coprocesseur matériel.
    8282En pratique, la simulation dans ce mode consiste à exécuter un programme parallèle comportant
     
    9090 * 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, il 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.
    9191{{{
    92 idct = TaskModel(
    93                 'idct',
    94                 infifos = [ 'input' ],
    95                 outfifos = [ 'output' ],
    96                 impl = [ SwTask( 'idct',
    97                                                  stack_size = 1024,
    98                                                  sources = [ 'src/idct.c' ],
    99                                                  defines = [ 'WIDTH', 'HEIGHT','EXEC_TIME' ] ),
    100                        SyntheticTask()   ] )
     92idct = TaskModel( 'idct',
     93        infifos = [ 'input' ],
     94        outfifos = [ 'output' ],
     95        impl = [ SwTask( 'idct',
     96                       stack_size = 1024,
     97                       sources = [ 'src/idct.c' ],
     98                       defines = [ 'WIDTH', 'HEIGHT','EXEC_TIME' ] ),
     99                SyntheticTask() ] )
    101100}}}
    102101 * La valeur du paramètre  EXEC_TIME doit être définie au moment où on instancie la tâche {{{idct}}} dans le TCG.
    103102{{{
    104103Task( 'idct0' , idct ,
    105                 portmap = {    'output':idct_libu,
    106                                 'input' :iqzz_idct },
    107                 defines = {     'XSIZE':'48', 'YSIZE':'48', 'EXEC_TIME':'64'} )
     104        portmap = { 'output':idct_libu,
     105                    'input' :iqzz_idct },
     106        defines = {     'XSIZE':'48', 'YSIZE':'48', 'EXEC_TIME':'64'} )
    108107}}}
    109108 * 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}}}.
     
    112111}}}
    113112
    114 Le coprocesseur matériel IDCT (comme beaucoup de coprocesseurs matériels de type ''flot de données'')
     113Le coprocesseur matériel IDCT (comme beaucoup de coprocesseurs matériels orientés "flot de données'")
    115114exécute une boucle infinie dans laquelle il effectue successivement les actions suivantes:
    116115 1. recopie d'un bloc de 64 coefficients du canal MWMR d'entrée vers une mémoire locale BUFIN,
     
    126125
    127126Le 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,
     127défini par la valeur du paramètre EXEC_TIME, mais si on ne modifie pas le code C de la tâche {{{idct}}}, ce calcul sera effectué
     128"en temps nul" du point de vue du matériel.
     129Pour préciser le nombre de cycles d'exécution pour l'étape 2, il faut modifier le code C de la tâche {{{idct}}}, et insérer,
    130130entre les deux primitives ''srl_mwmr_read()'' et ''srl_mwmr_write()'',
    131 un appel à la  la fonction bloquante ''srl_busy_cycles()''. {{{
     131un appel à la  la fonction bloquante ''srl_busy_cycles()''.
     132{{{
    132133srl_mwmr_read();
    133134...