Uso una variazione di un filtro mediano a 5 incroci sui dati di immagine su un piccolo sistema incorporato, ad es
x
x x x
x
L'algoritmo è davvero semplice: leggi 5 valori interi senza segno, ottieni i 2 più alti, fai dei calcoli su questi e riscrivi il risultato intero senza segno.
La cosa bella è che i 5 valori di input interi sono tutti nell'intervallo 0-20. Anche il valore intero calcolato è compreso nell'intervallo 0-20!
Attraverso la profilazione, ho capito che ottenere i due numeri più grandi è il collo di bottiglia, quindi voglio accelerare questa parte. Qual è il modo più veloce per eseguire questa selezione?
L'attuale algoritmo utilizza una maschera a 32 bit con 1 nella posizione indicata dai 5 numeri e una funzione CLZ supportata da HW.
Dovrei dire che la CPU è proprietaria, non disponibile al di fuori della mia azienda. Il mio compilatore è GCC ma creato su misura per questa CPU.
Ho provato a capire se posso usare una tabella di ricerca ma non sono riuscito a generare una chiave che posso usare.
Ho combinazioni per l'input ma l'ordine non è importante, cioè è lo stesso di .[5,0,0,0,5]
[5,5,0,0,0]
Succede che la funzione hash di seguito produce un hash perfetto senza collisioni!
def hash(x):
h = 0
for i in x:
h = 33*h+i
return h
Ma l'hash è enorme e semplicemente non c'è abbastanza memoria per usarlo.
Esiste un algoritmo migliore che posso usare? È possibile risolvere il mio problema usando una tabella di ricerca e generando una chiave?
hash
già esegue più operazioni. Le chiamate successive al metodo sono correlate, ad esempio la centrale six
sposta attraverso la matrice riga per riga?