Utilizo una variación de un filtro mediano de 5 cruces en los datos de imagen en un pequeño sistema integrado, es decir
x
x x x
x
El algoritmo es realmente simple: lea 5 valores enteros sin signo, obtenga los 2 más altos, haga algunos cálculos y escriba el resultado entero sin signo.
Lo que es bueno es que los 5 valores de entrada enteros están todos en el rango de 0-20. ¡El valor entero calculado también está en el rango 0-20!
A través de la elaboración de perfiles, he descubierto que obtener los dos números más grandes es el cuello de botella, así que quiero acelerar esta parte. ¿Cuál es la forma más rápida de realizar esta selección?
El algoritmo actual usa una máscara de 32 bits con 1 en la posición dada por los 5 números y una función CLZ compatible con HW.
Debo decir que la CPU es propietaria, no está disponible fuera de mi empresa. Mi compilador es GCC pero hecho a medida para esta CPU.
He intentado averiguar si puedo usar una tabla de búsqueda, pero no he podido generar una clave que pueda usar.
Tengo combinaciones para la entrada, pero el orden no es importante, es decir, es el mismo que .[5,0,0,0,5]
[5,5,0,0,0]
¡Sucede que la siguiente función hash produce un hash perfecto sin colisiones!
def hash(x):
h = 0
for i in x:
h = 33*h+i
return h
Pero el hash es enorme y simplemente no hay suficiente memoria para usarlo.
¿Hay un mejor algoritmo que pueda usar? ¿Es posible resolver mi problema usando una tabla de búsqueda y generando una clave?
hash
ya realiza más operaciones. ¿Las llamadas posteriores al método están relacionadas, por ejemplo, la central sex
mueve a través de la matriz fila por fila?