Home  >  Article  >  Backend Development  >  How can SSE instructions and assembly optimization improve the performance of a population count algorithm with a two-level loop?

How can SSE instructions and assembly optimization improve the performance of a population count algorithm with a two-level loop?

Linda Hamilton
Linda HamiltonOriginal
2024-10-26 00:17:28967browse

 How can SSE instructions and assembly optimization improve the performance of a population count algorithm with a two-level loop?

Understanding the Issue

In your code, you handle population counts within a two-level loop and try to optimize the inner loop with assembly. The loop iterates through a byte slice and uses the __mm_add_epi32_inplace_purego function to add positional popcounts to an array.

Optimization via Assembly

To optimize the inner loop, you can implement __mm_add_epi32_inplace_purego in assembly. Below is the suggested optimized version of the function:

<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

Explanation:

This assembly code optimizes the function using packed SSE instructions. It:

  • Computes popcounts in 16-bit blocks using paddusbd.
  • Extracts the low 128-bit portion using vextracti128.
  • Adds the results to the [8]int32 array at the address given by %rdi.

Enhanced Whole Loop with Assembly

Explanation:

The complete loop is now optimized in assembly. It uses:

  • A loop to process 2-byte chunks.
  • Streaming loads via consecutive addq $32, rsi to avoid cache misses.
  • A fast and compact way to save the results using movw.

Conclusion

This optimized version should significantly improve the performance of your algorithm for computing positional population counts.

The above is the detailed content of How can SSE instructions and assembly optimization improve the performance of a population count algorithm with a two-level loop?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn