Optimisation code SSE sous C++
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
Code:
1 2
| a=_mm_mul_ps(a,_mm_set_ps1(10))
b=_mm_mul_ps(b,_mm_set_ps1(10)) |
le compilo génère qqch du genre:
Code:
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 |
Je souhaiterais obtenir:
Code:
1 2
| mulps xmm0,xmmword ptr [KERNEL32_NULL_THUNK_DATA+90h (44C220h)]
mulps xmm1,xmmword ptr [KERNEL32_NULL_THUNK_DATA+90h (44C220h)] |
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é...).
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:
Code:
1 2
| __asm mulps a, 10;
__asm mulps b, 10; |
J'ai a priori 2 problèmes:
- 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