Ich verwende eine Variation eines 5-Kreuz-Medianfilters für Bilddaten auf einem kleinen eingebetteten System, d. H.
x
x x x
x
Der Algorithmus ist wirklich einfach: Lesen Sie 5 vorzeichenlose Ganzzahlwerte, erhalten Sie die höchsten 2, führen Sie einige Berechnungen durch und schreiben Sie das vorzeichenlose Ganzzahlergebnis zurück.
Das Schöne ist, dass die 5 ganzzahligen Eingabewerte alle im Bereich von 0 bis 20 liegen. Der berechnete ganzzahlige Wert liegt ebenfalls im Bereich von 0 bis 20!
Durch die Profilerstellung habe ich herausgefunden, dass das Erhalten der zwei größten Zahlen der Engpass ist, daher möchte ich diesen Teil beschleunigen. Was ist der schnellste Weg, um diese Auswahl durchzuführen?
Der aktuelle Algorithmus verwendet eine 32-Bit-Maske mit 1 an der durch die 5 Zahlen angegebenen Position und eine HW-unterstützte CLZ-Funktion.
Ich sollte sagen, dass es sich bei der CPU um eine proprietäre CPU handelt, die außerhalb meines Unternehmens nicht verfügbar ist. Mein Compiler ist GCC, aber maßgeschneidert für diese CPU.
Ich habe versucht herauszufinden, ob ich eine Nachschlagetabelle verwenden kann, aber ich konnte keinen Schlüssel generieren, den ich verwenden kann.
Ich habe Kombinationen für die Eingabe, aber die Reihenfolge ist nicht wichtig, dh ist die gleiche wie .[5,0,0,0,5]
[5,5,0,0,0]
Es kommt vor, dass die unten stehende Hash-Funktion einen perfekten Hash ohne Kollisionen erzeugt!
def hash(x):
h = 0
for i in x:
h = 33*h+i
return h
Aber der Hash ist riesig und es gibt einfach nicht genug Speicher, um das zu nutzen.
Gibt es einen besseren Algorithmus, den ich verwenden kann? Ist es möglich, mein Problem mithilfe einer Nachschlagetabelle zu lösen und einen Schlüssel zu generieren?
hash
führt bereits weitere Operationen aus. Beziehen sich nachfolgende Aufrufe der Methode darauf, z. B.x
bewegt sich die Zentrale zeilenweise durch die Matrix?