Używam odmiany 5-krzyżowego filtra środkowego na danych obrazu w małym systemie osadzonym, tj
x
x x x
x
Algorytm jest naprawdę prosty: odczytaj 5 liczb całkowitych bez znaku, uzyskaj najwyższe 2, wykonaj kilka obliczeń i zapisz wynik na liczbach całkowitych bez znaku.
Ładne jest to, że 5 wartości całkowitych wejściowych mieści się w zakresie 0-20. Obliczona wartość całkowita również mieści się w zakresie 0-20!
Dzięki profilowaniu zorientowałem się, że uzyskanie dwóch największych liczb jest wąskim gardłem, więc chcę przyspieszyć tę część. Jaki jest najszybszy sposób na dokonanie tego wyboru?
Obecny algorytm wykorzystuje maskę 32-bitową z 1 w pozycji podanej przez 5 liczb i obsługiwaną przez HW funkcję CLZ.
Powinienem powiedzieć, że procesor jest zastrzeżony, niedostępny poza moją firmą. Mój kompilator to GCC, ale dostosowany do tego procesora.
Próbowałem dowiedzieć się, czy mogę użyć tabeli odnośników, ale nie udało mi się wygenerować klucza, którego mogę użyć.
Mam kombinacji dla danych wejściowych, ale kolejność nie jest ważna, tzn. Jest taka sama jak .[5,0,0,0,5]
[5,5,0,0,0]
Zdarza się, że funkcja skrótu poniżej tworzy idealny skrót bez kolizji!
def hash(x):
h = 0
for i in x:
h = 33*h+i
return h
Ale skrót jest ogromny i po prostu nie ma wystarczającej ilości pamięci, aby z niego skorzystać.
Czy istnieje lepszy algorytm, którego mogę użyć? Czy jest możliwe rozwiązanie mojego problemu za pomocą tabeli przeglądowej i wygenerowania klucza?
hash
już wykonuje więcej operacji. Czy kolejne wywołania metody są powiązane, np. Czy centralax
przechodzi przez matrycę rząd po rzędzie?