J'essaye d'écrire un compactage de flux (prendre un tableau et me débarrasser des éléments vides) avec des intrinsèques SIMD. Chaque itération de la boucle traite 8 éléments à la fois (largeur SIMD).moyen efficace de convertir les indices de dispersion en indices de collecte?
Avec l'intrinsèque SSE, je peux le faire assez efficacement avec _mm_shuffle_epi8(), qui fait une recherche de table de 16 entrées (rassembler dans la terminologie de calcul parallèle). Les index de shuffle sont précalculés et recherchés avec un masque de bits.
for (i = 0; i < n; i += 8)
{
v8n_Data = _mm_load_si128(&data[i]);
mask = _mm_movemask_epi8(&is_valid[i]) & 0xff; // is_valid is byte array
v8n_Compacted = _mm_shuffle_epi8(v16n_ShuffleIndices[mask]);
_mm_storeu_si128(&compacted[count], v8n_Compacted);
count += bitCount[mask];
}
Mon problème est maintenant je voudrais mettre en œuvre ce pour SIMD AltiVec aussi (ne demandez pas pourquoi - décision d'affaires peu judicieux). Altivec n'a pas d'équivalent pour _mm_movemask_epi8(), un ingrédient critique. Alors, je vais devoir trouver un moyen soit
Emuler _mm_movemask_epi8() - semble cher, plusieurs quarts de travail et ORs
générer directement les indices de lecture aléatoire efficacement -
savoir , l'indice i sera l'indice du ième élément valable dans les données non compactées
element_valid: 0 0 1 0 1 0 0 1 0
gather_indices: x x x x x x 6 4 1
scatter_indices: 3 3 2 2 1 1 1 0 0
C'est simple de faire ceci en série, mais j'ai besoin qu'il soit parallèle (SIMD). Il semble facile de générer des indices de dispersion avec une somme de préfixes, mais comme AltiVec et SSE n'ont pas d'instruction scatter, j'ai besoin de rassembler des indices. Les indices de regroupement sont la fonction inverse des indices de dispersion, mais comment cela peut-il être obtenu en parallèle? Je sais que dans les jours pionniers de la programmation GPU, converting scatters to gathers était une technique courante, mais aucune de ces 2 méthodes décrites semblent pratiques. Peut-être que si l'on n'insiste pas sur le fait que le compactage préserve l'ordre des éléments, l'implémentation sera peut-être plus efficace? Je peux abandonner ça.