Wie kann ich einen BYTE-Puffer (von 0 bis 255) in einen Float-Puffer (von 0.0 bis 1.0) konvertieren? Natürlich sollte es eine Beziehung zwischen den beiden Werten geben, z. B .: 0 im Byte-Puffer wird .0.f im Float-Puffer, 128 im Byte-Puffer ist .5f im Float-Puffer, 255 im Byte-Puffer ist 1.f in float buffer.
Eigentlich ist das der Code, den ich habe:
%Vor%Das läuft sehr langsam. Ein Freund von mir schlug mir vor, eine Umrechnungstabelle zu verwenden, aber ich wollte wissen, ob jemand anders mir einen anderen Ansatz geben kann.
Unabhängig davon, ob Sie eine Nachschlagetabelle verwenden oder nicht, macht Ihr Code bei jeder Schleifeniteration, die er wirklich nicht benötigt, eine Menge Arbeit - wahrscheinlich genug, um die Kosten der Konvertierung und Multiplikation zu überschatten.
Deklarieren Sie Ihre Zeiger einzuschränken und Zeiger, die Sie nur von const lesen. Multiplizieren Sie mit 1/255, anstatt durch 255 zu dividieren. Berechnen Sie die Zeiger nicht in jeder Iteration der inneren Schleife, sondern berechnen Sie nur die Anfangswerte und inkrementieren Sie sie. Rollen Sie die innere Schleife ein paar Mal ab. Verwenden Sie Vektor-SIMD-Operationen, wenn Ihr Ziel dies unterstützt. Inkrementiere und vergleiche nicht mit Maximum, dekrementiere und vergleiche stattdessen mit Null.
Etwas wie
%Vor%wäre ein Anfang.
Ich weiß, das ist eine alte Frage, aber da niemand eine Lösung unter Verwendung der IEEE-Float-Repräsentation gab, ist hier eine.
%Vor% Das ist mehr als doppelt so schnell als eine int
to float
Konvertierung auf meinem Computer (Core 2 Duo CPU).
Hier ist eine SSE3-Version des obigen Codes, die 16 Floats gleichzeitig ausführt. Es erfordert, dass bytepixel
und floatpixel
auf 128-Bit ausgerichtet sind und dass die Gesamtgröße ein Vielfaches von 4 ist. Beachten Sie, dass das integrierte SSE3-Feature zum Floaten von Conversions hier nicht viel hilft, da sie zusätzlich benötigt werden Vermehrung sowieso. Ich glaube, das ist der kürzeste Weg, um Anweisungen zu bekommen, aber wenn Ihr Compiler nicht schlau genug ist, möchten Sie vielleicht die Dinge von Hand ausrollen und planen.
Bearbeiten : Verbessern Sie die Genauigkeit, indem Sie (f + c/b) * b
anstelle von f * b + c
verwenden.
Bearbeiten : SSE3-Version hinzufügen.
Verwenden Sie dazu eine statische Nachschlagetabelle. Als ich in einer Firma für Computergrafik gearbeitet habe, hatten wir eine fest codierte Nachschlagetabelle, die wir mit dem Projekt verbunden haben.
Sie müssen herausfinden, was der Engpass ist:
Noch ein Tipp:
%Vor%Ja, eine Nachschlagetabelle ist definitiv schneller als viele Unterteilungen in einer Schleife. Erzeugen Sie einfach eine Tabelle mit 256 vorberechneten Float-Werten und verwenden Sie den Byte-Wert, um diese Tabelle zu indizieren.
Sie können die Schleife auch etwas optimieren, indem Sie die Indexberechnung entfernen und etwas wie
tun %Vor%Tags und Links arrays c++ floating-point bytearray byte