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

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

Patricia Arquette
풀어 주다: 2024-11-03 13:21:30
원래의
610명이 탐색했습니다.

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비트 브로드캐스트 로드를 사용하여 상위 64비트에 대해 vpmovzxbd ymm,xmm 및 vpshufb ymm(_mm256_shuffle_epi8)을 공급하는 것을 고려하십시오. 이 접근 방식은 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 전용 최적화의 경우 내장 버전을 작성하는 것은 재미없는 연습입니다.

위 내용은 __m256 변수에 8개의 문자를 압축된 단일 정밀도 부동 소수점으로 로드하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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