Istnieje duża (~ 100 000) tablicę pływający zmiennoprzecinkowych, i nie ma próg (również pływający punkt).Skuteczna pływający porównanie punkt (Cortex-A8)
Problem polega na tym, że muszę porównać każdą zmienną z tablicy z progiem, ale transfer flag NEON trwa naprawdę długo (~ 20 cykli zgodnie z profilerem).
Czy istnieje jakiś skuteczny sposób porównania tych wartości?
UWAGA: błędu jako zaokrąglenie nie ma znaczenia, próbowałem następujące:
float arr[10000];
float threshold;
....
int a = arr[20]; // e.g.
int t = threshold;
if (t > a) {....}
Ale w tym przypadku otrzymuję następującą sekwencję poleceń Procesor:
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
Ponieważ konwersja dzieje w NEON, nie ma znaczenia, czy porównaję liczby całkowite, opisywaną drogą, czy pływaki.
Osoby powyżej codereview.stackexchange.com również mogą coś o tym powiedzieć. – PlasmaHH
Twój kod jest niespójny z twoim stwierdzeniem problemu - dane są zmienne, ale pokazujesz próg jako int - również rzucasz każdą wartość danych float na int - dlaczego? Jeśli dane są zmiennoprzecinkowe, próg powinien być zmienny i powinieneś wykonać porównanie zmiennoprzecinkowe (tzn. Bez konwersji typu int-float). Ponadto, co zamierzasz zrobić z wartościami, które są większe niż (lub mniejszy niż) próg (to zdecyduje, czy NEON jest odpowiedni, czy nie)? –
Wiele osób porzuca NEON, ponieważ jest wolniejszy od ARM, nie wiedząc, czego unikać i jak poprawnie programować SIMD. W zależności od tego, czego akurat chcesz, albo nie jest możliwe rozpoczęcie SIMD, albo nie wiesz, jak sobie z nim poradzić, jeśli nie - z NEON. –