Optimisation MMX/SSE d'une boucle [ASM] - ASM - Programmation
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
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 ?
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