SSE: recíproco, se não zero

Como posso tomar o recíproco (inverso) de carros alegóricos com instruções SSE, massomente para não-zero valores?

Fundo abaixo:

Eu quero normalizar uma matriz de vetores para que cada dimensão tenha a mesma média. Em C isso pode 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];

Agora, por motivos de desempenho, quero fazer isso usando intinsics do SSE. Setp 1 e step 3 são fáceis, mas estou preso no passo 2. Eu não pareço encontrar nenhuma amostra de código ou instruções óbvias de SSE para obter o recirpocal de um valorE se não é zero. Para a divisão, _mm_rcp_ps faz o truque e talvez combine-o com um movimento condicional, mas como obter uma máscara indicando qual componente é zero?

Eu não preciso do código para o algoritmo descrito acima, apenas a função "inverso se não zero":

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

Obrigado!

questionAnswers(1)

yourAnswerToTheQuestion