[ASM] Optimisation MMX/SSE d'une boucle

Optimisation MMX/SSE d'une boucle [ASM] - ASM - Programmation

Marsh Posté le 11-07-2004 à 00:33:41    

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
Reply

Marsh Posté le 11-07-2004 à 00:33:41   

Reply

Marsh Posté le 11-07-2004 à 21:16:13    

trop de jxx pour que ca soit jouable imho

Reply

Marsh Posté le 11-07-2004 à 21:40:08    

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

Reply

Marsh Posté le 12-07-2004 à 17:24:58    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed