Эффективное сравнение с плавающей запятой (Cortex -A8)

Существует большой (~100 000 )массив из плавающих точечных переменных, и там это порог (также плавающая точка ).

Проблема в том, что мне приходится сравнивать каждую переменную из массива с порогом, но передача флагов NEON занимает очень много времени (~20 циклов в соответствии с профайлером ).

Есть ли эффективный способ сравнить эти значения?

ПРИМЕЧАНИЕ:Поскольку ошибка округления не имеет значения, я попробовал следующее:

float arr[10000];
float threshold; 
....

int a = arr[20]; // e.g.
int t = threshold;
if (t > a) {....}

Но в этом случае я получил следующую последовательность команд процессора:

vldr.32        s0, [r0]
vcvt.s32.f32   s0, s0
vmov           r0, s0    <--- takes 20 cycles as `vmrs APSR_nzcv, fpscr` in case of 
cmp            r0, r1         floating point comparison

Поскольку преобразование происходит в NEON, не имеет значения, сравниваю ли я целые числа, описанным способом или плавает.

6
задан Alex 30 April 2012 в 10:41
поделиться