コードでは、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>
説明:
このアセンブリ コードは、パックされた SSE 命令を使用して関数を最適化します。
説明:
完全なループがアセンブリで最適化されるようになりました。以下を使用します。
この最適化されたバージョンにより、位置的人口数を計算するアルゴリズムのパフォーマンスが大幅に向上します。
以上がSSE 命令とアセンブリの最適化により、2 レベルのループを使用した人口カウント アルゴリズムのパフォーマンスをどのように向上させることができるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。