Optimisation de code assembleur inclus dans du code C
fred_82
Messages postés11Date d'inscriptiondimanche 2 octobre 2005StatutMembreDernière intervention19 avril 2008
-
26 mars 2008 à 15:12
fred_82
Messages postés11Date d'inscriptiondimanche 2 octobre 2005StatutMembreDernière intervention19 avril 2008
-
27 mars 2008 à 15:02
Bonjour,
Alors j'explique le problème, j'aimerais faire une petite fonction en assembleur que j'inclus dans du code C, le probleme est que cette fonction n'est absolument pas optimisé par le compilateur.
Exemple :
je creer une fonction asm qui fait une addition :
int add(int a,int b){
int c;
_asm{
mov eax,a;
mov ebx,b;
add eax,ebx;
mov c,eax;
}
return(c);
}
puis dans ma fonction principale j'utilise les deux manière de faire l'addition ( + et ma fonction add) :
Je compile tout ca en release et j'obtient le code asm suivant :
pour le + :
mov ecx,dword ptr [esp+2Ch]
mov edx,dword ptr [esp+30h]
add edx,ecx
add edx,dword ptr [esp+34h]
add esp,20h
add dword ptr [esp+8],edx
soit 6 instructions, on voit bien que le code a été optimisé ici
Soit 16 instructions, le compilateur se contente de réécrire le code que j'ai mis dans ma fonction.
Donc ma question est : serait il possible d'écrire une fonction en assembleur et que celle ci soit optimisé par le compilateur? Si oui , comment fait on?
Merci
A voir également:
Optimisation de code assembleur inclus dans du code C
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 26 mars 2008 à 15:30
NON direct et définitif à ta question.
De l'ASM "dans" du C ne fera que empêcher toute optimisation du compilo.
Bien entendu que le compilo reporte ce qui est mis en ASM, il ne peut rien faire de plus.
On met une fonction FULL ASM ou FULL C mais jamais de mixage.
fred_82
Messages postés11Date d'inscriptiondimanche 2 octobre 2005StatutMembreDernière intervention19 avril 2008 26 mars 2008 à 18:56
Merci a tous d'avoir repondu aussi rapidement, en faite je m'explique, j'ai un programme dans lequel j'utilise des instruction SIMD (SSE,SSE2 et autre) le probleme est que certaine intrinsic ne sont pas reconnnu par le compilo de visual , mais aller savoir pourquoi, elles sont reconnu en assembleur. De plus, j'aimerais pouvoir manipuler mes vecteur de la meme façon que je le ferais sous GCC, c'est pourquoi j'aimerais creer ma propre bibliotheque xmmintrin, emmintrin.h et pmmintrin.h.
J'ai donc pensé à les codé moi meme en assembleur.
Voila
Je vais tout de meme essayer la solution de brunews pour voir ce que ca donne.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 26 mars 2008 à 19:33
VC++ 2008 reconnait les instructions jusqu'au SSE3.
Je ne sais pas ce que tu fais sous GCC mais attention qu'on ne joue pas avec l'ASM, il faut une extrême rigueur et une longue pratique avant de faire mieux qu'un compilo moderne. Au vu de ce qui est plus haut, il va falloir t'entrainer encore longuement et surtout bien comparer les perfs d'une fonction C et ASM.
fred_82
Messages postés11Date d'inscriptiondimanche 2 octobre 2005StatutMembreDernière intervention19 avril 2008 27 mars 2008 à 14:56
Le compilo de visual ne permet de cast de __m128 en __m128i (pour visual 2005), certes visual 2008 le permet via une intrinsic mais je possede une version complete de visual 2005 (grace a msdnaa) et cela m'ennui de passer à visual express 2008 surtout que certain utilitaire ne sont pas present.
fred_82
Messages postés11Date d'inscriptiondimanche 2 octobre 2005StatutMembreDernière intervention19 avril 2008 27 mars 2008 à 15:02
Les compilo optimise mal en SSE lorsque l'on code en scalaire, par contre lorsque l'on dirige le compilo en codant soit meme en scalaire, le resultat est tout a fait satisfaisant.