Heim >Backend-Entwicklung >Golang >Wie können SSE-Anweisungen und Assembly-Optimierung die Leistung eines Populationszählalgorithmus mit einer zweistufigen Schleife verbessern?
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.
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:
Erklärung:
Die vollständige Die Schleife ist jetzt in der Montage optimiert. Es verwendet:
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!