SIMD를 사용하여 atoi를 구현하는 방법은 무엇입니까?
문제:
atoi를 작성해 보고 싶습니다. RapidJSON에 포함될 SIMD 명령어를 사용한 구현입니다. 내가 생각해낸 알고리즘은 다음과 같습니다.
제 알고리즘이 맞나요? 더 좋은 방법이 있나요? SIMD 명령어 세트를 사용하는 atoi에 대한 참조 구현이 있습니까?
답변:
알고리즘이 정확하고 완전합니다. MIN_INT=-2147483648에서 MAX_INT=2147483647까지, MIN_UINT=0에서 MAX_UINT=4294967295까지 int 및 uint에서 작동합니다.
인텔 구문을 사용하여 GNU Assembler로 작성된 참조 구현이 제공됩니다.
이 코드의 속성은 다음과 같습니다. 다음:
알고리즘의 접근 방식은 다음과 같습니다. 다음:
마지막 단계는 이 네 개의 DWORD를 22로 에뮬레이션된 PHADDD(PSHUFD PADDD)
결과 Haswell 32비트에 대한 Intel-IACA 처리량 분석:
블록 처리량: 16.10 사이클 처리량 병목 현상: InterIteration
N - 포트 번호 또는 사이클 수 리소스 충돌로 인해 지연이 발생함, DV - 분배기 파이프(포트 0)
D - 데이터 가져오기 파이프(포트 2 및 3), CP - a 임계 경로
F - 이전 명령과의 매크로 융합 발생
지시 micro-ops가 포트에 바인딩되지 않음
^ - Micro Fusion 발생
@ - SSE 명령이 AVX256 명령을 따랐으며 수십 사이클 페널티가 발생했습니다. 예상됩니다
! - 지원되지 않는 명령, 분석에서 고려되지 않음
| 수 | 주기적인 포트 압력 | |
| 0* | | | | | | | | | | xor eax, eax
| 0* | | | | | | | | | | xor ecx, ecx
| 0* | | | | | | | | | | xor edx, edx
| 1 | | 0.1 | | | | | 0.9 |
위 내용은 SIMD 명령어를 사용하여 atoi를 효율적으로 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!