어셈블리를 사용하여 이 8비트 위치 Popcount를 최적화하는 방법은 무엇입니까?
Go에서 제공된 __mm_add_epi32_inplace_purego 구현은 값비싼 전달로 인해 차선책입니다. [8]int32 배열. 성능을 향상하려면 대신 배열에 포인터를 전달하는 것이 좋습니다.
그러나 문제는 이 특정 함수를 최적화하는 것 이상으로 바이트에 대한 위치 인구 수 알고리즘에 대한 어셈블리를 사용하여 내부 루프의 최적화를 탐구합니다. .
어셈블리 최적화
제공된 어셈블리 코드는 위치 인구 수 계산 알고리즘의 두 가지 варианты를 제공합니다.
개선 사항 도입
어셈블리 코드는 다양한 기법을 활용하여 개선합니다. 성능:
성능 벤치마크
벤치마크에 따르면 어셈블리 최적화는 순수 Go의 순진한 참조 구현에 비해 상당한 성능 향상을 가져오는 것으로 나타났습니다. :
전체 소스 코드
두 어셈블리 변형의 전체 소스 코드는 GitHub에서 찾을 수 있습니다. 코드에는 모든 Go 프로그램의 두 변형 모두에 사용할 수 있는 이식 가능한 라이브러리도 포함되어 있습니다.
결론
어셈블리에서 위치 인구 수 알고리즘을 구현함으로써 상당한 성능을 발휘합니다. 이득을 얻을 수 있습니다. 제공된 어셈블리 코드는 처리량을 최대화하기 위해 다양한 최적화를 활용합니다. 자세한 내용과 예시는 GitHub 저장소를 참고해주세요.
위 내용은 어셈블리 최적화는 어떻게 바이트에 대한 위치 팝카운트 알고리즘의 성능을 향상시킬 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!