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 : Instruction optimale ? [ Processeurs / X86 ] (juju12)

mardi 12 septembre 2006 à 15:57:32 | Instruction optimale ?

juju12

Bonjour;
   Je code un bout d'asm inline sous C++ en utilisant les instructions SSE et des données alignées sur 16 octets.
J'aurais voulu savoir, des deux opérations suivantes, laquelle est la plus rapide, ou si elles sont équivalentes :
MOVDQA xmm1, xmmword ptr[eax];
ADDPS xmm1, xmmword ptr[ebx];

ou bien :
MOVDQA xmm1, xmmword ptr[eax];
MOVDQA xmm2, xmmword ptr[ebx];
ADDPS xmm1, xmm2;
 
merci d'avance.

mardi 12 septembre 2006 à 16:21:48 | Re : Instruction optimale ?

ToutEnMasm

Salut,
Pour ça il faut utiliser un compteur.

                          ToutEnMasm

.586

;------------------- constantes ---------------------------

ITER EQU 1 ; number of iterations

OVERHEAD EQU 15 ; 15 for PPlain, 17 for PMMX

;************ Data segment: ********************

ALIGN 4

COUNTER DD 0 ; loop counter

TICS DD 0 ; temporary storage of clock

RESULTLIST DD ITER DUP (0) ; list of test results

;---------------------- code -----------------------------------

;calcul du temps

BEGIN:

MOV DWORD ptr COUNTER,0 ; reset loop counter

TESTLOOP: ; test loop

;************ Do any initializations here: ********************

FINIT

;************ End of initializations ********************

RDTSC ; read clock counter

MOV TICS,EAX ; save count

CLD ; non-pairable filler

REPEAT 8

NOP ; eight NOP's to avoid shadowing effect

ENDM

;---------------- bloc d'instruction ------------------------

 

;---------- resultat --------------------------

CLC ; non-pairable filler with shadow

RDTSC ; read counter again

SUB EAX,TICS ; compute difference

SUB EAX,OVERHEAD ;15 subtract clocks used by fillers etc.

MOV EDX,COUNTER ; loop counter

MOV [RESULTLIST+EDX],EAX ; store result in table

ADD EDX,TYPE RESULTLIST ; increment counter

MOV COUNTER,EDX ; store counter

CMP EDX,ITER * (TYPE RESULTLIST)

JB @F ; repeat ITER times

jmp AfficheITER

@@:

jmp TESTLOOP

;affichage

AfficheITER:

mov CPT,ITER

mov ebx,0

mov al,0

mov byte ptr [ZoneMessagesErreurs],al

.while(CPT)

mov edx,[RESULTLIST+ebx*4]

invoke dwtoa,edx,addr buffer

invoke lstrcat,addr ZoneMessagesErreurs,addr buffer

invoke lstrcat,addr ZoneMessagesErreurs,SADR(" ")

inc ebx

dec CPT

.endw

invoke MessageBox,NULL,addr ZoneMessagesErreurs,addr buffer,MB_OK


mardi 12 septembre 2006 à 17:44:45 | Re : Instruction optimale ?

_dune2_

Membre Club
Réponse acceptée !
Salut,


Tout comme ToutEnMasm, je conseille le test pour ce genre question.
J'ai réalisé un prog en C avec asm inline :

===========================================
#include <stdio.h>
#include <stdlib.h>

unsigned int timing_test1[1024];
unsigned int timing_test2[1024];

void *ptr1, *ptr2;
char _ptr1[16+16];
char _ptr2[16+16];

inline void test1()
{
    __asm(
        "mov    (%0),%%ebx    \n"
        "mov    (%1),%%ecx    \n"
        "movdqa    (%%ebx),%%xmm1    \n"
        "addps    (%%ecx),%%xmm1    \n"
        :: "m" (ptr1) , "m" (ptr2)
        : "ebx", "ecx");
}

inline void test2()
{
    __asm(
        "mov    (%0),%%ebx    \n"
        "mov    (%1),%%ecx    \n"
        "movdqa    (%%ebx),%%xmm1    \n"
        "movdqa    (%%ecx),%%xmm2    \n"
        "addps    %%xmm2,%%xmm1    \n"
        :: "m" (ptr1) , "m" (ptr2)
        : "ebx", "ecx");
}


int main(int argc, char **argv)
{
    int loop;
   
    ptr1 = (void *)((unsigned long)(_ptr1+15)&(~0x0F));
    ptr2 = (void *)((unsigned long)(_ptr2+15)&(~0x0F));
   
    unsigned int result_test1=0, result_test2=0;
    unsigned int debut,fin;
    // boucles de test ...
    __asm__ volatile ("rdtsc":"=A" (debut));
    for(loop=0;loop<4096;loop++) test1();
    __asm__ volatile ("rdtsc":"=A" (fin));
    result_test1 = ((debut<fin)?(fin-debut):(debut-fin))/4096;
   
    __asm__ volatile ("rdtsc":"=A" (debut));
    for(loop=0;loop<4096;loop++) test2();
    __asm__ volatile ("rdtsc":"=A" (fin));
    result_test2 = ((debut<fin)?(fin-debut):(debut-fin))/4096;
    // affichage du résultat ...
    printf("Test1 : %u cycles d'horloge et Test2 : %d cycles d'horloge\n",result_test1,result_test2);
    return EXIT_SUCCESS;
}
===========================================

Et le résultat chez moi me donne :
Test1 : 34 cycles d'horloge et Test2 : 32 cycles d'horloge

de manière répétitif.

On peut donc déduire que utiliser 2x movdqa + 1x addps est plus rapide.

Celà est surement dû au fait que les 2 méthodes ont une contrainte sur les 2 opérandes (que ce soit sur xmm2 ou sur le chargement des 128bits). Mais movdqa est à priori mieux géré en terme de cycles cpu que addps pour le chargement des données alignées sur 128bits.
Addps doit gaspiller de precieux cycles cpu en considérant le chargement pas forcément aligné.

Dune2.

Gentoo... que du bonheur ...

mardi 12 septembre 2006 à 17:53:08 | Re : Instruction optimale ?

juju12

Merci pour ces réponses



Cette discussion est classé dans : ptr, instruction, xmm1, xmmword, movdqa


Répondre à ce message

Sujets en rapport avec ce message

Avertissement compilo [ par NairodDorian ] Bonjour,J'ai écris un programme qui contient une fonction en full asm pour avoir les meilleurs perfs.Voici le code de la fonction :[CODE]<font color=" Masm32 - adressage direct - soucis ! [ par ouadji ] Bonjour à tous,mov eax , [11223344h]cette instruction existe ! registre de segment utilisé ... DS ... par défaut !Code machine de cette instruction : Instruction SYSENTER et WRMSR ??? [ par toto8966 ] Utiliser l'instruction Pentium SYSENTER pour exécuter du code en Ring0 au départ de Ring3, c'est normalement possible !Seulement, y'a un problème.Quan instruction MID(vb) en ASM [ par flagyg ] Bonjour,J'essaye de traduire des codes que j'ai fait en vb en asm. mais je n'arrive pas à programmer la fonction mid.Qqn pourrait me la programmer svp Instructions ASM [ par BarthOlivier ] Salut a tous.Je voudrais savoir où je pourrais trouver tout le jeux d'instruction disponible pour un processeur recent (type P3 ou P4 par exemple).Est 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 Besoin d'explications sur les flags [ par teknocrack ] salut à tous,je programme habituellement en VB, donc je n'ai pas vraiment la notion de flags, même si en réalité on peut comparer un IF avec un flags- REVERSE ENGEEER aide API [ par Fuckly94 ] Salut tout le monde!!je me lance dans le reverse engeneer,c'est à dire la modification de programme déja compilé!!le seul probléme que j'ai,c'est pour pb avec l'instruction loop ( bla..ro de 1ere) ! [ par vinc1008881 ] bonjour tlm voila mon pb ( pour moi s'en n'est un ..) : a:mov ecx, 00000000hloop aet le pb c 'est que le b Fichier [ par RM50Man ] Je lis dans un fichier et je reecris ce que g lu dans l autre, mais ca ne m ecrit pas dans le nouveau fichier ce que g lu ds l autre fichier !!!!Si qu


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,686 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.