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>
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!