C'è una grande (~ 100 000) array di galleggiante variabili punto, e v'è una soglia (anche floating punto).efficiente Confronto virgola mobile (Cortex-A8)
Il problema è che devo confrontare ciascuna variabile della matrice con una soglia, ma il trasferimento di flag NEON richiede molto tempo (~ 20 cicli in base a un profiler).
Esiste un modo efficace per confrontare questi valori?
NOTA: errore di arrotondamento non importa, ho provato il seguente:
float arr[10000];
float threshold;
....
int a = arr[20]; // e.g.
int t = threshold;
if (t > a) {....}
Ma in questo caso ottengo la seguente sequenza comando processore:
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
Come conversione avviene a NEON, non ho importanza se confronti gli interi, per modo descritto o float.
Le persone su codereview.stackexchange.com potrebbero dover dire qualcosa anche a questo. – PlasmaHH
Il tuo codice è incoerente con la tua affermazione di problema: i dati sono a virgola mobile ma tu mostri la soglia come int - anche tu lanci ciascun valore di dati float a int - perché? Se i dati sono float, la soglia dovrebbe essere float e dovresti fare un confronto float (cioè nessuna conversione int-float). Inoltre, che cosa intendete fare con valori superiori alla (o inferiore) soglia (questo determinerà se NEON è appropriato o meno)? –
Molte persone abbandonano NEON per essere più lente di ARM senza sapere cosa evitare e come programmare correttamente la SIMD. A seconda di cosa vuoi esattamente, non è possibile iniziare con SIMD o non sai come gestire if-else con NEON. –