SSE: recíproco si no es cero

¿Cómo puedo tomar el recíproco (inverso) de flotadores con instrucciones SSE, perosolo para no-cero ¿valores?

Fondo de abajo:

Quiero normalizar un conjunto de vectores para que cada dimensión tenga el mismo promedio. En C esto puede ser codificado como:

float vectors[num * dim]; // input data

// step 1. compute the sum on each dimension
float norm[dim];
memset(norm, 0, dim * sizeof(float));
for(int i = 0; i < num; i++) for(int j = 0; j < dims; j++)
    norm[j] += vectors[i * dims + j];
// step 2. convert sums to reciprocal of average
for(int j = 0; j < dims; j++) if(norm[j]) norm[j] = float(num) / norm[j];
// step 3. normalize the data
for(int i = 0; i < num; i++) for(int j = 0; j < dims; j++)
    vectors[i * dims + j] *= norm[j];

Ahora, por razones de rendimiento, quiero hacer esto usando SSE intinsics. Setp 1 y el paso 3 son fáciles, pero estoy atascado en el paso 2. Parece que no encuentro ningún ejemplo de código o instrucción SSE obvia para tomar el recirpocal de un valorSi no es cero Para la división, _mm_rcp_ps hace el truco, y tal vez lo combine con un movimiento condicional, pero ¿cómo obtener una máscara que indique qué componente es cero?

No necesito el código del algoritmo descrito anteriormente, solo la función "inverso si no es cero":

__m128 rcp_nz_ps(__m128 input) {
    // ????
}

¡Gracias!

Respuestas a la pregunta(1)

Su respuesta a la pregunta