optimisation SSE pour du code C (auto ou inline) [résolu] - C - Programmation
Marsh Posté le 12-03-2012 à 10:49:53
Salut,
Il vaudrait mieux travailler non pas sur 3 composantes par pixel mais 4 , car les instructions MMX/SSE font des opérations sur 64/128 bits, et la mémoire a besoin d'être alignée. Ca te boufferait un peu plus de mémoire ( 33% quand même ) mais tu pourrais utiliser certaines instructions. SSE te permettra juste de travailler sur plus de pixels à la fois que MMX ( 4 pour le SSE , et 2 pour le MMX ).
Marsh Posté le 12-03-2012 à 10:53:52
xilebo a écrit : Salut, |
Oui, bien sûr! Je pourrais aussi compléter le sous-registre MMX ou SSE par un zéro avant ma boucle.
Mais comment faire?
Je suis sur la page http://gcc.gnu.org/onlinedocs/gcc/ [...] sions.html de la doc GNU
concernant les extensions vectorielles (afin d'utiliser mmx, sse, avx en fonction de l'archi)
mais c'est vraiment très léger sur la façon de l'utiliser. Je continue de chercher
Marsh Posté le 12-03-2012 à 12:15:26
Alors,
imagine tu veux appliquer un coefficient sur un pixel, voici comment on pourrait procéder :
syntaxe assembleur MSVC :
Code :
|
syntaxe assembleur GCC
Code :
|
On peut même travailler sur 8 pixels car il y a assez de registres, et il y a 2 pipelines qui peuvent travailler en parallèle ( à voir si ca marche vraiment ).
Tu peux t'inspirer de ça pour écrire ton code ( il te faudra utiliser également paddsw pour faire une addition ).
Attention, tout doit être aligné sur 16 octets, ton buffer, mais également la variable 128 bits qui contiendra ton coefficient mat ( sur 16 bits donc 8 fois ) et aussi tes 3 variables tr tg tb recevant le résultat ( sinon on peut avoir des crashs ).
PS : j'ai écrit ça en recopiant du code , je ne sais pas si il est exact , mais le principe est là.
Marsh Posté le 12-03-2012 à 13:25:08
Merci! J'étudierai la possibilité de faire encore plus de multiplications à la fois avec des masques aussi.
De mon côté, j'ai trouvé ça qui fonctionne bien et reste indépendant de l'architecture
Code :
|
Marsh Posté le 12-03-2012 à 08:28:11
Hello
Je me suis fait une petite routine ce week-end de filtrage dont voici la boucle principale. Après avoir longuement optimisé le code général, j'ai eu un gain de 30%. Bien mais pas top. Après une écriture multi-thread de l'algo, j'ai eu un gain de 300% (quadcore).
Mais en regardant le code, je suis persuadé qu'il y a moyen d'écrire du code optimisé MMX,SSE ou autre pour faire une seule instruction pour les trois couleurs. Il est évident que dans ce cas, mon tableau gaussian_matrix serait un long long (ou autre?) qui contiendrait directement le multiplicateur écrit 3 fois, prêt à l'emploi.
J'ai cru comprendre qu'il existait des macro pour les compilateurs C, voir qu'ils savaient optimiser tout seul ce genre de chose (mais là, j'ai un doute). Qu'en est-il exactement?
J'utilise gcc (ubuntu 10.10)
Si quelqu'un peut me tuyauter là dessus, même un fucking manual, ou de l'inline asm
Merci
EDIT: Apparemment, y a l'instruction PMULLD qui pourrait m'aider mais c'est sur l'écriture gcc que je cale pour le moment...
Message édité par edwoud le 12-03-2012 à 13:57:33