Eu uso uma variação de um filtro mediano de 5 cruzamentos nos dados de imagem em um pequeno sistema incorporado, ou seja,
x
x x x
x
O algoritmo é realmente simples: leia 5 valores inteiros não assinados, obtenha os 2 mais altos, faça alguns cálculos sobre esses valores e escreva novamente o resultado inteiro não assinado.
O interessante é que os 5 valores de entrada inteira estão todos no intervalo de 0 a 20. O valor inteiro calculado também está na faixa de 0 a 20!
Através da criação de perfil, eu descobri que obter os dois maiores números é o gargalo, por isso quero acelerar essa parte. Qual é a maneira mais rápida de realizar essa seleção?
O algoritmo atual usa uma máscara de 32 bits com 1 na posição fornecida pelos 5 números e uma função CLZ suportada por HW.
Devo dizer que a CPU é proprietária, não disponível fora da minha empresa. Meu compilador é o GCC, mas foi feito sob medida para esta CPU.
Tentei descobrir se posso usar uma tabela de pesquisa, mas não consegui gerar uma chave que possa usar.
Eu tenho combinações para a entrada, mas a ordem não é importante, ou seja, é a mesma que .[5,0,0,0,5]
[5,5,0,0,0]
Acontece que a função hash abaixo produz um hash perfeito sem colisões!
def hash(x):
h = 0
for i in x:
h = 33*h+i
return h
Mas o hash é enorme e simplesmente não há memória suficiente para usá-lo.
Existe um algoritmo melhor que eu possa usar? É possível resolver meu problema usando uma tabela de pesquisa e gerando uma chave?
hash
já realiza mais operações. As chamadas subseqüentes ao método estão relacionadas, por exemplo, a centralx
percorre a matriz linha por linha?