begin process at 2012 05 25 04:50:35
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Processeurs

 > 

X86

 > 

Instruction optimale ?


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

Instruction optimale ?

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ée 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 : assemblage des instruction [ par yacine000 ] il y a quelqun qui sait résourdre ceexercicel'assemblage des instruction suivantesMOV AX, 200MOV BX , AXMOV SI,BXMOV(SI),BXMOV(0200),BX                en quel langage est ecrit ce programme [ par jedilu ] bonjouren quel language est ecrit ce programme car j'ai un probleme pour le lancermerci00629DE5   AE               SCAS BYTE PTR ES:[EDI]00629DE6   9E Problemme avec mes character... XD [ par belette321 ] J'esseil d'ajouter une commande administrateur a dans un des mes jeux en-ligne, /admin_popup (Fait apparaitre un MSG dans une boite dans le lobby). Un indication pour une instruction [ par marooh ] bonjour, j'ai une question à propos de la fin d'un programme assembleur: qu'elle est l'instruction qui fait que le programme se termine proprement c'e 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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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,326 sec (4)

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