begin process at 2010 03 14 06:54:52
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Divers

 > 

Débutant(e)

 > 

Aligner des données pour le SSE


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Aligner des données pour le SSE

samedi 26 juillet 2008 à 11:50:20 | Aligner des données pour le SSE

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.
samedi 26 juillet 2008 à 12:50:16 | Re : Aligner des données pour le SSE

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 ...

samedi 26 juillet 2008 à 18:52:53 | Re : Aligner des données pour le SSE

BruNews

Administrateur CodeS-SourceS
Regarde si ton assembleur a une directive
ALIGN xxx

ciao...
BruNews, MVP VC++
samedi 26 juillet 2008 à 21:54:45 | Re : Aligner des données pour le SSE

Nukleos

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

Patrick


dimanche 27 juillet 2008 à 08:07:42 | Re : Aligner des données pour le SSE

BruNews

Administrateur CodeS-SourceS
ah oui, je n'avais pas lu son listing.
ALIGN y est, suffit donc de 16 au lieu de 4.

ciao...
BruNews, MVP VC++
dimanche 27 juillet 2008 à 10:08:43 | Re : Aligner des données pour le SSE

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é ...

dimanche 27 juillet 2008 à 22:06:56 | Re : Aligner des données pour le SSE

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

lundi 28 juillet 2008 à 13:22:22 | Re : Aligner des données pour le SSE

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 ...
mardi 29 juillet 2008 à 20:51:12 | Re : Aligner des données pour le SSE

Nukleos

[ Lien ]
ou
[ Lien ]

a+

Patrick

P.S. : Si tu peux envoyer 2 de tes programmes incriminés
ici : patrick.ruiz@tiscali.fr 
Merci
jeudi 31 juillet 2008 à 13:06:15 | Re : Aligner des données pour le SSE

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 ).

1 2

Cette discussion est classée dans : mov, eax, edi, ecx, ebx


Répondre à ce message

Sujets en rapport avec ce message

j'ai un prob avec mon buffer ; ya pas d'amuses gueules (masm32) [ par papiboff ] bj si je mets le buffer "somme " en dd avec charge eax et que j'ajoute deux 'dec ebx ' , ben , marche pas correctement ; (pêrqué ???? = en french) sv [linux] read and open [ par sheorogath ] Bonjour,je débute un peu en assembleur et j'essaie de faire un programme qui lit le début d'un fichier dont le nom est entré par l'utilisateur.Voici l exception 13 lors du scan memoire haute [ par patatalo ] salut, pourquoi ce code de detection de memoire en mode 32 bits sans paging me donne une exception 13 sur certaines cartes meres ( ASUS ) a l'adresse inverser une chaine [ par MrdJack ] salut, je suis sur un projet de calculatrice me permettant de faire des calculs avec des nombres tres grands. chaque nombre est stocké dans la memoire Inversion de chaîne [ par Bidou ] Bonjour à tous,A vrai dire je suis plutôt nouveau en asm et pas très bon lol. Mais bon, faut bien commencer un jour hein. Pour me faire la main, j'ai Différences ??? [ par Arecibo ] Voila je debute en assembleur et j'aimerais savoir quelles sont les différences entre :-> mov eax, ebx et mov eax, [ebx]-> mov esi, eax et mov [esi], Pb registre DL [ par AlexMAN ] Bonjour, J'ai un ptit pb avec le code qui suit, au nivo du mov dl, [ecx] ://Renvoie pointeur sur fin de chaine (permet d'eviter l'utilisation de strca optimisation [ par sajid_morad ] salut tout le monde , j ai une parti du code en c++, que j ai voulu optimiser , le l ai reécri en asm , mai ça donne pas grand chose, si quelqu un po Petit problème pour comparer (cmp) [ par smok1360 ] Bonjour à tous,Pour commencer, j'espère de ne pas avoir choisis le mauvais lieu pour poster, j'ai un petit peu hésité Donc, j'ai décidé d'apprendre l' Recherche de fichier recursif [ par maximus4 ] Bonjour, j'ai la procédure suivante pour la recherche récursive, le résultat est stocké dans un fichier texte. [code=autre]invoke CreateFile,offset fi


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,092 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales