Heim >Backend-Entwicklung >C++ >Wie lade ich mit AVX2 8 Zeichen aus dem Speicher als gepackte Gleitkommazahlen mit einfacher Genauigkeit in eine __m256-Variable?

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

DDD
DDDOriginal
2024-10-31 21:43:02779Durchsuche

How to Load 8 Characters from Memory into an __m256 Variable as Packed Single Precision Floats Using AVX2?

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

In Gaußschen Unschärfealgorithmen kann eine Optimierung für eine schnellere Ausführung erreicht werden durch effizientes Laden von Daten in Vektorregister. Eine solche Optimierung besteht darin, ein Array von Floats durch eine __m256-Variable zu ersetzen. Dieser Artikel bietet eine optimale Lösung für diese Aufgabe, indem er die Leistungsfähigkeit der AVX2-Anweisungen nutzt.

Lösung mit AVX2-Anweisungen

Um effektiv 8 Zeichen aus dem Speicher in eine __m256-Variable zu laden Bei Verwendung von AVX2 werden die folgenden Anweisungen empfohlen:

VPMOVZXBD  ymm0,  [rsi]  ; or SX to sign-extend  (Byte to DWord)
VCVTDQ2PS   ymm0, ymm0     ; convert to packed foat

Besonderheiten der Anweisungen

  • VPMOVZXBD: Null-erweitert die 8-Bit-Zeichen in 32- Bit-Ganzzahlen im ymm0-Register.
  • VCVTDQ2PS: Konvertiert die 32-Bit-Ganzzahlen in gepackte Gleitkommazahlen mit einfacher Genauigkeit und speichert sie direkt in ymm0.

Zusätzliche Optimierung

Um diesen Prozess weiter zu optimieren, sollten Sie erwägen, eine Broadcast-Last zum Einspeisen des VPMOVZXBD-Befehls und einen Vpshufb-Befehl für die hohen 64 Bits zu verwenden. Diese Strategie reduziert die gesamte UOP-Anzahl und verbessert die Effizienz:

<code class="pseudocode">__m256 b = [float(new_image[x+7]), float(new_image[x+6]), ... , float(new_image[x])];
__m256 b = _mm256_broadcast_ss(&new_image[x])
_mm256_shuffle_epi8(b, _mm256_set1_epi8(0)); // fills upper 64 bits with zeroes
_mm256_cvtps_epu32(b); // convert to integers
_mm256_cvtepu32_ps(b); // convert back to floats</code>

Vermeiden Sie suboptimale Techniken

  • Vermeiden Sie die Verwendung mehrerer 128-Bit- oder 256-Bit-Ladevorgänge und nachfolgende Umstellungen, da dies zu unnötigen Engpässen führen kann.
  • Verwenden Sie keine VPMOVZXD-Anweisung gefolgt von separaten Speicheroperanden für VPMOVZX, da dies zu einer suboptimalen Codegenerierung führt.

Zusätzliche Überlegungen

  • Erwägen Sie die Verwendung einer sicheren intrinsischen Komponente, falls verfügbar, um potenzielle Probleme mit der Speicherausrichtung oder dem Zugriff auf nicht initialisierten Speicher zu vermeiden.
  • Verwenden Sie geeignete interne _mm_loadl_epi64- oder _mm_loadu_si64-Intrinsics, um ein Laden zu vermeiden mehr Daten als nötig oder potenzielle Segmentierungsfehler verursachen.

Das obige ist der detaillierte Inhalt vonWie lade ich mit AVX2 8 Zeichen aus dem Speicher als gepackte Gleitkommazahlen mit einfacher Genauigkeit in eine __m256-Variable?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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