Diviser par un nombre à virgule flottante en utilisant les éléments insortingnsèques NEON

Je traite une image de quatre pixels à la fois, ceci sur armv7 pour une application Android.

Je souhaite diviser un vecteur float32x4_t par un autre vecteur, mais les nombres qu’il float32x4_t varient de 0.7 à 3.85 environ. Il me semble que le seul moyen de diviser consiste à utiliser le décalage à droite, mais pour un nombre égal à 2^n .

De plus, je suis nouveau dans ce domaine, donc toute aide ou commentaire constructif est le bienvenu.

Exemple:

Comment puis-je effectuer ces opérations avec les éléments insortingnsèques NEON?

 float32x4_t a = {25.3,34.1,11.0,25.1}; float32x4_t b = {1.2,3.5,2.5,2.0}; // somthing like this float32x4 resultado = a/b; // {21.08,9.74,4.4,12.55} 

Le jeu d’instructions NEON n’a pas de division en virgule flottante.

Si vous savez a priori que vos valeurs ne sont pas mal dimensionnées et que vous n’avez pas besoin d’arrondir correctement (c’est certainement le cas si vous effectuez un traitement d’image), vous pouvez utiliser une estimation réciproque, une étape de raffinement et la multiplier à la place. d’une division:

 // get an initial estimate of 1/b. float32x4_t reciprocal = vrecpeq_f32(b); // use a couple Newton-Raphson steps to refine the estimate. Depending on your // application's accuracy requirements, you may be able to get away with only // one refinement (instead of the two used here). Be sure to test! reciprocal = vmulq_f32(vrecpsq_f32(b, reciprocal), reciprocal); reciprocal = vmulq_f32(vrecpsq_f32(b, reciprocal), reciprocal); // and finally, compute a/b = a*(1/b) float32x4_t result = vmulq_f32(a,reciprocal);