Estoy tratando de escribir una compactación de flujo (tomar una matriz y deshacerse de los elementos vacíos) con SIMD intrínsecos. Cada iteración del ciclo procesa 8 elementos a la vez (ancho SIMD).manera eficiente de convertir índices de dispersión en índices de reunión?
Con SSE intrínsecamente, puedo hacer esto bastante eficientemente con _mm_shuffle_epi8(), que hace una búsqueda de tabla de 16 entradas (reunir en terminología de computación paralela). Los índices de mezcla se precalculan y se mira con una máscara 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];
}
Mi problema es ahora quisiera aplicar esto para Altivec SIMD también (no pregunte por qué - equivocada decisión de negocios). Altivec no tiene un equivalente para _mm_movemask_epi8(), un ingrediente crítico. Por lo tanto, voy a tener que encontrar una manera de cualquiera
_mm_movemask_epi8 emular() - parece caro, varios turnos y OR
generar directamente los índices de reproducción aleatoria de manera eficiente -
saber , index voy a ser el índice del i-ésimo elemento válido en los datos no comparados
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
Es simple hacer esto en serie, pero necesito que sea paralelo (SIMD). Parece fácil generar índices de dispersión con una suma de prefijo, pero como ni AltiVec ni SSE tienen una instrucción de dispersión, en su lugar, necesito recopilar índices. Los índices de recopilación son la función inversa de los índices de dispersión, pero ¿cómo puede obtenerse en paralelo? Sé que en los días pioneros de la programación de GPU, converting scatters to gathers era una técnica común, pero ninguno de los 2 métodos descritos parece práctico.
Quizás si no insiste en que la compactación conserva el orden de los elementos, ¿permitirá una implementación más eficiente? Puedo renunciar a eso.