Sviluppo algoritmi di elaborazione immagini (utilizzando GCC, targeting per ARMv7 (Raspberry Pi 2B)).Ricerca rapida/sostituzione di singoli byte corrispondenti in un array a 8 bit, su ARM
In particolare utilizzare un semplice algoritmo, che cambia indice in una maschera:
void ChangeIndex(uint8_t * mask, size_t size, uint8_t oldIndex, uint8_t newIndex)
{
for(size_t i = 0; i < size; ++i)
{
if(mask[i] == oldIndex)
mask[i] = newIndex;
}
}
Sfortunatamente ha scarse prestazioni per la piattaforma di destinazione.
C'è un modo per ottimizzarlo?
immediatamente evidente come fare che più veloce - ci possono essere trucchi, se si sa di più sui dati - per esempio, si potrebbe avere un elenco di celle che contengono valore 'X' - ma questo è davvero utile solo se il numero di" colpi "è piuttosto basso - se stai colpendo la maggior parte delle voci in' mask' che corrisponde a 'oldIndex', allora è improbabile che acceleri. Quale valore è 'size' e quale percentuale della tabella ha valore' oldIndex' in media? –
Quali opzioni del compilatore stai usando? Assicurati di averlo istruito a usare le istruzioni NEON ('-mfpu = neon-vfpv4', credo), altrimenti potrebbe generare codice compatibile con le vecchie CPU che non hanno NEON. – Gilles
Si dovrebbe anche ottenere un po 'di velocità usando l'operatore ternario: 'mask [i] = (mask [i] == oldIndex)? newIndex: mask [i]; ' – Miki