Changes between Initial Version and Version 1 of Partiel2012


Ignore:
Timestamp:
Nov 28, 2013, 3:39:00 PM (11 years ago)
Author:
meunier
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Partiel2012

    v1 v1  
     1
     2= Architecture des processeurs et optimisation =
     3
     4== Novembre 2012 - Documents autorisés - Durée 2h ==
     5
     6
     7Utiliser impérativement les feuilles quadrillées fournies pour les schémas simplifiés.
     8
     9Une réponse non justifiée sera considérée comme fausse.
     10
     11On considère le processeur pipeline P9. Ce processeur a le même jeu d'instructions que le Mips. Il est construit autour d'un pipeline à 9 étages :
     12`IF1`, `IF2`, `DEC1`, `DEC2`, `EXE1`, `EXE2`, `MEM1`, `MEM2`, `WBK`
     13Le découpage en étages de ce pipeline a été obtenu à partir du pipeline du processeur Mips. Chacun des étages `IFC`, `DEC`, `EXE` et `MEM` a été divisé en deux étages.
     14
     15Cependant, le calcul de l'adresse de l'instruction suivante commence dans l'étage `EXE1` s'achève dans l'étage `EXE2`.
     16
     17La réalisation contient tous les bypasses nécessaires pour prendre en charge les dépendances de données. Cependant il n’y a aucun bypass vers l’étage `MEM1`.
     18
     19On souhaite étudier la performance d'exécution d’une fonction de calcul de distance sur cette réalisation.
     20
     21On considère la fonction `Dist`. Cette fonction prend en entrée un tableau d'entiers x et calcule la valeur des éléments d'un tableau y tel que y(i) = |x(i) - x(i+1)|
     22{{{
     23#!c
     24   void Dist(int * x, int * y, int size) {
     25      int i;
     26      for (i = 0; i != size - 1; i++) {
     27         if (x[i] < x[i + 1]) {
     28            y[i] = x[i + 1] - x[i];
     29         }
     30         else {
     31            y[i] = x[i] - x[i + 1];
     32         }
     33      }
     34   }
     35}}}
     36
     37On a obtenu deux versions différentes pour le code de la boucle principale de `Dist` en assembleur Mips non pipeline.
     38
     39On suppose qu'à l'entrée de la boucle le registre `R4` contient l'adresse du tableau `x`, `R5` l'adresse du tableau `y`, et `R6` l'adresse du dernier élément du tableau `x`.
     40
     41'''Version 1 :'''
     42{{{
     43#!asm
     44Loop:
     45    Lw    r8 , 0 (r4 )    ; x[i]
     46    Lw    r9 , 4 (r4 )    ; x[i + 1]
     47    Sub   r10, r8, r9
     48    Bgez  r10, _Endif
     49    Sub   r10, r9 , r8
     50
     51_Endif:
     52    Sw    r10, 0 (r5 )    ; y[i] = abs(x[i] - x[i + 1])
     53
     54    Addu  r5 , r5 , 4
     55    Addu  r4 , r4 , 4
     56    Bne   r4 , r6 , Loop
     57}}}
     58
     59'''Version 2 :'''
     60{{{
     61#!asm
     62Loop:
     63    Lw     r8,  0(r4)    ; x[i]
     64    Lw     r9,  4(r4)    ; x[i + 1]
     65    Sub    r10, r8,  r9
     66
     67    Slt    r11, r10, r0
     68    Sub    r12, r0,  r11
     69    Xor    r10, r10, r12
     70    Add    r10, r10, r11
     71
     72    Sw     r10, 0 (r5)   ; y[i] = abs(x[i] - x[i + 1])
     73    Addu   r5,  r5,  4
     74    Addu   r4,  r4,  4
     75    Bne    r4,  r6,  Loop
     76}}}
     77
     78
     79Dans tout l'exercice, on suppose que dans le tableau `x`, la probabilité que `x[i] < x[i + 1]` est de 40%.
     80
     81''1 - Le découpage du pipeline en 9 étages a-t-il un impact sur le compilateur ?''
     82
     83''2 - Dans le processeur Mips, il existe des dépendances de données d'ordre 1, 2 et 3. Dans P9 quelles sont les dépendances de données ?''
     84
     85''3 - Quels sont les bypass nécessaires à l'exécution des instructions dans ce P9 ? Illustrer pour chaque bypass son utilisation à l'aide d'un exemple d'une suite d'instructions.''
     86
     87''4 - Pour la Version 1, modifier le code de la boucle pour qu'il soit exécutable sur la réalisation P9. Analyser l'exécution de cette boucle à l'aide d'un schéma simplifié dans l'hypothèse où le branchement échoue. Calculer le nombre moyen de cycles par itération. Calculer le CPI et le CPI-utile.
     88
     89''5 - Pour la Version 2, modifier le code de la boucle pour qu'il soit exécutable sur la réalisation P9. Analyser l'exécution de cette boucle à l'aide d'un schéma simplifié. Calculer le nombre moyen de cycles par itération. Calculer le CPI et le CPI-utile.
     90
     91''6 - Pour chacune des deux versions, proposer un code optimisé en modifiant l'ordre des instructions. Il n'est pas nécessaire de faire un schéma mais d'indiquer simplement les cycles de gel sur le code après optimisation. Pour chacune des deux versions, calculer le nombre moyen de cycles par itération. Calculer le CPI et le CPI-utile.
     92
     93''7 - Pour chacune des deux versions, dérouler une fois le code de la boucle (traitement de 2 éléments à chaque itération) et optimiser. Il n'est pas nécessaire de faire un schéma mais d'indiquer simplement les cycles de gel sur le code après optimisation. Pour chacune des deux versions, calculer le nombre moyen de cycles par itération, le CPI et le CPI-utile.''
     94
     95''8 - Pour chacune des deux versions, optimiser le code de la boucle à l’aide de la technique ''software pipeline''. Décrivez clairement votre démarche. Précisez le nombre d’étages et les instructions qui composent chaque étage. Il n'est pas nécessaire de faire un schéma mais d'indiquer simplement les cycles de gel sur le code après optimisation. Pour chacune des deux versions, calculer le nombre moyen de cycles par itération, le CPI et le CPI-utile.''