코드에서는 2단계 루프 내에서 모집단 수를 처리하고 어셈블리를 사용하여 내부 루프를 최적화하려고 합니다. 루프는 바이트 슬라이스를 반복하고 __mm_add_epi32_inplace_purego 함수를 사용하여 위치 팝카운트를 배열에 추가합니다.
내부 루프를 최적화하려면 어셈블리에서 __mm_add_epi32_inplace_purego를 구현할 수 있습니다. 다음은 제안된 최적화된 함수 버전입니다.
<code class="assembly">.text .globl __mm_add_epi32_inplace_purego __mm_add_epi32_inplace_purego: movq rdi, [rsi] movq rsi, [rdi+8] addq rsi, rdi movups (%rsi, %rax, 8), %xmm0 addq , %rsi movups (%rsi, %rax, 8), %xmm1 paddusbd %xmm0, %xmm0 paddusbd %xmm1, %xmm1 vextracti128 <pre class="brush:php;toolbar:false"><code class="assembly">.text .globl __optimized_population_count_loop __optimized_population_count_loop: movq rdi, [rsi] leaq (0, %rdi, 4), %rdx # multiple rdi by 4, rdx = counts movq rsp, r11 and rsp, -16 subq r15, r11 movq r15, r9 mov rdi, (%rsi) movq r15, rsi mov %rsi, rsi pxor %eax, %eax dec %rsi .loop: inc %rsi addq , rsi cmp rsi, rdi cmovge %rsi, rsi movsw (%rdi, %rax, 2), %ax movsw (%rsi, %rax, 2), %dx movw %ax, (%rdx) movw %dx, 2(%rdx) .end_loop:</code>, %xmm0, %eax vextracti128 , %xmm1, %edx addl %eax, (%rdi) addl %edx, 4(%rdi) addl %r8d, (%rdi) ret
설명:
이 어셈블리 코드는 압축된 SSE 명령어를 사용하여 함수를 최적화합니다. It:
설명:
완전한 루프 루프는 이제 어셈블리에서 최적화됩니다. 다음을 사용합니다:
이 최적화된 버전은 위치 인구 수를 계산하는 알고리즘의 성능을 크게 향상시킵니다.
위 내용은 SSE 명령어와 어셈블리 최적화가 2레벨 루프가 있는 모집단 계산 알고리즘의 성능을 어떻게 향상시킬 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!