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

Linda Hamilton
Freigeben: 2024-10-26 00:17:28
Original
979 Leute haben es durchsucht

 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>
Nach dem Login kopieren
, %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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!