begin process at 2008 09 05 10:59:48
1 237 157 membres
118 nouveaux aujourd'hui
14 312 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Aligner des données pour le SSE [ Divers / Débutant(e) ] (epineurien)

Aligner des données pour le SSE le 26/07/2008 11:50:20

epineurien
Bonjour à tous !

J'ai un petit problème avec du code dont je mesure la vitesse: suivant la compilation, la vitesse varie du simple au double .
J'explique : je mesure la vitesse du code ASM si dessous, en général j'obtiens 6800ms.
Si je recompile (sans changer aucune option, sans touché au code) une fois sur trois le nouvel exécutable a une vitesse de 3800ms !
Vu que les deux instructions SSE prennent la majeure partie du temps (et que les movaps semble plus lents que les movups !), je suspecte un truc au niveau de l'alignement des données.

J'avais bêtement supposé que le début d'un '.data' était toujours aligné sur 128bits, et qu'il suffisait de caser toutes les données SSE au début du segment pour qu'elles restent alignées.
Là, après de multiple tentative de bidouillage avec les déclarations manuelles, je rend les armes : movups reste le plus rapide, signe que je n'aligne pas correctement les données.
Donc si quelqu'un pouvait me faire la grâce d'un lien vers un cours expliquant clairement comment alignés des données sur 16 octets, je lui dit merci.
Parce que je teste des trucs depuis ce matin, en suivant ce que je trouve sur le net, mais c'est toujours pas aligné ...

Ma dernière tentative en date :

DataSSE SEGMENT DWORD PUBLIC 'DATA'
ALIGN 4
.........données SSE (toujours des multiples de 128bits)
HgXmm0           REAL4 4 Dup (0.0e0)
HgXmm1           REAL4 4 Dup (0.0e0)
HgBufferSSE     REAL4 32 DUP (0.0e0)
HgBuffer2SSE   REAL4 32 DUP (0.0e0)
.........données SSE (toujours des multiples de 128bits)
DataSSE ENDS

Ne change strictement rien, toujours 1 chance sur 3 d'avoir un truc rapide au lieu d'un truc lent.

Le code ASM :

HgCalcul PROC
    push edi
    push eax
    push ebx
    push ecx
   
    mov edi,Offset HgBuffer2SSE
    movaps HgXmm0,Xmm0
    movaps HgXmm1,Xmm1
    mov eax,HgXmm0
    mov ebx,HgXmm0+4
    mov ecx,HgXmm0+8
    mov [edi],eax
    mov [edi+16],ebx
    mov [edi+32],ecx
    mov [edi+4],eax
    mov [edi+16+4],ebx
    mov [edi+32+4],ecx
    mov [edi+8],eax
    mov [edi+16+8],ebx
    mov [edi+32+8],ecx
    mov [edi+12],eax
    mov [edi+16+12],ebx
    mov [edi+32+12],ecx
   
    mov eax,HgXmm1
    mov ebx,HgXmm1+4
    mov ecx,HgXmm1+8
    mov [edi+48],eax
    mov [edi+64],ebx
    mov [edi+80],ecx
    mov [edi+48+4],eax
    mov [edi+64+4],ebx
    mov [edi+80+4],ecx
    mov [edi+48+8],eax
    mov [edi+64+8],ebx
    mov [edi+80+8],ecx
    mov [edi+48+12],eax
    mov [edi+64+12],ebx
    mov [edi+80+12],ecx
   
    pop ecx
    pop ebx
    pop eax
    pop edi
    ret
HgCalcul ENDP


La compilation se fait sous Visual C++ 2008, au cas où ça pourrait vous aider.
Merci encore ...


Jetez un coup d'½il à mon projet de moteur 3D par lancer de rayons : 
http://hydrargyrum.ifrance.com.

Re : Aligner des données pour le SSE le 26/07/2008 12:50:16

epineurien
Nouvelle série de test, avec :

.data
DataSSE SEGMENT PAGE PUBLIC 'DATA'
....
DataSSE ENDS

J'obtiens dans les 3 quarts des cas 3800ms et dans un quart 7000ms.
Et apparemment, la compilation n'a rien à voir ; un même fichier exécutable peut donner les deux valeurs, suivant son humeur ...
C'est de plus en plus bizarre ...


Re : Aligner des données pour le SSE le 26/07/2008 18:52:53

BruNews
(Admin CS)
Regarde si ton assembleur a une directive
ALIGN xxx

ciao...
BruNews, MVP VC++

Re : Aligner des données pour le SSE le 26/07/2008 21:54:45

Nukleos
Pourquoi ALIGN 4 et non ALIGN 16 
-> 16 octets = 128 bits

Patrick



Re : Aligner des données pour le SSE le 27/07/2008 08:07:42

BruNews
(Admin CS)
ah oui, je n'avais pas lu son listing.
ALIGN y est, suffit donc de 16 au lieu de 4.

ciao...
BruNews, MVP VC++

Re : Aligner des données pour le SSE le 27/07/2008 10:08:43

epineurien
DataSSE SEGMENT PAGE PUBLIC 'DATA'
ALIGN 16

Non, j'ai toujours 6400ms ou 3900ms (1/4 de l'un et 3/4 de l'autre), sur un même '.exe' ...
Désolé ...


Re : Aligner des données pour le SSE le 27/07/2008 22:06:56

Nukleos

S'il s'agit d'un problème d'alignement tu peux vérifier d'après les adresses indiquées avec un débugger.
(En particulier pour HgXmm0)

a+

Patrick


Re : Aligner des données pour le SSE le 28/07/2008 13:22:22

epineurien
Euh ... je ne sais pas me servir d'un débuggeur  (fait tout à la main avec des test de sorties, pas bien je sais).
Il y a quoi de bien comme logiciel de débuggage ? Parce que celui de VSC++ est vraiment bordélique ...

Ce que je trouve bizarre c'est que ca varie du simple au double sur un même exécutable ; normalement, soit les données sont alignées, soient elles ne le sont pas, non ? Il ne devrait y avoir aucune raison que ce soit des fois alignés et des fois non.

 En fait je ne suis même pas sûr que ce soit une histoire d'alignement, c'est juste que je ne voit ce que ça peut être d'autre :
-movaps de même vitesse que movups (alors qu'il est sensé être plus rapide)
-les deux instructions SSE prenne la majeure partie du temps (si on les virent on passe à un temps de 610ms, invariable).
Mais si c'est pas l'alignement (d'aprés le net ALIGN 16 and co devraient avoir résolut le problême) je vois pas ce que cela peut être ...

J'ai aussi testé une histoire avec le cache, au cas où se serait le tampon qui pose problême et pas les movaps :
mov edi,Offset HgBuffer2SSE
prefetchNTA BYTE PTR [edi]
prefetchNTA BYTE PTR [edi+64]
movaps HgXmm0,Xmm0
movaps HgXmm1,Xmm1
J'ai gagné quelques ms mais j'ai toujours ce fonctionnement à vitesse variable.
Je me met en quête d'un débuggeur et d'un manuel d'utilisation ...

Re : Aligner des données pour le SSE le 29/07/2008 20:51:12

Nukleos
[ Lien ]
ou
[ Lien ]

a+

Patrick

P.S. : Si tu peux envoyer 2 de tes programmes incriminés
ici : patrick.ruiz@tiscali.fr 
Merci

Re : Aligner des données pour le SSE le 31/07/2008 13:06:15

epineurien
This is an automatically generated Delivery Status Notification.  Delivery to the following recipients failed.  patrick.ruiz@tiscali.fr
 				 				
Désolé, ça ne marche pas .... (même les mails plantent avec moi, je suis trop balèze ).


[Page 1 Page 2]
Classé sous : mov, eax, edi, ecx, ebx

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS