Heim  >  Artikel  >  Backend-Entwicklung  >  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?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-03 13:21:30569Durchsuche

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. Mit dieser Frage sollen die optimalen Anweisungen für diese Aufgabe ermittelt werden.

Anleitung für die AVX2-Architektur:

  • Verwenden Sie PMOVZX, um Ihre Zeichen auf 32-Bit zu erweitern Ganzzahlen in einem 256b-Register.
  • In-Place-Konvertierung mit VCVTDQ2PS.
; 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 hohen 64 Bit zu versorgen. 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

Intrinsische Überlegungen:

  • GCC und MSVC erfordern möglicherweise eine spezielle Behandlung, um eine optimale Codegenerierung sicherzustellen, wenn Intrinsics für VPMOVZXBD ymm,[mem] verwendet werden.
  • Erwägen Sie stattdessen die Verwendung des Intrinsic _mm_loadl_epi64, das in das eingebunden werden kann Speicheroperand für optimalen ASM bei -O3 mit GCC auf GCC-Versionen 9 und höher.
  • Für die reine AVX1-Optimierung ist das Schreiben der intrinsischen Version eine wenig unterhaltsame Übung.

Das obige ist der detaillierte Inhalt vonWie lade ich 8 Zeichen 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