Heim >Backend-Entwicklung >C++ >Wie lade ich mit AVX2 8 Zeichen aus dem Speicher als gepackte Gleitkommazahlen mit einfacher Genauigkeit in eine __m256-Variable?
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
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
Zusätzliche Überlegungen
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!