在您的程式碼中,您在兩級循環中處理人口計數,並嘗試使用彙編來優化內部循環。此循環迭代位元組切片,並使用 __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 指令最佳化此函數。它:
解釋:
完整的循環現在在彙編中進行了優化。它使用:
這個最佳化版本應該會顯著提高計算位置人口計數演算法的效能。
以上是SSE 指令和彙編優化如何提高具有兩級循環的總體計數演算法的效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!