pour emuler un if en SSE2 il faut faire la chose suivante :
Soit le code :
a = condition ? vrai : faux; à vectoriser
- calculer le masque de la comparaison condition. Appelons ce masque M
- faire : v = M & vrai (mm_and de tête)
- faire : f = ~M & faux
- enfin a = v | f
En gros tu transforme un if else en calcul de masque, une paire de & et un | vectoriel (mm_and, mm_or).
En gros, quelque soit le résultat du test, tu calcul les deux versions et ensuite tu la sélectionne. C'est un idiome classique en SIMD SWAR.
Pour ton autre question, il faut toujours repenser ses algos vectorielles de faon à toujours faire toujours le mm calcul pr tt les éléments du vecteurs. Ici tu n'as qu'à stocker 4 old_picth consécutif dans un vecteur.
Une bonne astuce consiste dans un premier temps à reecrire son algo scalaire en déroulant les boucles d'un pas égales au cardinal du vecteur et ensuite de réécrire cet algo déroulé en utilisant uniquement des calculs et aucune structures de controle. Le passage en SSE2 est alors trivial.
Message édité par Joel F le 24-05-2008 à 15:02:39