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