Laissez-moi préface avec .. J'ai une expérience extrêmement limitée avec ASM, et encore moins avec SIMD.Porting instructions MMX/SSE à AltiVec
Mais il se trouve que j'ai le code optimisé suivant MMX/SSE, que je voudrais transférer vers les instructions AltiVec pour une utilisation sur les processeurs PPC/Cell.
Ceci est probablement une grande question. Même si ce n'est que quelques lignes de code, je n'ai eu aucun mal à essayer de comprendre ce qui se passe ici.
La fonction originale:
static inline int convolve(const short *a, const short *b, int n)
{
int out = 0;
union {
__m64 m64;
int i32[2];
} tmp;
tmp.i32[0] = 0;
tmp.i32[1] = 0;
while (n >= 4) {
tmp.m64 = _mm_add_pi32(tmp.m64,
_mm_madd_pi16(*((__m64 *)a),
*((__m64 *)b)));
a += 4;
b += 4;
n -= 4;
}
out = tmp.i32[0] + tmp.i32[1];
_mm_empty();
while (n --)
out += (*(a++)) * (*(b++));
return out;
}
Des conseils sur la façon dont je pourrais réécrire cette option pour utiliser les instructions AltiVec?
Ma première tentative (une très mauvaise tentative) ressemble à ceci ... Mais ce n'est pas entièrement (ou même à distance) correct.
static inline int convolve_altivec(const short *a, const short *b, int n)
{
int out = 0;
union {
vector unsigned int m128;
int i64[2];
} tmp;
vector unsigned int zero = {0, 0, 0, 0};
tmp.i64[0] = 0;
tmp.i64[1] = 0;
while (n >= 8) {
tmp.m128 = vec_add(tmp.m128,
vec_msum(*((vector unsigned short *)a),
*((vector unsigned short *)b), zero));
a += 8;
b += 8;
n -= 8;
}
out = tmp.i64[0] + tmp.i64[1];
#endif
while (n --)
out += (*(a++)) * (*(b++));
return out;
}
brillant. Merci Paul. J'ai dû modifier le type de vecteur du tableau 'zéro' pour qu'il soit de type int signé (pour correspondre à celui de la variable m128) mais sinon cela a fonctionné un traitement absolu (et flamboie en termes de performance). Cela me donne envie d'en savoir plus sur les extensions SIMD. –
@Tim Kane: super - content que cela fonctionne pour vous. Bien repéré sur le vecteur zéro - fixé maintenant. AltiVec est vraiment cool, mais malheureusement, il est sur le point de sortir maintenant. Il y a cependant des choses passionnantes sur SIMD à l'horizon: l'AVX d'Intel et le SSE5 d'AMD par exemple. –