Heim >Backend-Entwicklung >C++ >Wie kann AVX2 am effizientesten für das Linkspacken mit einer Maske eingesetzt werden?

Wie kann AVX2 am effizientesten für das Linkspacken mit einer Maske eingesetzt werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-22 16:39:10700Durchsuche

How Can AVX2 Be Used Most Efficiently for Left Packing with a Mask?

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:

  • Verwenden Sie vpermps für Variablen-Shuffle: _mm256_permutevar8x32_ps kann verwendet werden, um einen spurübergreifenden Variablen-Shuffle durchzuführen, sodass die Daten basierend auf der Maske gepackt werden können.
  • Masken im laufenden Betrieb generieren: BMI2 stellt die Pext-Anweisung (Parallel Bits Extract) bereit, mit der Bits aus der Eingabemaske extrahiert und generiert werden können die Shuffle-Kontrolldaten.
  • Vermeiden Sie pdep/pext auf AMD-CPUs: AMD-CPUs vor Zen 3 haben eine deutlich höhere Latenz für pdep und pext, daher können alternative Ansätze für eine optimale Leistung erforderlich sein.

Algorithmus

Der Algorithmus für Das linke Packen in AVX2 umfasst die folgenden Schritte:

  1. Indizes aus der Eingabemaske mit Pext extrahieren.
  2. Indizes entpacken, um eine Shuffle-Maske zu generieren.
  3. Verwenden Sie vpermps um die Eingabedaten entsprechend der Reihenfolge zu mischen Maske.

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!

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