Heim >Backend-Entwicklung >Golang >Wie können SSE-Anweisungen und Assembly-Optimierung die Leistung eines Populationszählalgorithmus mit einer zweistufigen Schleife verbessern?

Wie können SSE-Anweisungen und Assembly-Optimierung die Leistung eines Populationszählalgorithmus mit einer zweistufigen Schleife verbessern?

Linda Hamilton
Linda HamiltonOriginal
2024-10-26 00:17:281050Durchsuche

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

Verstehen des Problems

In Ihrem Code verarbeiten Sie Bevölkerungszahlen innerhalb einer zweistufigen Schleife und versuchen, die innere Schleife durch Assemblierung zu optimieren. Die Schleife durchläuft ein Byte-Slice und verwendet die Funktion __mm_add_epi32_inplace_purego, um Positions-Popcounts zu einem Array hinzuzufügen.

Optimierung über Assembly

Um die innere Schleife zu optimieren, können Sie __mm_add_epi32_inplace_purego in Assembly implementieren. Unten ist die vorgeschlagene optimierte Version der Funktion:

<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

Erklärung:

Dieser Assemblercode optimiert die Funktion mithilfe gepackter SSE-Anweisungen. Es:

  • Berechnet Popcounts in 16-Bit-Blöcken mit paddusbd.
  • Extrahiert den niedrigen 128-Bit-Teil mit vextracti128.
  • Fügt die Ergebnisse zu [8 ]int32-Array an der von %rdi angegebenen Adresse.

Erweiterte Gesamtschleife mit Assembly

Erklärung:

Die vollständige Die Schleife ist jetzt in der Montage optimiert. Es verwendet:

  • Eine Schleife zum Verarbeiten von 2-Byte-Blöcken.
  • Streaming-Ladungen über aufeinanderfolgende addq $32, rsi, um Cache-Fehler zu vermeiden.
  • Ein schneller und kompakter Möglichkeit, die Ergebnisse mit movw zu speichern.

Fazit

Diese optimierte Version sollte die Leistung Ihres Algorithmus zur Berechnung von Positionspopulationszahlen erheblich verbessern.

Das obige ist der detaillierte Inhalt vonWie können SSE-Anweisungen und Assembly-Optimierung die Leistung eines Populationszählalgorithmus mit einer zweistufigen Schleife verbessern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn