Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1839 connectés 

  FORUM HardWare.fr
  Programmation
  ASM

  [ASM] Optimisation MMX/SSE d'une boucle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ASM] Optimisation MMX/SSE d'une boucle

n°792765
Doc TB
CPC Hardware
Posté le 11-07-2004 à 00:33:41  profilanswer
 

Bonjour à tous,
 
Je m'arrache les cheveux depuis plusieurs jours sur l'optimisation d'une fonctione simple en assembleur issue de memtest86+. Le but est de transformer le code x86 standard en un mode optimisé MMX et/ou SSE pour augmenter le débit des données et donc mettre a jour encore mieux les eventuelles erreurs. La boucle en question est en C et la partie a optimiser est en asm. Je ne sais pas si quelqu'un peu m'aider ici, mais si c'est le cas, ce serait cool :)
 

  asm __volatile__ (
    "jmp L20\n\t"
    ".p2align 4,,7\n\t"
 
    "L20:\n\t"
    "movl %%ecx,(%%edi)\n\t"
    "addl $1,%%ebx\n\t"
    "cmpl $32,%%ebx\n\t"
    "jne L21\n\t"
    "movl %%esi,%%ecx\n\t"
    "xorl %%ebx,%%ebx\n\t"
    "jmp L22\n"
    "L21:\n\t"
    "shll $1,%%ecx\n\t"
    "orl %%eax,%%ecx\n\t"
    "L22:\n\t"
    "addl $4,%%edi\n\t"
    "cmpl %%edx,%%edi\n\t"
    "jb L20\n\t"
    : "=b" (k), "=D" (p)
    : "D" (p),"d" (pe),"b" (k),"c" (pat),
     "a" (sval), "S" (lb)
   );
 
 
------
 
    asm __volatile__ (
     "pushl %%ebp\n\t"
     "jmp L30\n\t"
 
     ".p2align 4,,7\n\t"
     "L30:\n\t"
     "movl (%%edi),%%ebp\n\t"
     "cmpl %%ecx,%%ebp\n\t"
     "jne L34\n\t"
 
     "L35:\n\t"
     "notl %%ecx\n\t"
     "movl %%ecx,(%%edi)\n\t"
     "notl %%ecx\n\t"
     "incl %%ebx\n\t"
     "cmpl $32,%%ebx\n\t"
     "jne L31\n\t"
     "movl %%esi,%%ecx\n\t"
     "xorl %%ebx,%%ebx\n\t"
     "jmp L32\n"
     "L31:\n\t"
     "shll $1,%%ecx\n\t"
     "orl %%eax,%%ecx\n\t"
     "L32:\n\t"
     "addl $4,%%edi\n\t"
     "cmpl %%edx,%%edi\n\t"
     "jb L30\n\t"
     "jmp L33\n\t"
 
     "L34:\n\t" \
     "pushl %%esi\n\t"
     "pushl %%eax\n\t"
     "pushl %%ebx\n\t"
     "pushl %%edx\n\t"
     "pushl %%ebp\n\t"
     "pushl %%ecx\n\t"
     "pushl %%edi\n\t"
     "call error\n\t"
     "popl %%edi\n\t"
     "popl %%ecx\n\t"
     "popl %%ebp\n\t"
     "popl %%edx\n\t"
     "popl %%ebx\n\t"
     "popl %%eax\n\t"
     "popl %%esi\n\t"
     "jmp L35\n"
 
     "L33:\n\t"
     "popl %%ebp\n\t"
     : "=b" (k), "=D" (p)
     : "D" (p),"d" (pe),"b" (k),"c" (pat),
      "a" (sval), "S" (lb)
    );
 
 
-----
 
    asm __volatile__ (
     "pushl %%ebp\n\t"
     "addl $4,%%edi\n\t"
     "jmp L40\n\t"
 
     ".p2align 4,,7\n\t"
     "L40:\n\t"
     "subl $4,%%edi\n\t"
     "movl (%%edi),%%ebp\n\t"
     "notl %%ecx\n\t"
     "cmpl %%ecx,%%ebp\n\t"
     "jne L44\n\t"
 
     "L45:\n\t"
     "notl %%ecx\n\t"
     "movl %%ecx,(%%edi)\n\t"
     "decl %%ebx\n\t"
     "cmpl $0,%%ebx\n\t"
     "jg L41\n\t"
     "movl %%esi,%%ecx\n\t"
     "movl $32,%%ebx\n\t"
     "jmp L42\n"
     "L41:\n\t"
     "shrl $1,%%ecx\n\t"
     "orl %%eax,%%ecx\n\t"
     "L42:\n\t"
     "cmpl %%edx,%%edi\n\t"
     "ja L40\n\t"
     "jmp L43\n\t"
 
     "L44:\n\t" \
     "pushl %%esi\n\t"
     "pushl %%eax\n\t"
     "pushl %%ebx\n\t"
     "pushl %%edx\n\t"
     "pushl %%ebp\n\t"
     "pushl %%ecx\n\t"
     "pushl %%edi\n\t"
     "call error\n\t"
     "popl %%edi\n\t"
     "popl %%ecx\n\t"
     "popl %%ebp\n\t"
     "popl %%edx\n\t"
     "popl %%ebx\n\t"
     "popl %%eax\n\t"
     "popl %%esi\n\t"
     "jmp L45\n"
 
     "L43:\n\t"
     "subl $4,%%edi\n\t"
     "popl %%ebp\n\t"
     : "=b" (k), "=D" (p), "=c" (pat)
     : "D" (p),"d" (pe),"b" (k),"c" (pat),
      "a" (p3), "S" (hb)
    );


---------------
Doc_TB @ Canardpc.com
mood
Publicité
Posté le 11-07-2004 à 00:33:41  profilanswer
 

n°793105
chrisbk
-
Posté le 11-07-2004 à 21:16:13  profilanswer
 

trop de jxx pour que ca soit jouable imho

n°793116
Exo 7
Posté le 11-07-2004 à 21:40:08  profilanswer
 

Tu peux toujours vectoriser la boucle en utilisant des intrinsics, c'est un peu plus programmeur-friendly que de l'assembleur

n°793843
christophe​_d13
L'efficacité à tout prix.
Posté le 12-07-2004 à 17:24:58  profilanswer
 

Je vois que c'est tjrs illisible en mélangeant le c et l'asm en gcc...
 
Avant de penser a voir l'optimisation en mmx/sse va voir mon topic sur memcpy (c++).
Dans un premier temps tu peux faire du cache-read prefetching et/ou du read-ahead prefetching sans utiliser un seul opcode mmx/sse...
Tu as également cmov.
 
As-tu l'algo de base qui sert à construire le code asm ?


Message édité par christophe_d13 le 12-07-2004 à 17:29:06

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  [ASM] Optimisation MMX/SSE d'une boucle

 

Sujets relatifs
boucle infini[SGBD/SQL] Optimisation de requête
optimisation ihm[ Concours No 3] A vos cervaux [Zone ASM]
Indice de boucle auto-incrémentale[debutant] Boucle for / while et ecriture fichier
HELP:probleme ASM mes commandes BSF PORTA,1 ne marche pasBoucle FOR [résolu]
[Firefox et Javascript] Problème avec history.back() qui boucle !pb boucle for +variable
Plus de sujets relatifs à : [ASM] Optimisation MMX/SSE d'une boucle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR