BYTE-Puffer (0-255) in Fließkomma-Puffer umwandeln (0.0-1.0)

7

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.

    
Veehmot 25.06.2009, 13:00
quelle

7 Antworten

9

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.

    
moonshadow 25.06.2009, 13:13
quelle
8

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.

%Vor%

Bearbeiten : Verbessern Sie die Genauigkeit, indem Sie (f + c/b) * b anstelle von f * b + c verwenden.

Bearbeiten : SSE3-Version hinzufügen.

    
sam hocevar 19.03.2011 14:46
quelle
2

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.

    
Mats Fredriksson 25.06.2009 13:12
quelle
2

Sie müssen herausfinden, was der Engpass ist:

  • Wenn Sie Ihre Datentabellen in die falsche Richtung iterieren, treffen Sie ständig einen Cache-Fehltreffer. Kein Nachschlagen wird jemals dazu beitragen, das zu umgehen.
  • Wenn Ihr Prozessor beim Skalieren langsamer ist als beim Nachschlagen, können Sie die Leistung steigern, indem Sie nachschlagen, vorausgesetzt, die Nachschlagetabelle passt in den Cache.

Noch ein Tipp:

%Vor%     
xtofl 25.06.2009 13:19
quelle
1

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%     
laalto 25.06.2009 13:14
quelle
1

Look-up-Tabelle ist der schnellste Weg, um zu konvertieren :) Hier geht's:

Python-Code zum Generieren der byte_to_float.h-Datei zum Einschließen:

%Vor%

Und C ++ - Code, um die Konvertierung zu erhalten:

%Vor%

Einfach ist es nicht?

    
Viet 01.03.2010 11:22
quelle
0

Berechne nicht 1/255 jedes Mal. Ich weiß nicht, ob ein Compiler schlau genug ist, um dies zu entfernen. Berechne es einmal und wiederhole es jedes Mal. Noch besser, definiere es als Konstante.

    
Rodyland 26.06.2009 05:28
quelle