Rumah >pembangunan bahagian belakang >C++ >Mengapa Menggantikan Pembilang Gelung 32-bit dengan 64-bit Menyebabkan Kemerosotan Prestasi 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:
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!