J'utilise une variation d'un filtre médian à 5 croix sur les données d'image sur un petit système embarqué, c'est-à-dire
x
x x x
x
L'algorithme est vraiment simple: lire 5 valeurs entières non signées, obtenir les 2 plus élevées, faire des calculs sur celles-ci et réécrire le résultat entier non signé.
Ce qui est bien, c'est que les 5 valeurs d'entrée entières sont toutes dans la plage de 0 à 20. La valeur entière calculée est également dans la plage 0-20!
Grâce au profilage, j'ai compris que l'obtention des deux plus grands nombres est le goulot d'étranglement, donc je veux accélérer cette partie. Quelle est la manière la plus rapide d'effectuer cette sélection?
L'algorithme actuel utilise un masque de 32 bits avec 1 à la position donnée par les 5 chiffres et une fonction CLZ prise en charge par HW.
Je dois dire que le CPU est un processeur propriétaire, non disponible en dehors de mon entreprise. Mon compilateur est GCC mais fait sur mesure pour ce CPU.
J'ai essayé de comprendre si je peux utiliser une table de recherche, mais je n'ai pas réussi à générer une clé que je peux utiliser.
J'ai combinaisons pour l'entrée mais l'ordre n'est pas important, c'est -à- dire le même que .[5,0,0,0,5]
[5,5,0,0,0]
Il se trouve que la fonction de hachage ci-dessous produit un hachage parfait sans collisions!
def hash(x):
h = 0
for i in x:
h = 33*h+i
return h
Mais le hachage est énorme et il n'y a tout simplement pas assez de mémoire pour l'utiliser.
Existe-t-il un meilleur algorithme que je peux utiliser? Est-il possible de résoudre mon problème en utilisant une table de correspondance et en générant une clé?
hash
effectue déjà plus d'opérations. Les appels ultérieurs à la méthode sont-ils liés, par exemple, la centrale sex
déplace-t-elle dans la matrice ligne par ligne?