> 백엔드 개발 > C++ > AVX2 및 BMI2 명령어는 마스크를 기반으로 왼쪽 패킹을 어떻게 최적화할 수 있습니까?

AVX2 및 BMI2 명령어는 마스크를 기반으로 왼쪽 패킹을 어떻게 최적화할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-30 13:45:13
원래의
447명이 탐색했습니다.

How Can AVX2 and BMI2 Instructions Optimize Left Packing Based on a Mask?

마스크 기반 효율적인 왼쪽 패킹을 위해 AVX2 및 BMI2 사용

AVX2에서는 vpermps(_mm256_permutevar8x32_ps) 명령을 활용하여 수행할 수 있습니다. 차선 교차 가변 셔플. 또한 BMI2는 pext(Parallel Bits Extract)를 제공하여 문제에 중요한 비트 단위 추출 작업을 수행할 수 있도록 해줍니다.

알고리즘:

  1. 시작 상수 보유 팩형 3비트 인덱스([7 6 5 4 3 2 1 0]).
  2. pext를 사용하여 원하는 인덱스를 연속 시퀀스로 추출합니다.
  3. 각 비트가 인덱스 바이트에 해당하는 마스크를 생성합니다(인덱스는 바이트당 하나씩 압축 해제).
  4. 마스크의 각 비트를 복제하여 해당 바이트를 채웁니다.
  5. 에서 원하는 인덱스를 추출합니다. pext를 사용하여 ID 셔플.
  6. 인덱스 바이트를 32비트 정수로 변환합니다.
  7. vpermps를 사용하여 32비트 인덱스 벡터를 기반으로 셔플을 수행합니다.

코드 구현:

#include <stdint.h>
#include <immintrin.h>

__m256 compress256(__m256 src, unsigned int mask)
{
  uint64_t expanded_mask = _pdep_u64(mask, 0x0101010101010101);
  expanded_mask *= 0xFF;
  const uint64_t identity_indices = 0x0706050403020100;
  uint64_t wanted_indices = _pext_u64(identity_indices, expanded_mask);

  __m128i bytevec = _mm_cvtsi64_si128(wanted_indices);
  __m256i shufmask = _mm256_cvtepu8_epi32(bytevec);

  return _mm256_permutevar8x32_ps(src, shufmask);
}
로그인 후 복사

장점:

  • 즉시 상수를 사용하고 메모리 로드를 방지합니다.
  • 단순성 및

단점:

  • Zen 3 이전의 AMD CPU에서는 느린 pdep/pext 성능으로 인해 속도가 느려질 수 있습니다.

위 내용은 AVX2 및 BMI2 명령어는 마스크를 기반으로 왼쪽 패킹을 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿