ホームページ > バックエンド開発 > Golang > SSE 命令とアセンブリの最適化により、2 レベルのループを使用した人口カウント アルゴリズムのパフォーマンスをどのように向上させることができるでしょうか?

SSE 命令とアセンブリの最適化により、2 レベルのループを使用した人口カウント アルゴリズムのパフォーマンスをどのように向上させることができるでしょうか?

Linda Hamilton
リリース: 2024-10-26 00:17:28
オリジナル
1052 人が閲覧しました

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

問題の理解

コードでは、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>
ログイン後にコピー
, %xmm0, %eax vextracti128 , %xmm1, %edx addl %eax, (%rdi) addl %edx, 4(%rdi) addl %r8d, (%rdi) ret

説明:

このアセンブリ コードは、パックされた SSE 命令を使用して関数を最適化します。

  • padusbd を使用して 16 ビット ブロックのポップカウントを計算します。
  • vextracti128 を使用して下位 128 ビット部分を抽出します。
  • 結果を [8] に追加します。 ]int32 配列 (%rdi で指定されたアドレスにあります)。

アセンブリによるループ全体の拡張

説明:

完全なループがアセンブリで最適化されるようになりました。以下を使用します。

  • 2 バイトのチャンクを処理するループ。
  • キャッシュ ミスを避けるため、連続した addq $32、rsi を介したストリーミング ロード。
  • 高速かつコンパクトmovw を使用して結果を保存する方法。

結論

この最適化されたバージョンにより、位置的人口数を計算するアルゴリズムのパフォーマンスが大幅に向上します。

以上がSSE 命令とアセンブリの最適化により、2 レベルのループを使用した人口カウント アルゴリズムのパフォーマンスをどのように向上させることができるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート