Heim >Backend-Entwicklung >C++ >Wie kann AVX2 am effizientesten für das Linkspacken mit einer Maske eingesetzt werden?
Linkspackungsproblem
Stellen Sie sich das Szenario vor, in dem es ein Eingabearray und ein Ausgabearray gibt, aber nur bestimmte Elemente, die eine Bedingung erfüllen, vorhanden sein müssen in das Ausgabearray geschrieben. Was ist der effizienteste Ansatz, um dies mit AVX2 zu erreichen?
SSE-Ansatz
Der SSE-Ansatz beinhaltet die Verwendung von _mm_movemask_ps, um eine 4-Bit-Maske aus der Eingabemaske zu extrahieren. und dann diese Maske verwenden, um Shuffle-Steuerdaten mit _mm_load_si128 zu generieren. Schließlich wird _mm_shuffle_epi8 verwendet, um die Werte zu permutieren, um gültige Elemente an der Vorderseite des SIMD-Registers auszurichten. Dieser Ansatz funktioniert gut für SSE-Vektoren mit 4 Breiten und einer Nachschlagetabelle (LUT) mit 16 Einträgen.
AVX-Einschränkungen
Allerdings für 8-weite AVX Bei Vektoren würde die LUT eine wesentlich größere Anzahl von Einträgen (256) mit jeweils 32 Bytes erfordern, was zu einer Speichernutzung von 8 KB führen würde. Es ist überraschend, dass AVX keine Anleitung zur Vereinfachung dieses Prozesses anbietet, wie etwa einen maskierten Laden mit Verpackung.
AVX2-Lösung
Trotz des Fehlens einer speziellen Anleitung , ist es möglich, eine effiziente Linkspackung in AVX2 durch eine Kombination von Techniken zu erreichen:
Algorithmus
Der Algorithmus für Das linke Packen in AVX2 umfasst die folgenden Schritte:
Fazit
Dieser Ansatz bietet eine hocheffiziente Lösung für das Left-Packing in AVX2. Durch die Verwendung von vpermps, pext und anderen BMI2-Anweisungen ist es möglich, Daten basierend auf einer Maske mit minimalem Overhead und minimaler Latenz zu packen.
Das obige ist der detaillierte Inhalt vonWie kann AVX2 am effizientesten für das Linkspacken mit einer Maske eingesetzt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!