Salut
J'utilise habituellement les fonctions intrasics d'Intel pour optimiser du code C++ avec des instructions SSE.
Mais en regardant le code généré en mode release par mon compilo (ICL) , j'ai remarqué que ce n'est pas optimal pour la vitesse sur un point particulier:
Quand une constante est utilisée à plusieurs reprises, le compilo la garde dans un registre SSE pour la réutiliser.
Par exemple, pour ce code simple
le compilo génère qqch du genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 a=_mm_mul_ps(a,_mm_set_ps1(10)) b=_mm_mul_ps(b,_mm_set_ps1(10))
Je souhaiterais obtenir:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 movaps xmm7,xmmword ptr [KERNEL32_NULL_THUNK_DATA+90h (44C220h)] // charge la constante mulps xmm0,xmm7 // xmm0=xmm0*xmm7 mulps xmm1,xmm7 // xmm1=xmm1*xmm7
La stratégie du compilo est peut-être généralement payante, mais dans mon cas c'est plus lent. J'en suis sûr, car quand je modifie dans mon code C++ les valeurs des constantes pour n'en avoir aucune identique, le code généré est plus rapide (mais erroné...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mulps xmm0,xmmword ptr [KERNEL32_NULL_THUNK_DATA+90h (44C220h)] mulps xmm1,xmmword ptr [KERNEL32_NULL_THUNK_DATA+90h (44C220h)]
Mon explication: + de place dans les registres => + de résultats temporaires sont gardés dans les registres => - d'aller retour avec la pile => + rapide
Question: comment forcer mon compilo à compiler à ma manière.
Peut-être en insérant de l'assembleur? Mais je n'ai pas réussi! (Je suis nul en assembleur)
Il me faudrait écrire qqch dans le genre:
J'ai a priori 2 problèmes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 __asm mulps a, 10; __asm mulps b, 10;
- je crois pas qu'il soit possible d'utiliser des variables directement avec __asm
- je ne vois pas comment aller charger la bonne valeur de constante
Partager