Есть большой (~ 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, не имеет значения, сравниваю ли я целые числа, описанным способом или плавающими.