>백엔드 개발 >Golang >어셈블리 최적화는 어떻게 바이트에 대한 위치 팝카운트 알고리즘의 성능을 향상시킬 수 있습니까?

어셈블리 최적화는 어떻게 바이트에 대한 위치 팝카운트 알고리즘의 성능을 향상시킬 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-26 03:58:27495검색

How can Assembly Optimization Boost the Performance of a Positional Popcount Algorithm on Bytes?

어셈블리를 사용하여 이 8비트 위치 Popcount를 최적화하는 방법은 무엇입니까?

Go에서 제공된 __mm_add_epi32_inplace_purego 구현은 값비싼 전달로 인해 차선책입니다. [8]int32 배열. 성능을 향상하려면 대신 배열에 포인터를 전달하는 것이 좋습니다.

그러나 문제는 이 특정 함수를 최적화하는 것 이상으로 바이트에 대한 위치 인구 수 알고리즘에 대한 어셈블리를 사용하여 내부 루프의 최적화를 탐구합니다. .

어셈블리 최적화

제공된 어셈블리 코드는 위치 인구 수 계산 알고리즘의 두 가지 варианты를 제공합니다.

  • 한 번에 32바이트 없이 CSA(Constant Sum Adder)
  • CSA를 사용하여 한 번에 96바이트

개선 사항 도입

어셈블리 코드는 다양한 기법을 활용하여 개선합니다. 성능:

  • 프리페치: 캐시 누락을 줄이기 위해 데이터를 미리 프리페치합니다.
  • 벡터화: SIMD(Single Instruction Multiple Data) 명령어를 사용합니다. 여러 바이트를 동시에 처리합니다.
  • 팝 카운트 내장: 내장 함수를 사용하여 비트 모집단을 효율적으로 계산합니다.
  • 캐리아웃 최적화: 이동된 값의 수행을 활용하여 효율적인 인구 계산을 수행합니다.
  • CSA를 사용한 96바이트 변형: 상수 합계 추가라는 기술을 구현하여 연산 수를 줄이고 성능을 향상합니다. 최대 30%까지 성능이 향상됩니다.

성능 벤치마크

벤치마크에 따르면 어셈블리 최적화는 순수 Go의 순진한 참조 구현에 비해 상당한 성능 향상을 가져오는 것으로 나타났습니다. :

  • Reg(32바이트 변형): 최대 4998.53MB/s
  • RegCSA(CSA가 있는 96바이트 변형): 최대 16053.40MB/s

전체 소스 코드

두 어셈블리 변형의 전체 소스 코드는 GitHub에서 찾을 수 있습니다. 코드에는 모든 Go 프로그램의 두 변형 모두에 사용할 수 있는 이식 가능한 라이브러리도 포함되어 있습니다.

결론

어셈블리에서 위치 인구 수 알고리즘을 구현함으로써 상당한 성능을 발휘합니다. 이득을 얻을 수 있습니다. 제공된 어셈블리 코드는 처리량을 최대화하기 위해 다양한 최적화를 활용합니다. 자세한 내용과 예시는 GitHub 저장소를 참고해주세요.

위 내용은 어셈블리 최적화는 어떻게 바이트에 대한 위치 팝카운트 알고리즘의 성능을 향상시킬 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.