cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 10 janv. 2011 à 22:58
Sur 64 bits:
.1
dec ecx
mov eax,[esi]
mov edx,[esi+4]
lea esi,[esi+8]
mov [edi],eax
mov [edi+4],edx
lea edi,[edi+8]
jne .1
ici, il n'y a aucun stall.
Une copie de 128 bits avec une seule instruction génèrera forcement un stall sur le jmp. Avec la prédiction de branchement, je ne suis pas sur que movdqa soit plus rapide. Là encore, la perte de mémoire est de 50%.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 10 janv. 2011 à 21:13
Tu ne me contredis pas car tu ne parles pas de l'utilisation.
Alloue 10000 fois 1 dword et compare 10000 movdqa puis 10000 mov reg32 (sans parler de la perte de mémoire induite). Ensuite alloue 1 fois 10000 dword et là d'accord.
Je n'ai pas trouvé le nombre de cycles utilisé par l'instruction movdqa et movdqu ni la page du forum masm qui en parle donc pas évident pour calculer quoi que ce soit.
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 10 janv. 2011 à 07:26
Desolé de te contredire , mais le gain à été verifié par des bancs d'essais (voir us masm forum) et c'est indiscutable.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 9 janv. 2011 à 21:36
en fait, le gain de vitesse n'est même pas certain car copier de la mémoire inutilisée n'est pas un gain de temps. Cela depends donc de l'utilisation.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 9 janv. 2011 à 21:22
oui, de même que la perte de mémoire est certaine aussi dans la plupart des cas.
l'instruction movdqu peut pallier au problème.
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 8 janv. 2011 à 14:52
avec movdqa , il n'y a pas 36 choix.
Ou l'adresse est un multiple de 16 ou on obtient un planté.
Le gain de rapidité est CERTAIN.L'astuce de programmation à utiliser est de traiter à part les data non alignés et d'utiliser movdqa pour celles qui le sont.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 7 janv. 2011 à 12:07
remarque qu'il serait aussi possible de faire l'alignement en commencant par un copy byte jusqu'a l'alignement 128 bits, puis copier par 128 bits pour finir par copy byte.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 7 janv. 2011 à 12:04
l'ennui est que cette instruction necessite un alignement obligatoire de 128 bits réel. les 4 bits de poids faible doivent être a zero sinon: exception.
Il est peut-etre plus simple dans le cas d'utilisation des instruction sse de tout aligner sur 128 bits.
Ton code n'as pas d'exemple a proprement parlé mais il est possible que Windows utilise des instructions 128 bits dans la gestion du heap.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 7 janv. 2011 à 11:47
C'est une optimisation que je ne trouves pas si interessante que cela car quand on copie, en général, on connait la taille de la copie.
je préfère un code du style:
size>>4
movdqa
size & 15
movsb
on perd moins de place tout en gardant l'optimisation fpu/sse,..
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 6 janv. 2011 à 19:42
ecx est utilisé comme pointeur sur wave pratiquement systématiquement dans le source traduit en asm par cl /Fa.
Je me suis contenté de le constater.
L'alignement 128 bits n'est pas utilisé dans ce source.
Pour le reste,un alignement (1,2,4..) est demandé explicitement par certaine structures et par certaines intructions (movdqa demande un alignement 16 bytes) .
Au dessus,je n'ai pas d'exemples.
L'intérêt est toujours le même,améliorer la vitesse d'execution en évitant de former des adresses byte par byte.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 5 janv. 2011 à 01:56
salut,
lea ecx,wave
call ??0CWaveFile@@QAE@XZ
il faut toujours prendre ecx ? On peut prendre n'importe quel registre ?
lea edx,wave
call ??0CWaveFile@@QAE@XZ
ça marche aussi ?
Qu'apporte l'alignement de 128 bits en terme d'optimisation par rapport à un alignement de 32 ou 64 bits ?
11 janv. 2011 à 17:21
http://www.masm32.com/board/index.php?topic=11061.0
tout y est ,code ,tests de rapidité ....
10 janv. 2011 à 22:58
.1
dec ecx
mov eax,[esi]
mov edx,[esi+4]
lea esi,[esi+8]
mov [edi],eax
mov [edi+4],edx
lea edi,[edi+8]
jne .1
ici, il n'y a aucun stall.
Une copie de 128 bits avec une seule instruction génèrera forcement un stall sur le jmp. Avec la prédiction de branchement, je ne suis pas sur que movdqa soit plus rapide. Là encore, la perte de mémoire est de 50%.
10 janv. 2011 à 21:13
Alloue 10000 fois 1 dword et compare 10000 movdqa puis 10000 mov reg32 (sans parler de la perte de mémoire induite). Ensuite alloue 1 fois 10000 dword et là d'accord.
Je n'ai pas trouvé le nombre de cycles utilisé par l'instruction movdqa et movdqu ni la page du forum masm qui en parle donc pas évident pour calculer quoi que ce soit.
10 janv. 2011 à 07:26
9 janv. 2011 à 21:36
9 janv. 2011 à 21:22
l'instruction movdqu peut pallier au problème.
8 janv. 2011 à 14:52
Ou l'adresse est un multiple de 16 ou on obtient un planté.
Le gain de rapidité est CERTAIN.L'astuce de programmation à utiliser est de traiter à part les data non alignés et d'utiliser movdqa pour celles qui le sont.
7 janv. 2011 à 12:07
7 janv. 2011 à 12:04
Il est peut-etre plus simple dans le cas d'utilisation des instruction sse de tout aligner sur 128 bits.
Ton code n'as pas d'exemple a proprement parlé mais il est possible que Windows utilise des instructions 128 bits dans la gestion du heap.
7 janv. 2011 à 11:47
je préfère un code du style:
size>>4
movdqa
size & 15
movsb
on perd moins de place tout en gardant l'optimisation fpu/sse,..
6 janv. 2011 à 19:42
Je me suis contenté de le constater.
L'alignement 128 bits n'est pas utilisé dans ce source.
Pour le reste,un alignement (1,2,4..) est demandé explicitement par certaine structures et par certaines intructions (movdqa demande un alignement 16 bytes) .
Au dessus,je n'ai pas d'exemples.
L'intérêt est toujours le même,améliorer la vitesse d'execution en évitant de former des adresses byte par byte.
5 janv. 2011 à 01:56
lea ecx,wave
call ??0CWaveFile@@QAE@XZ
il faut toujours prendre ecx ? On peut prendre n'importe quel registre ?
lea edx,wave
call ??0CWaveFile@@QAE@XZ
ça marche aussi ?
Qu'apporte l'alignement de 128 bits en terme d'optimisation par rapport à un alignement de 32 ou 64 bits ?
@++