"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > __m256 변수에 8개의 문자를 압축된 단일 정밀도 부동 소수점으로 로드하는 방법은 무엇입니까?

__m256 변수에 8개의 문자를 압축된 단일 정밀도 부동 소수점으로 로드하는 방법은 무엇입니까?

2024-11-06에 게시됨
검색:823

How to Load 8 Chars into an __m256 Variable as Packed Single Precision Floats?

메모리에서 8개의 문자를 압축된 단일 정밀도 부동 소수점으로 __m256 변수에 로드

가우시안 블러에 대한 알고리즘을 최적화하려는 노력의 일환으로 부동 버퍼의 사용을 __m256 내장 변수로 대체하려고 합니다. 이 질문은 이 작업에 대한 최적의 지침을 결정하는 것을 목표로 합니다.

AVX2 아키텍처에 대한 지침:

  • PMOVZX를 활용하여 문자를 32비트로 0 확장 256b 레지스터의 정수.
  • 다음을 사용하여 부동 소수점으로 변환합니다. VCVTDQ2PS.
; rsi = new_image
VPMOVZXBD   ymm0,  [rsi]   ; or SX to sign-extend  (Byte to DWord)
VCVTDQ2PS   ymm0, ymm0     ; convert to packed foat

추가 전략:

  • 128비트 브로드캐스트 로드를 사용하여 vpmovzxbd ymm,xmm 및 vpshufb ymm(_mm256_shuffle_epi8)을 피드하는 것을 고려하십시오. 높은 64비트. 이 접근 방식은 uop 수를 줄이고 Ryzen CPU에 도움이 될 수 있습니다.
  • 셔플링이 이미 제한 사항일 때 병목 현상이 발생할 수 있으므로 추가 셔플 명령을 사용하지 마십시오.

AVX1 아키텍처에 대한 지침:

  • 다음을 수행합니다. 단계:

    VPMOVZXBD   xmm0,  [rsi]
    VPMOVZXBD   xmm1,  [rsi 4]
    VINSERTF128 ymm0, ymm0, xmm1, 1   ; put the 2nd load of data into the high128 of ymm0
    VCVTDQ2PS   ymm0, ymm0     ; convert to packed float

내장 고려 사항:

  • GCC 및 MSVC에서는 내장 함수를 사용할 때 최적의 코드 생성을 보장하기 위해 특별한 처리가 필요할 수 있습니다. VPMOVZXBD ymm,[mem].
  • _mm_loadl_epi64 내장 함수 사용을 고려하세요. 대신 GCC 버전 9 이상에서 GCC를 사용하여 -O3에서 최적의 asm을 위해 메모리 피연산자로 접을 수 있습니다.
  • AVX1 전용 최적화의 경우 내장 버전을 작성하는 것은 재미없는 연습입니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3