Разделите на число с плавающей точкой, используя NEON - PullRequest
15 голосов
/ 20 июля 2011

Я обрабатываю изображение на четыре пикселя за раз, это на armv7 для приложения Android.

Я хочу разделить вектор float32x4_t на другой вектор, но числа в немварьируются от около 0.7 до 3.85, и мне кажется, что единственный способ разделить это использовать сдвиг вправо, но это для числа, которое 2^n.

Кроме того, яновшество в этом, поэтому приветствуется любая конструктивная помощь или комментарий.

Пример:

Как я могу выполнить эти операции со встроенными функциями 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}

1 Ответ

23 голосов
/ 26 июля 2011

Набор команд NEON не имеет деления с плавающей запятой.

Если вы знаете a priori , что ваши значения не плохо масштабируются, и вам не требуется правильное округление (это почти наверняка имеет место при обработке изображений), тогда вы можете использовать Обратная оценка, шаг уточнения и умножение вместо деления:

// 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);
...