在您的代码中,您在两级循环中处理人口计数,并尝试使用汇编来优化内部循环。该循环迭代字节切片,并使用 __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>
说明:
此汇编代码使用打包的 SSE 指令优化该函数。它:
解释:
完整的循环现在在汇编中进行了优化。它使用:
这个优化版本应该会显着提高计算位置人口计数算法的性能。
以上是SSE 指令和汇编优化如何提高具有两级循环的总体计数算法的性能?的详细内容。更多信息请关注PHP中文网其他相关文章!