christophe_d13 L'efficacité à tout prix. | Sur le plan purement théorique (et pratique)
- Le saut vide le pipe.
- L'AGI stall recommence à zéro.
l'exemple simple...
Code :
- loop:
- mov eax, [ebx+esi]
- ...
- sub esi, 4
- jnz loop
|
Dans cet exemple, on va avoir un AGI stall sur mov eax, [esi+ebx] Sa durée est de 2 à 3 cycles (parfois plus suivant la distance à laquelle se trouve la donnée).
Le fait de dérouler une boucle permet de multipler la vitesse dans des cas utilisant la mémoire de façon linéaire et intensive (FFT, copy, transfert, échange) :
Code :
- loop:
- movq mm0, [esi+eax]
- movq mm1, [esi+eax+8]
- movq [edi+eax+8], mm0
- movq [edi+eax], mm1
- add eax, 16
- js loop
|
Si on déroule...
Code :
- loop:
- movq mm0, [esi+eax]
- movq mm4, [esi+eax+32]
- movq mm2, [esi+eax+16]
- movq mm6, [esi+eax+48]
- movq mm1, [esi+eax+8]
- movq mm5, [esi+eax+40]
- movq mm3, [esi+eax+24]
- movq mm7, [esi+eax+56]
- movq [edi+eax], mm1
- movq [edi+eax+8], mm0
- movq [edi+eax+16], mm3
- movq [edi+eax+24], mm2
- ...
- movq [edi+eax+56], mm6
- add eax, 64
- js loop
|
Message édité par christophe_d13 le 06-09-2005 à 10:59:03 ---------------
http://www.ikalizer.fr
|