Heim > Backend-Entwicklung > C++ > Wie kann ich mit SSE/AVX effizient zwischen Double und int64 konvertieren?

Wie kann ich mit SSE/AVX effizient zwischen Double und int64 konvertieren?

Susan Sarandon
Freigeben: 2024-12-04 00:38:09
Original
785 Leute haben es durchsucht

How Can I Efficiently Convert Between Double and int64 Using SSE/AVX?

Effiziente Double/int64-Konvertierungen mit SSE/AVX

Während SSE2 Anweisungen zum Konvertieren von Vektoren zwischen Gleitkommazahlen mit einfacher Genauigkeit und 32-Bit-Ganzzahlen bereitstellt , entsprechende intrinsische Werte für Ganzzahlen mit doppelter Genauigkeit und 64-Bit-Ganzzahlen fehlen. Selbst AVX bietet diese Konvertierungen nicht an.

Fallback-Techniken

In Ermangelung spezieller Anweisungen gibt es mehrere Ansätze, diese Konvertierungen zu simulieren:


  • Tricks für Truncated Konvertierungen:

    - For values in specific ranges, using a shifted add and a bitwise XOR can convert double to uint64_t or int64_t in just two instructions.
    - Reversing these steps can perform the inverse conversions.
    Nach dem Login kopieren
    • Umfassende Konvertierungen:

      • Es wird eine Reihe bitweiser Operationen und Verschiebungen verwendet Es ist möglich, uint64_t oder int64_t mit 5 oder 6 Anweisungen in double umzuwandeln bzw..

Implementierungsdetails

Der Trick für abgeschnittene Konvertierungen basiert auf dem Tatsache, dass Gleitkommawerte mit doppelter Genauigkeit im Bereich [2^52, 2^53) ihr niedrigstes Mantissenbit haben Ausrichtung auf das niedrigstwertige Bit. Durch Hinzufügen eines bestimmten Maskenwerts und Durchführen einer bitweisen Operation kann die Ganzzahldarstellung erhalten werden.

Die Vollbereichskonvertierungen beheben die Probleme mit der Vorzeichenerweiterung und nutzen die Tatsache aus, dass sich die Addition in Gleitkommazahlen auf x86 aufheben kann Bruchbits, die die genaue Rekonstruktion des Ergebnisses mit doppelter Genauigkeit ermöglichen.

Rundung Verhalten

Die verkürzten Konvertierungsmethoden folgen dem aktuellen Rundungsmodus, mit der Ausnahme, dass beim Runden gegen Null möglicherweise gegen negative Unendlichkeit gerundet wird. Die vollständigen Konvertierungen gewährleisten eine korrekte Rundung für alle Modi.

Verfügbarkeit

Die vorgestellten Techniken bieten eine Problemumgehung für das Fehlen direkter int64_t- und Doppelkonvertierungen in SSE/AVX. Diese Methoden können besonders nützlich bei der Optimierung von Code sein, bei dem diese Konvertierungen erforderlich sind, und sorgen für ein Gleichgewicht zwischen Effizienz und Genauigkeit.

Das obige ist der detaillierte Inhalt vonWie kann ich mit SSE/AVX effizient zwischen Double und int64 konvertieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage