„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie lade ich 8 Zeichen als gepackte Gleitkommazahlen mit einfacher Genauigkeit in eine __m256-Variable?

Wie lade ich 8 Zeichen als gepackte Gleitkommazahlen mit einfacher Genauigkeit in eine __m256-Variable?

Veröffentlicht am 06.11.2024
Durchsuche:424

How to Load 8 Chars into an __m256 Variable as Packed Single Precision Floats?

Laden von 8 Zeichen aus dem Speicher in eine __m256-Variable als gepackte Gleitkommazahlen mit einfacher Präzision

In dem Bemühen, einen Algorithmus für die Gaußsche Unschärfe zu optimieren, haben Sie Versuchen Sie, die Verwendung eines Float-Puffers durch eine intrinsische Variable __m256 zu ersetzen. Ziel dieser Frage ist es, die optimalen Anweisungen für diese Aufgabe zu ermitteln.

Anleitung für die AVX2-Architektur:

  • Verwenden Sie PMOVZX, um Ihre Zeichen auf 32-Bit zu erweitern Ganzzahlen in einem 256b-Register.
  • In-Place mit VCVTDQ2PS in Float konvertieren.
; rsi = new_image
VPMOVZXBD   ymm0,  [rsi]   ; or SX to sign-extend  (Byte to DWord)
VCVTDQ2PS   ymm0, ymm0     ; convert to packed foat

Zusätzliche Strategien:

  • Erwägen Sie die Verwendung einer 128-Bit-Broadcast-Last, um vpmovzxbd ymm, xmm und vpshufb ymm (_mm256_shuffle_epi8) für die zu füttern hohe 64 Bit. Dieser Ansatz reduziert die UOP-Anzahl und kann auf Ryzen-CPUs von Vorteil sein.
  • Vermeiden Sie die Verwendung zusätzlicher Shuffle-Anweisungen, da diese zu einem Engpass werden können, wenn das Shuffling bereits eine Einschränkung darstellt.

Anweisungen für die AVX1-Architektur:

  • Führen Sie die folgenden Schritte aus:

    VPMOVZXBD   xmm0,  [rsi]
    VPMOVZXBD   xmm1,  [rsi 4]
    VINSERTF128 ymm0, ymm0, xmm1, 1   ; put the 2nd load of data into the high128 of ymm0
    VCVTDQ2PS   ymm0, ymm0     ; convert to packed float

Intrinsics-Überlegungen:

  • GCC und MSVC erfordern möglicherweise eine spezielle Handhabung, um eine optimale Codegenerierung sicherzustellen, wenn Intrinsics verwendet werden VPMOVZXBD ymm,[mem].
  • Erwägen Sie stattdessen die Verwendung des _mm_loadl_epi64-Intrinsic, das in den Speicheroperanden für optimales ASM bei -O3 mit GCC auf GCC-Versionen 9 und höher gefaltet werden kann.
  • Für Bei der reinen AVX1-Optimierung ist das Schreiben der intrinsischen Version eine wenig unterhaltsame Übung.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3