SSE: odwrotność, jeśli nie zero

Jak mogę wziąć odwrotność (odwrotność) pływaków z instrukcjami SSE, aletylko dla niezerowych wartości?

Poniżej tło:

Chcę normalizować tablicę wektorów, aby każdy wymiar miał tę samą średnią. W C można to zakodować jako:

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];

Teraz, ze względu na wydajność, chcę to zrobić za pomocą intinsics SSE. Setp 1 et step 3 są łatwe, ale utknąłem w kroku 2. Wydaje się, że nie znalazłem żadnego przykładowego kodu ani oczywistej instrukcji SSE, aby wziąć recyrkulację wartościJeśli to nie jest zero. W przypadku podziału _mm_rcp_ps wykonuje sztuczkę i może połączyć ją z ruchem warunkowym, ale jak uzyskać maskę wskazującą, który komponent jest zerowy?

Nie potrzebuję kodu do opisanego powyżej algorytmu, tylko funkcja „inverse if not zero”:

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

Dzięki!

questionAnswers(1)

yourAnswerToTheQuestion