Rumah >pembangunan bahagian belakang >C++ >Mengapa Menggantikan Pembilang Gelung 32-bit dengan 64-bit Menyebabkan Kemerosotan Prestasi dengan `_mm_popcnt_u64` pada CPU Intel?

Mengapa Menggantikan Pembilang Gelung 32-bit dengan 64-bit Menyebabkan Kemerosotan Prestasi dengan `_mm_popcnt_u64` pada CPU Intel?

Patricia Arquette
Patricia Arquetteasal
2024-12-03 15:04:10731semak imbas

Why Does Replacing a 32-bit Loop Counter with 64-bit Cause Performance Degradation with `_mm_popcnt_u64` on Intel CPUs?

Menggantikan pembilang gelung 32-bit dengan 64-bit memperkenalkan penyelewengan prestasi gila dengan mm_popcnt_u64 pada CPU Intel

Ringkasan

Artikel menyiasat penyelewengan prestasi yang dihadapi semasa menggantikan 32-bit pembilang gelung dengan pembilang 64-bit dalam gelung kritikal prestasi menggunakan intrinsik _mm_popcnt_u64. Isu ini menyebabkan penurunan ketara dalam prestasi pada CPU Intel, yang membawa kepada kelajuan pelaksanaan yang berbeza. Pengarang meneroka sebab di sebalik tingkah laku ini dan menawarkan penyelesaian yang berpotensi.

Butiran

Kod yang dimaksudkan melibatkan gelung yang berulang pada tatasusunan data dan melakukan kiraan pop operasi menggunakan arahan intrinsik x86. Pembolehubah pembilang gelung pada mulanya ialah integer tidak ditandatangani, tetapi menggantikannya dengan integer tidak ditandatangani 64-bit (uint64_t) mengakibatkan penurunan prestasi sekitar 50%.

Untuk menyiasat punca, pengarang menyusun kod dengan pelbagai bendera pengoptimuman dan menganalisis kod pemasangan yang terhasil. Mereka memerhatikan pemasangan berbeza telah dijana untuk versi 32-bit dan 64-bit, menyebabkan mereka mengesyaki pepijat pengkompil.

Walau bagaimanapun, selepas menguji kod dengan penyusun yang berbeza, penulis membuat kesimpulan bahawa masalahnya bukan disebabkan oleh pepijat pengkompil tetapi oleh pergantungan data palsu dalam perkakasan. Arahan _mm_popcnt_u64, apabila digunakan pada pemproses Intel Sandy/Ivy Bridge dan Haswell, mempamerkan kebergantungan palsu pada daftar destinasi, di mana arahan menunggu sehingga destinasi sedia sebelum dilaksanakan. Kebergantungan palsu ini boleh membawa merentas lelaran gelung, menghalang pemproses daripada menyelaraskan lelaran yang berbeza dan membawa kepada kehilangan prestasi.

Pengarang membentangkan ujian pemasangan sebaris yang menunjukkan perbezaan prestasi dengan mengasingkan operasi kira pop dan memecahkan kebergantungan palsu rantai. Ujian ini menunjukkan bahawa pergantungan palsu mempunyai kesan yang ketara pada prestasi, mengakibatkan pengurangan kelajuan daripada 18.6195 GB/s kepada 8.49272 GB/s.

Artikel itu juga menyerlahkan bahawa isu itu mempengaruhi CPU Intel, manakala pemproses AMD nampaknya tidak palsu ini kebergantungan.

Penyelesaian

Untuk mengurangkan isu prestasi ini, penulis mencadangkan beberapa penyelesaian:

  • Sebaliknya, gunakan pembilang gelung 32-bit pembilang 64-bit untuk gelung khusus ini.
  • Jika perlu menggunakan pembilang gelung 64-bit, putuskan rantaian kebergantungan palsu dengan mensifarkan daftar destinasi secara eksplisit sebelum menggunakannya dalam operasi kiraan pop.
  • Gunakan pengkompil yang mengetahui kebergantungan palsu ini dan menjana kod untuk mengimbanginya.

Atas ialah kandungan terperinci Mengapa Menggantikan Pembilang Gelung 32-bit dengan 64-bit Menyebabkan Kemerosotan Prestasi dengan `_mm_popcnt_u64` pada CPU Intel?. 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