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.