Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah arahan SSE dan pengoptimuman pemasangan boleh meningkatkan prestasi algoritma kiraan populasi dengan gelung dua peringkat?

Bagaimanakah arahan SSE dan pengoptimuman pemasangan boleh meningkatkan prestasi algoritma kiraan populasi dengan gelung dua peringkat?

Linda Hamilton
Linda Hamiltonasal
2024-10-26 00:17:28967semak imbas

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

Memahami Isu

Dalam kod anda, anda mengendalikan kiraan populasi dalam gelung dua peringkat dan cuba mengoptimumkan gelung dalam dengan pemasangan. Gelung berulang melalui kepingan bait dan menggunakan fungsi __mm_add_epi32_inplace_purego untuk menambah kiraan pop kedudukan pada tatasusunan.

Pengoptimuman melalui Perhimpunan

Untuk mengoptimumkan gelung dalam, anda boleh melaksanakan __mm_add_epi32_inplace_purego dalam assembly.purego Di bawah ialah versi optimum fungsi yang dicadangkan:

<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

Penjelasan:

Kod pemasangan ini mengoptimumkan fungsi menggunakan arahan SSE yang dibungkus. Ia:

  • Mengira popcount dalam blok 16-bit menggunakan paddusbd.
  • Mengekstrak bahagian 128-bit rendah menggunakan vextracti128.
  • Menambahkan hasil pada [8 ]int32 tatasusunan pada alamat yang diberikan oleh %rdi.

Gelung Keseluruhan Dipertingkatkan dengan Pemasangan

Penjelasan:

Yang lengkap gelung kini dioptimumkan dalam pemasangan. Ia menggunakan:

  • Gelung untuk memproses ketulan 2-bait.
  • Menyalurkan beban melalui addq berturut-turut $32, rsi untuk mengelakkan kesilapan cache.
  • Pantas dan padat cara untuk menyimpan hasil menggunakan movw.

Kesimpulan

Versi yang dioptimumkan ini seharusnya meningkatkan prestasi algoritma anda dengan ketara untuk mengira kiraan populasi kedudukan.

Atas ialah kandungan terperinci Bagaimanakah arahan SSE dan pengoptimuman pemasangan boleh meningkatkan prestasi algoritma kiraan populasi dengan gelung dua peringkat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn