Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Pipeline matériel
1er Exemple :
Somme des produits
Exemple 1 : Fonction permettant de calculer la somme
de produits 39
Y = ∑a
i=0
i bi
1
1er Exemple
Code C Code Assembleur
MVK .S 40, A2
void somme_produit(unsigned char a[40],
unsigned char b[40]) loop: LDH .D *A5++, A0
{ LDH .D *A6++, A1
int x;
int y=0; MPY .M A0, A1, A3
ADD .L A4, A3, A4
for(x=0 ; x < 40 ; x++ )
y = y + (a[x] * b[x]);
SUB .L A2, 1, A2
} [A2] B .S loop
Incrémenter le
pointeur après
chaque chargement STH .D A4, *A7
1er Exemple
MVK .S 40, A2
Paquet Fetch : contient 8 instructions de loop: LDH .D *A5++, A0
32 bits chacune. LDH .D *A6++, A1
2
1er Exemple
Cycle = 4
Cycle = 5
PF Decode Execute Done
PF DP DC E1 E2 E3 E4 E5 E6 √
MVK
LDH
LDH
MPY
ADD
SUB
B
STH
1er Exemple
Cycle = 6
PF Decode Execute Done
PF DP DC E1 E2 E3 E4 E5 E6 √
MVK
LDH
LDH
MPY
ADD
SUB
B
STH
Cycle = 7
PF Decode Execute Done
PF DP DC E1 E2 E3 E4 E5 E6 √
MVK
LDH
LDH
MPY
ADD
SUB
B
STH
3
1er Exemple
Cycle = 8
PF Decode Execute Done
PF DP DC E1 E2 E3 E4 E5 E6 √
MVK
LDH
LDH
MPY
ADD
SUB
B
STH
Cycle = 9
PF Decode Execute Done
PF DP DC E1 E2 E3 E4 E5 E6 √
MVK
LDH
LDH
MPY
ADD
SUB
B
STH
1er Exemple
Cycle = 10
PF Decode Execute Done
PF DP DC E1 E2 E3 E4 E5 E6 √
MVK
LDH
LDH
MPY
ADD
SUB
B
STH
Cycle = 11
PF Decode Execute Done
PF DP DC E1 E2 E3 E4 E5 E6 √
MVK
LDH
LDH
MPY
ADD
SUB
B
STH
4
1er Exemple
Cycle = 12
MVK .S 40, A2
PF Decode Execute Done
loop: LDH .D *A5++, A0
PF DP DC E1 E2 E3 E4 E5 E6 √
LDH .D *A6++, A1
MVK
LDH
LDH
MPY .M A0, A1, A3
FP2 MPY ADD .L A4, A3, A4
ADD SUB .L A2, 1, A2
SUB
B [A2] B .S loop
STH
STH .D A4, *A7
1er Exemple
Code assembleur simple :
MVK.S1 40, A2 ; Initialiser le compteur de la boucle
MVK.S1 0, A4 ; Initialiser l’accumulateur à 0
loop LDH .D1 *A5++, A0 ; Charger a[i]
LDH .D1 *A6++, A1 ; Charger b[i]
5
1er Exemple
Code assembleur simple avec NOP :
MVK.S1 40, A2 ; Initialiser le compteur de la boucle
MVK.S1 0, A4 ; Initialiser l’accumulateur à 0
loop LDH .D1 *A5++, A0 ; Charger a[i]
LDH .D1 *A6++, A1 ; Charger b[i]
NOP 4 ; Attendre fin du chargement
MPY.M1 A0, A1, A3 ; Multiplier a[i] et b[i]
NOP ; Attendre la multiplication
ADD .L1 A4, A3, A4 ; Accumuler la somme a[i] x b[i]
SUB .L1 A2, 1, A2 ; Décrémenter le compteur de la boucle
[A2] B .S1 loop ; Branchement à loop
NOP 5 ; Attendre la fin de la boucle
STH .D1 A4, *A7 ; Stocker la valeur finale
D1
1er Exemple
MVK.S1 40, A2
1ére méthode MVK.S1 0, A4 2ème méthode
5 loop LDH .D1 *A5++, A0 1
1 LDH .D1 *A6++, A1 1
0 NOP 4 4
2 MPY.M1 A0, A1, A3 1
0 NOP 1
1 ADD .L1 A4, A3, A4 1
1 SUB .L1 A2, 1, A2 1
6 [A2] B .S1 loop 1
0 NOP 5 5
16 cycles = STH .D1 A4, *A7 = 16 cycles
6
Techniques d’optimisation
A fin d’optimiser un code, il faut :
7
1ére étape : Utiliser les instructions en parallèles
Cycle
.D1 .D2 .M1 .M2 .L1 .L2 .S1 .S2 NOP
1 ldh ldh
2 nop
3 nop
4 nop
5 nop
6 mpy
7 nop
8 add
9 loop LDH .D1 *A5++, A0 sub
10 ||LDH .D2 *B6++, B1 b
11 NOP 4 nop
12 MPY .M1x A0, B1, A3 nop
NOP Nombre de cycles de
13 nop
14
ADD .L1 A4, A3, A4 la boucle = nop
SUB .L1 A2, 1, A2
15 [A2] B .S1 loop 15 x 40 = 600 cycles nop
16
Chapitre 5 Cours DSP 15
8
2éme étape : Supprimer les NOP
Cycle
.D1 .D2 .M1 .M2 .L1 .L2 .S1 .S2 NOP
1 ldh ldh
2 sub
3 b
4 nop
5 nop
6 mpy
7 nop
8 add
9
loop LDH .D1 *A5++, A0
10
||LDH .D2 *B6++, B1
11
SUB .L1 A2, 1, A2
12 [A2] B .S1 loop Nombre de cycles de
13 NOP 2 la boucle =
14 MPY .M1x A0, B1, A3
15 NOP 8 x 40 = 320 cycles
16 ADD .L1 A4, A3, A4
Chapitre 5 Cours DSP 17
9
3éme étape : Chargement par mot ou double mots
En utilisant un chargement par mot (32 bits), on va
utiliser les instructions MPY et MPYH :
10
2ème Exemple : SAD
Un deuxième exemple qui consiste à déterminer la fonction SAD (Sum of
Absolute Difference) qui est très utilisée en traitement d’image et vidéo :
int x;
11
FIN
Chapitre 5
12