non, pas vraiment, ca arrve quand l'operation suivante depend de la completion de l'operation precedente
lorsque tu fais :
a = 1
a ++;
tu peux commencer dans le pipeline deux operations a = 1 puis immediatement lancer l'operation suivante sans attendre la fin. le probleme c'est que la deuxdieme operation relit la valeur de a (load) et doit attendre la fin de l'operation.
comme je l'ai expliqué plus haut, dans le cas que l'on a vu plus haut on avait pas un reel probleme de store to load mais simplement le processeur le croyait du a l'alignement des cibles et sources. les operations etaient independantes mais ont ete percues comme dependantes.
L'aliasing maintenant, c'est lorsqu'une operation peut affecter une variable a priori non liée car elles pointes en fait sur le meme emplacement; le compilateur suppose toujours que deux variables peuvent etre liées sauf si il peut demontrer qu'elles ne le sont pas (par exemple, si l'une d'entre elle est sur la pile locale et pas l'autre, si elles ne sont pas de meme type, etc)
dans le cas ou il ne peut pas le determiner, il devra recharger la valeur de la variable depuis son emplacement memoire pares une operation sur une autre variable; et il ne pourra pas reordonner les operations non plus.
c'est un phénomène tout a fait different; cela voudrait dire par exemple, que le code suivant ne peut pas etre optimisé :
1 2 3 4 5
| for (int i =1500;i<size-1500;i++)
{
//on fait une copie avec un décalage s
tab1[i] = tab2[1500];
} |
car a force de taper dans tab1[] on pourrait changer des variables qui sont dans tab2, et il faut donc verifier que tab2 n'a pas changer.
voila le code assembleur genere par visual c++ :
1 2 3
| tab1[i] = tab2[1500];
00401400 mov edi,dword ptr [esi+1770h]
00401406 mov dword ptr [edx+eax*4],edi |
comme tu peux le voir, il relit toujours tab2[1500] depuis la memoire.
en aidant un peu le compilateur (en stockant dans une variable locale par exemple), voila le nouveau code genere :
00401401 mov dword ptr [esi+eax*4],ecx
ecx etant constant.
Partager