Memutuskan Masa Untuk Menggunakan _mm_sfence, _mm_lfence, atau _mm_mfence
Apabila menggunakan kod berbilang benang, keperluan untuk mengawal susunan memori dengan berkesan. Walaupun pemproses x86 mempunyai model ingatan yang sangat teratur, C dan C mematuhi model yang lebih santai. Ini boleh membawa kepada kekeliruan mengenai penggunaan yang sesuai bagi _mm_sfence, _mm_lfence, dan _mm_mfence intrinsik.
Memahami Susunan Memori
Untuk memperoleh/melepaskan semantik, menghalang penyusunan semula masa penyusunan sahaja sudah memadai, seperti yang diserlahkan oleh konsep penghalang-pengkompil. Ini memastikan susunan operasi yang betul dalam mesin abstrak, tanpa menghalang prestasi dengan arahan asm yang tidak perlu. Pilihan seperti GNU C/C asm("" ::: "memory") berkesan bertindak sebagai penghalang pengkompil, mencapai matlamat ini sambil meminimumkan kesan prestasi.
Sebagai alternatif, C 11 std::atomic menawarkan penyelesaian yang lancar dengan shared_var.store(tmp, std::memory_order_release), memastikan keterlihatan global perubahan. _mm_mfence memegang nilai berpotensi jika anda melaksanakan versi C11/C 11 std::atomic anda sendiri, menggunakan mfence untuk mewujudkan konsistensi berjujukan dan menghalang muatan berikutnya daripada mengambil nilai sebelum kedai sebelumnya boleh diakses secara global.
Memeriksa Peranan Setiap Intrinsik
_mm_sfence:
_mm_lfence:
_mm_mfence:
Nota Awas Berkenaan Prestasi
Adalah penting untuk mengakui bahawa pagar tidak mempercepatkan keterlihatan kedai. Mereka hanya menangguhkan operasi dalam urutan semasa sehingga operasi sebelumnya telah selesai.
Kesimpulan
Untuk kes penggunaan am, C 11 std::atomic atau C11 stdatomic menawarkan mantap dan penyelesaian mesra pengguna untuk mengawal pesanan memori. Dalam senario yang melibatkan kedai NT atau pelaksanaan tersuai std::atomic, _mm_sfence dan _mm_mfence mungkin terbukti berharga, tetapi pertimbangan yang teliti terhadap kesannya terhadap prestasi adalah penting.
Atas ialah kandungan terperinci Bilakah Anda Harus Menggunakan _mm_sfence, _mm_lfence, atau _mm_mfence?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!