首页  >  文章  >  后端开发  >  SSE 指令和汇编优化如何提高具有两级循环的总体计数算法的性能?

SSE 指令和汇编优化如何提高具有两级循环的总体计数算法的性能?

Linda Hamilton
Linda Hamilton原创
2024-10-26 00:17:28967浏览

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

理解问题

在您的代码中,您在两级循环中处理人口计数,并尝试使用汇编来优化内部循环。该循环迭代字节切片,并使用 __mm_add_epi32_inplace_purego 函数将位置 popcount 添加到数组中。

通过汇编进行优化

要优化内部循环,您可以在汇编中实现 __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 指令优化该函数。它:

  • 使用 paddusbd 计算 16 位块中的 popcount。
  • 使用 vextracti128 提取低 128 位部分。
  • 将结果添加到 [8 ]int32 数组位于 %rdi 给出的地址处。

使用汇编增强整个循环

解释:

完整的循环现在在汇编中进行了优化。它使用:

  • 处理 2 字节块的循环。
  • 通过连续的 addq $32、rsi 进行流式加载,以避免缓存未命中。
  • 快速而紧凑的使用 movw 保存结果的方法。

结论

这个优化版本应该会显着提高计算位置人口计数算法的性能。

以上是SSE 指令和汇编优化如何提高具有两级循环的总体计数算法的性能?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn