Apa itu pagar memori?

121

Apa yang dimaksud dengan menggunakan pagar memori eksplisit?

yesraaj
sumber

Jawaban:

115

Untuk peningkatan kinerja, CPU modern sering mengeksekusi instruksi agar dapat menggunakan silikon yang tersedia secara maksimal (termasuk membaca / menulis memori). Karena perangkat keras memberlakukan integritas instruksi, Anda tidak pernah memperhatikan ini dalam satu rangkaian eksekusi. Namun untuk beberapa utas atau lingkungan dengan memori volatil (memori yang dipetakan I / O misalnya) ini dapat menyebabkan perilaku yang tidak dapat diprediksi.

Pagar / penghalang memori adalah kelas instruksi yang berarti pembacaan / penulisan memori terjadi dalam urutan yang Anda harapkan. Misalnya 'pagar penuh' berarti semua baca / tulis sebelum pagar dipasang sebelum pagar setelahnya.

Perhatikan pagar memori adalah konsep perangkat keras. Dalam bahasa tingkat yang lebih tinggi kita terbiasa berurusan dengan mutex dan semaphore - ini mungkin diterapkan dengan menggunakan pagar memori pada tingkat rendah dan penggunaan batasan memori secara eksplisit tidak diperlukan. Penggunaan hambatan memori memerlukan studi yang cermat tentang arsitektur perangkat keras dan lebih sering ditemukan di driver perangkat daripada kode aplikasi.

Pengurutan ulang CPU berbeda dengan pengoptimalan kompiler - meskipun artefaknya bisa serupa. Anda perlu mengambil tindakan terpisah untuk menghentikan compiler menyusun ulang instruksi Anda jika hal itu dapat menyebabkan perilaku yang tidak diinginkan (misalnya penggunaan kata kunci volatile di C).

Gwaredd
sumber
26
Saya rasa volatile tidak cukup untuk menghentikan penyusunan ulang compiler; AFAIK hanya memastikan bahwa kompilator tidak dapat menyimpan nilai variabel ke dalam cache. Kernel Linux menggunakan ekstensi gcc ( asm __volatile __ (""::: "memory")) untuk membuat penghalang pengoptimalan compiler penuh.
CesarB
5
true, volatile bukanlah thread aware tetapi Anda dapat menggunakannya untuk menghentikan compiler yang menerapkan pengoptimalan tertentu - ini tidak terkait dengan fences;)
Gwaredd
3
(.NET CLR) pembacaan volatil adalah pagar akuisisi, penulisan adalah pagar pelepasan. Operasi yang saling bertautan sudah penuh seperti metode MemoryBarrier.
Luke Puplett
3
Bacaan menarik tentang kata kunci volatile di .net dapat ditemukan di sini albahari.com/threading/part4.aspx#_NonBlockingSynch Situs ini berisi banyak informasi berguna tentang threading di c #
Bas Smit
developerWorks memiliki [artikel] [1] yang bagus tentang model penyimpanan memori PowerPC. [1]: ibm.com/developerworks/systems/articles/powerpc.html
Iouri Goussev
17

Menyalin jawaban saya ke pertanyaan lain, Apa saja trik yang dilakukan prosesor untuk mengoptimalkan kode? :

Yang paling penting adalah penyusunan ulang akses memori.

Tidak ada pagar memori atau instruksi pembuatan serial, prosesor bebas untuk menyusun ulang akses memori. Beberapa arsitektur prosesor memiliki batasan tentang seberapa banyak mereka dapat menyusun ulang; Alfa dikenal sebagai yang paling lemah (yaitu, yang paling dapat menyusun ulang).

Perawatan yang sangat baik untuk subjek ini dapat ditemukan di dokumentasi sumber kernel Linux, di Documentation / memory-barriers.txt .

Seringkali, yang terbaik adalah menggunakan primitif penguncian dari kompilator atau pustaka standar Anda; ini telah diuji dengan baik, harus memiliki semua hambatan memori yang diperlukan, dan mungkin cukup dioptimalkan (mengoptimalkan penguncian primitif itu rumit; bahkan para ahli terkadang bisa salah).

CesarB
sumber
Bagaimana hal itu mempengaruhi aliran penataan ulang? Saat Anda berkata Alpha is known for being the weakest, mengapa weakest? Bukankah lebih baik, lebih dipesan ulang, sehingga eksekusi akan jauh lebih cepat? (Saya bukan pengguna alfa, tetapi menanyakan tentang efek very reorderingvs restricted reordering). Jadi apa kerugian dari penataan ulang lot (kecuali risiko perilaku yang tidak ditentukan, tetapi saya kira, sebagian besar CPU modern seharusnya menyelesaikan pengubahan urutan yang baik dan hanya menerapkan penataan ulang yang ditentukan, jika tidak, itu tidak akan masuk akal dalam keputusan yang mereka buat).
Penggembala
8

Dalam pengalaman saya, ini mengacu pada penghalang memori , yang merupakan instruksi (eksplisit atau implisit) untuk menyinkronkan akses memori antara beberapa utas.

Masalahnya terjadi pada kombinasi kompiler agresif modern (mereka memiliki kebebasan luar biasa untuk menyusun ulang instruksi, tetapi biasanya tidak tahu apa-apa tentang utas Anda) dan CPU multicore modern.

Pengenalan yang baik untuk masalah ini adalah "Deklarasi 'Penguncian dengan Cek Ganda Rusak' ". Bagi banyak orang, itu adalah peringatan bahwa ada naga.

Hambatan memori penuh implisit biasanya disertakan dalam rutinitas sinkronisasi utas platform, yang menutupi intinya. Namun, untuk pemrograman bebas-kunci dan menerapkan pola sinkronisasi ringan dan kustom, Anda seringkali hanya membutuhkan penghalang, atau bahkan penghalang satu arah saja.

peterchen
sumber
2

Wikipedia tahu semua ...

Penghalang memori, juga dikenal sebagai membar atau pagar memori, adalah kelas instruksi yang menyebabkan central processing unit (CPU) memberlakukan batasan pemesanan pada operasi memori yang dikeluarkan sebelum dan sesudah instruksi penghalang.

CPU menggunakan pengoptimalan kinerja yang dapat mengakibatkan eksekusi tidak teratur, termasuk pemuatan memori dan operasi penyimpanan. Pengubahan urutan operasi memori biasanya tidak terlihat dalam satu rangkaian eksekusi, tetapi menyebabkan perilaku yang tidak dapat diprediksi dalam program dan driver perangkat bersamaan kecuali dikontrol dengan cermat. Sifat sebenarnya dari batasan pemesanan bergantung pada perangkat keras, dan ditentukan oleh model memori arsitektur. Beberapa arsitektur menyediakan banyak penghalang untuk menerapkan batasan pemesanan yang berbeda.

Hambatan memori biasanya digunakan saat mengimplementasikan kode mesin tingkat rendah yang beroperasi pada memori yang digunakan bersama oleh beberapa perangkat. Kode tersebut mencakup primitif sinkronisasi dan struktur data bebas kunci pada sistem multiprosesor, dan driver perangkat yang berkomunikasi dengan perangkat keras komputer.

Omar Kooheji
sumber