SSE/AVX를 사용한 효율적인 Double/int64 변환
SSE2는 단정밀도 부동 소수점과 32비트 정수 간의 벡터 변환에 대한 지침을 제공합니다. , 배정밀도 및 64비트 정수에 해당하는 내장 함수가 누락되었습니다. AVX도 이러한 변환을 제공하지 않습니다.
폴백 기술
전용 지침이 없는 경우 이러한 변환을 시뮬레이션하는 몇 가지 접근 방식이 있습니다.
- For values in specific ranges, using a shifted add and a bitwise XOR can convert double to uint64_t or int64_t in just two instructions. - Reversing these steps can perform the inverse conversions.
전체 범위 변환:
구현 세부정보
잘린 변환의 요령은 [2^52, 2^53)의 가장 낮은 가수 비트는 최하위 비트와 정렬됩니다. 특정 마스크 값을 추가하고 비트 단위 연산을 수행하면 정수 표현을 얻을 수 있습니다.
전체 범위 변환은 부호 확장 문제를 해결하고 x86의 부동 소수점 추가가 취소될 수 있다는 사실을 활용합니다. 소수 비트를 사용하여 배정밀도 결과를 정확하게 재구성할 수 있습니다.
반올림 동작
잘린 변환 방법은 현재 반올림 모드를 따릅니다. 단, 0으로 반올림하면 음의 무한대로 반올림될 수 있습니다. 전체 범위 변환은 모든 모드에 대해 올바른 반올림을 보장합니다.
가용성
제시된 기술은 SSE/AVX에서 직접 int64_t 및 이중 변환이 부족한 문제에 대한 해결 방법을 제공합니다. 이러한 방법은 효율성과 정확성 사이의 균형을 유지하면서 변환이 필요한 코드를 최적화하는 데 특히 유용할 수 있습니다.
위 내용은 SSE/AVX를 사용하여 Double과 int64 간에 효율적으로 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!