2
J'essaie de porter une fonction SSE qui obtient la différence absolue de deux tableaux entiers non signés de 8 bits. Il ressemble à:Altivec: analogue de _mm_sad_epu8()
uint64_t AbsDiffSum(const uint8_t * a, const uint8_t * b, size_t size)
{
assert(size%16 == 0);
__m128i _sum = _mm_setzero_si128();
for(size_t i = 0; i < size; i += 16)
{
const __m128i _a = _mm_loadu_si128((__m128i*)(a + i));
const __m128i _b = _mm_loadu_si128((__m128i*)(b + i));
_sum = _mm_add_epi64(_sum, _mm_sad_epu8(_a, _b));
}
return _mm_cvtsi128_si64(_mm_add_epi64(_sum, _mm_srli_si128(_sum, 8)));
}
travail principal est effectuée par la fonction intrinsèque _mm_sad_epu8().
Existe-t-il un analogue pour Altivec?
Merci. Ça marche. – Georg
Pourquoi utilisez-vous des variables avec un «_» important dans leurs noms? C'est juste demander des ennuis, puisque ces noms sont réservés pour des utilisations spécifiques à l'implémentation. 'vec_ld' pourrait être une macro qui utilise en interne un temporaire appelé' _a' ou quelque chose. –
Je sais que les noms tels que __abc et _Abc sont réservés à des fins de compilation. Des noms comme _abc sont libres d'utiliser. Dans le cas actuel, j'ai utilisé des noms simulaires pour les variables scalaires et vectorielles. – ErmIg