Hafıza çiti nedir?


Yanıtlar:


115

Performans kazanımları için modern CPU'lar, mevcut silikondan maksimum düzeyde yararlanmak için (bellek okuma / yazma dahil) genellikle komutları sırayla yürütür. Donanım, talimat bütünlüğünü zorladığından, bunu tek bir yürütme iş parçacığında asla fark etmezsiniz. Ancak, geçici belleğe sahip birden çok iş parçacığı veya ortam için (örneğin bellek eşlemeli G / Ç) bu, öngörülemeyen davranışlara yol açabilir.

Bellek perdesi / bariyeri, bellek okuma / yazma işlemlerinin beklediğiniz sırada gerçekleştiği anlamına gelen bir talimat sınıfıdır. Örneğin, bir 'tam çit', çitin ardından çitten sonra yapılanlardan önce tüm okuma / yazma işlemleri anlamına gelir.

Hafıza çitlerinin bir donanım konsepti olduğunu unutmayın. Daha yüksek seviyeli dillerde, muteksler ve semaforlar ile uğraşmaya alışkınız - bunlar, düşük seviyedeki hafıza çitleri kullanılarak iyi bir şekilde uygulanabilir ve hafıza engellerinin açık kullanımı gerekli değildir. Bellek engellerinin kullanımı, donanım mimarisinin dikkatli bir şekilde incelenmesini gerektirir ve daha yaygın olarak uygulama kodundan çok aygıt sürücülerinde bulunur.

CPU yeniden sıralama, derleyici optimizasyonlarından farklıdır - ancak yapay nesneler benzer olabilir. İstenmeyen davranışlara neden olabilecekse (örneğin, C'deki uçucu anahtar sözcüğün kullanımı), derleyicinin talimatlarınızı yeniden düzenlemesini durdurmak için ayrı önlemler almanız gerekir.


26
Derleyicinin yeniden sıralanmasını durdurmak için değişkenliğin yeterli olduğunu düşünmüyorum; AFAIK yalnızca derleyicinin değişken değerini önbelleğe alamamasını sağlar. Linux çekirdeği, tam bir derleyici optimizasyon engeli oluşturmak için bir gcc uzantısı ( asm __volatile __ (""::: "bellek")) kullanır.
CesarB

5
true, volatile iş parçacığının farkında değildir, ancak derleyicinin belirli optimizasyonları uygulamasını durdurmak için kullanabilirsiniz - bu çitler ile ilgili değildir;)
Gwaredd

3
(.NET CLR) uçucu okumalar elde etme çitleri, yazmalar serbest bırakma sınırlarıdır. Birbirine bağlı operasyonlar, MemoryBarrier yönteminde olduğu gibi dolu.
Luke Puplett

3
.Net'teki uçucu anahtar kelimeyle ilgili ilginç okuma burada bulunabilir albahari.com/threading/part4.aspx#_NonBlockingSynch Site c #
Bas Smit

developerWorks'ün PowerPC bellek depolama modeli hakkında iyi bir [makale] [1] vardır. [1]: ibm.com/developerworks/systems/articles/powerpc.html
Iouri Goussev

17

Cevabımı başka bir soruya kopyalamak: Bir işlemcinin kodu optimize etmek için yaptığı bazı hileler nelerdir? :

En önemlisi, bellek erişiminin yeniden sıralanması olacaktır.

Bellek çitleri veya serileştirme talimatları olmadığında, işlemci bellek erişimlerini yeniden sıralamakta serbesttir. Bazı işlemci mimarilerinin ne kadar yeniden sipariş verebilecekleri konusunda kısıtlamaları vardır; Alfa, en zayıf olanı (yani, en çok yeniden sıralayabilen) olarak bilinir.

Konuya ilişkin çok iyi bir muamele, Linux çekirdek kaynak belgelerinde, Documentation / memory-barriers.txt adresinde bulunabilir. .

Çoğu zaman, derleyicinizden veya standart kitaplığınızdan kilitleme ilkellerini kullanmak en iyisidir; bunlar iyi test edilmiştir, gerekli tüm bellek engellerine sahip olmalıdır ve muhtemelen oldukça optimize edilmiştir (kilit ilkellerini optimize etmek zordur; uzmanlar bile bazen yanlış anlayabilirler).


Yeniden sıralama sürecini nasıl etkiler? Alpha is known for being the weakestNeden dedin weakest? Daha çok yeniden sıralama, yani sonuç olarak çok daha hızlı yürütme olması daha iyi değil mi? (Ben alfa kullanıcı değilim, ama etkisi hakkında soran very reorderingvsrestricted reordering ). Öyleyse, parti yeniden düzenlemenin dezavantajları nelerdir (tanımlanmamış davranış riski hariç, ancak tahmin ediyorum, çoğu modern CPU iyi yeniden sıralamayı çözmeli ve yalnızca tanımlı yeniden sıralama uygulamalıydı, aksi takdirde verdikleri kararın anlamı olmazdı).
Herdsman

8

Tecrübelerime göre bir hafıza engelini ifade ediyor , birden çok iş parçacığı arasında bellek erişimini senkronize etmek için bir talimat (açık veya örtük) olan .

Sorun, modern agresif derleyiciler (komutları yeniden sıralamak için inanılmaz özgürlükleri var, ancak genellikle iş parçacıklarınız hakkında hiçbir şey bilmiyorlar) ve modern çok çekirdekli CPU'ların birleşiminde ortaya çıkıyor.

Soruna iyi bir giriş, " 'İki Kontrollü Kilit Bozuk' Beyanı " dır . Birçoğu için ejderhaların olduğu uyanma çağrısıydı.

Örtük tam bellek engelleri genellikle, temelini kapsayan platform iş parçacığı senkronizasyon rutinlerine dahil edilir. Bununla birlikte, kilitsiz programlama ve özel, hafif senkronizasyon modellerini uygulamak için genellikle yalnızca bariyere veya hatta yalnızca tek yönlü bir bariyere ihtiyacınız vardır.


2

Wikipedia hepsini biliyor ...

Membran veya bellek çiti olarak da bilinen bellek bariyeri, bir merkezi işlem biriminin (CPU) engel talimatından önce ve sonra verilen bellek işlemlerinde bir sipariş kısıtlaması uygulamasına neden olan bir talimat sınıfıdır.

CPU'lar, bellek yükleme ve depolama işlemleri dahil olmak üzere sıra dışı yürütmeye neden olabilecek performans optimizasyonları kullanır. Bellek işlemi yeniden sıralama normalde tek bir yürütme iş parçacığı içinde fark edilmez, ancak dikkatli bir şekilde kontrol edilmedikçe eşzamanlı programlarda ve aygıt sürücülerinde öngörülemeyen davranışlara neden olur. Bir sıralama kısıtlamasının kesin doğası donanıma bağlıdır ve mimarinin bellek modeli tarafından tanımlanır. Bazı mimariler, farklı sipariş kısıtlamalarını uygulamak için birden çok engel sağlar.

Bellek engelleri, genellikle birden çok cihaz tarafından paylaşılan bellekte çalışan düşük seviyeli makine kodu uygulanırken kullanılır. Bu tür bir kod, çok işlemcili sistemlerde senkronizasyon ilkelerini ve kilitsiz veri yapılarını ve bilgisayar donanımı ile iletişim kuran aygıt sürücülerini içerir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.