>백엔드 개발 >C++ >마스크를 사용한 왼쪽 패킹에 AVX2를 어떻게 가장 효율적으로 사용할 수 있습니까?

마스크를 사용한 왼쪽 패킹에 AVX2를 어떻게 가장 효율적으로 사용할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-22 16:39:10656검색

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

왼쪽 패킹 문제

입력 배열과 출력 배열이 있지만 조건을 만족하는 특정 요소만 필요한 시나리오를 생각해 보세요. 출력 배열에 기록됩니다. AVX2를 사용하여 이를 달성하는 가장 효율적인 접근 방식은 무엇입니까?

SSE 접근 방식

SSE 접근 방식에는 _mm_movemask_ps를 사용하여 입력 마스크에서 4비트 마스크를 추출하는 작업이 포함됩니다. 그런 다음 이 마스크를 사용하여 _mm_load_si128로 셔플 제어 데이터를 생성합니다. 마지막으로 _mm_shuffle_epi8을 사용하여 SIMD 레지스터 앞의 유효한 요소를 정렬하기 위해 값을 순열합니다. 이 접근 방식은 16개 항목 LUT(룩업 테이블)가 있는 4와이드 SSE 벡터에 적합합니다.

AVX 제한 사항

그러나 8와이드 AVX의 경우 벡터의 경우 LUT에는 각 항목이 32바이트인 상당히 많은 수의 항목(256개)이 필요하므로 메모리 사용량은 8k가 됩니다. AVX에서는 포장을 한 마스크 매장 등 이 과정을 단순화하는 지침을 제공하지 않는다는 점이 놀랍습니다.

AVX2 솔루션

전담 지침이 없음에도 불구하고 , 다음의 조합을 사용하여 AVX2에서 효율적인 왼쪽 패킹을 달성하는 것이 가능합니다. 기술:

  • 가변 셔플에 vpermps 사용: _mm256_permutevar8x32_ps를 사용하면 차선 교차 가변 셔플을 수행하여 마스크를 기반으로 데이터를 압축할 수 있습니다.
  • 즉시 마스크 생성: BMI2는 입력 마스크에서 비트를 추출하고 셔플 제어 데이터를 생성하는 데 사용할 수 있는 pext(병렬 비트 추출) 명령을 제공합니다.
  • AMD CPU에서는 pdep/pext를 피하세요. AMD Zen 3 이전의 CPU는 pdep 및 pext에 대한 대기 시간이 상당히 높으므로 최적의 환경을 위해서는 대체 접근 방식이 필요할 수 있습니다.

알고리즘

AVX2의 왼쪽 패킹 알고리즘은 다음 단계로 구성됩니다.

  1. 입력에서 인덱스 추출 pext를 사용하여 마스크.
  2. 인덱스 압축을 풀어 셔플을 생성합니다. 마스크.
  3. vpermps를 사용하여 셔플 마스크에 따라 입력 데이터를 셔플합니다.

결론

이 접근 방식은 매우 효율적인 솔루션을 제공합니다. AVX2의 왼쪽 패킹용입니다. vpermps, pext 및 기타 BMI2 명령어를 활용하면 오버헤드와 대기 시간을 최소화하면서 마스크 기반으로 데이터를 패킹할 수 있습니다.

위 내용은 마스크를 사용한 왼쪽 패킹에 AVX2를 어떻게 가장 효율적으로 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.