X86'daki "geçici olmayan" bellek erişimlerinin anlamı nedir


123

Bu biraz düşük seviyeli bir sorudur. X86 montajında ​​iki SSE talimatı vardır:

MOVDQA xmmi, m128

ve

MOVNTDQA xmmi, m128

IA-32 Yazılım Geliştirici Kılavuzu , MOVNTDQA'daki NT'nin Geçici Olmayan anlamına geldiğini ve aksi takdirde MOVDQA ile aynı olduğunu söyler.

Sorum şu, Zamansal Olmayan ne anlama geliyor?


6
SSE4.1'in MOVNTDQA xmmi, m128bir NT yükü olduğunu ve hariç diğer tüm NT komutlarının depolandığını unutmayın prefetchnta. Burada kabul edilen cevap sadece mağazalardan bahsediyor gibi görünüyor. NT yükleri hakkında bulabildiğim şey bu . TL: DR: umarım CPU, önbellek kirliliğini en aza indirmek için NT ipucu ile yararlı bir şeyler yapar, ancak "normal" WB belleğinin çok sıralı semantiğini geçersiz kılmıyorlar, bu yüzden önbelleği kullanmak zorunda kalıyorlar.
Peter Cordes

5
Güncelleme: NT yükleri , çoğu CPU'daki (örneğin Intel SnB ailesi) UCSW bellek bölgeleri dışında yararlı bir şey yapmayabilir. NT / akış depoları kesinlikle normal bellek üzerinde çalışır.
Peter Cordes

4
@Peter: USWC belleğini mi kastediyorsun? Daha önce UCSW veya USWC hafızasını hiç duymamıştım. Yanlış kısaltmanın Google'da aranması yardımcı olmadı :-)
Andrew Bainbridge

4
@AndrewBainbridge: Evet, WC bellek türü özniteliği. Önbelleğe Alınamayan Spekülatif Yazma-Birleştirme. Sanırım UnCacheable'ı büyük harfle yazıyordum ve 4 harf uzunluğunda olması gerektiğini hatırlıyordum. : P
Peter Cordes

Yanıtlar:


147

Geçici olmayan SSE komutları (MOVNTI, MOVNTQ, vb.), Normal önbellek tutarlılık kurallarına uymaz. Bu nedenle, zamansal olmayan mağazaların, sonuçlarının diğer işlemciler tarafından zamanında görülmesi için bir SFENCE talimatı ile takip edilmesi gerekir.

Veriler üretildiğinde ve (hemen) tekrar tüketilmediğinde, bellek depolama işlemlerinin önce tam bir önbellek satırını okuması ve ardından önbelleğe alınan verileri değiştirmesi, performansa zarar verir. Bu işlem, yakın zamanda kullanılmayacak veriler lehine tekrar ihtiyaç duyulabilecek verileri önbellekten dışarı iter. Bu özellikle doldurulan ve daha sonra kullanılan matrisler gibi büyük veri yapıları için geçerlidir. Matrisin son öğesi doldurulmadan önce, tam boyut ilk öğeleri çıkararak yazma işlemlerinin önbelleğe alınmasını etkisiz hale getirir.

Bu ve benzeri durumlar için işlemciler, geçici olmayan yazma işlemleri için destek sağlar. Bu bağlamda geçici olmayan, verilerin yakında yeniden kullanılmayacağı, dolayısıyla önbelleğe almak için hiçbir neden olmadığı anlamına gelir. Bu geçici olmayan yazma işlemleri bir önbellek satırını okumaz ve sonra onu değiştirmez; bunun yerine yeni içerik doğrudan belleğe yazılır.

Kaynak: http://lwn.net/Articles/255364/


15
Güzel cevap, NT komutlu işlemci türünde, geçici olmayan bir talimatla (yani normal bir talimat) bile, satır önbelleğinin "okunup sonra değiştirilmediğini" belirtmek isterim. Önbellekte olmayan bir satıra normal bir talimat yazmak için, önbellekte bir satır ayrılır ve bir maske, satırın hangi bölümlerinin güncel olduğunu gösterir. Bu web sayfası buna "mağazada takılma yok" diyor: ptlsim.org/Documentation/html/node30.html . Daha kesin referanslar bulamadım, bunu yalnızca işi işlemci simülatörlerini uygulamak olan adamlardan duydum.
Pascal Cuoq

2
Aslında ptlsim.org , döngü doğruluğu sağlayan bir işlemci simülatörüyle ilgili bir web sitesidir, bana "mağazada durma yok" diyen adamların yaptığı gibi. Şu yorumu görürlerse diye onlardan da bahsetmeliyim: unisim.org
Pascal Cuoq

1
Buradaki cevaplardan ve yorumlardan stackoverflow.com/questions/44864033/… buna SFENCEihtiyaç duyulmayabilir. En azından aynı başlıkta. Sen de bakabilir misin?
Serge Rogatch

1
@SergeRogatch, hangi senaryodan bahsettiğinize bağlıdır, ancak evet sfence, NT mağazaları için gerekli olan senaryolar vardır , oysa sadece normal mağazalar için gerekli değildir. NT depolar, diğer mağazalar (NT ya da değil) ile ilgili olarak sıralanmaz diğer parçacıkları tarafından görüldüğü gibi bir olmaksızın sfence. Depolanan aynı iş parçacığından okumalar için, ancak, hiçbir zaman ihtiyacınız yoktur sfence: belirli bir iş parçacığı, NT deposu olup olmadığına bakılmaksızın, her zaman program sırasına göre kendi depolarını görecektir.
BeeOnRope

40

Espo, hedefi çok fazla vuruyor. Sadece iki sentimi eklemek istedim:

"Zamansal olmayan" deyimi, zamansal yerelliğin olmadığı anlamına gelir. Önbellekler iki tür yerellikten yararlanır - uzamsal ve zamansal ve zamansal olmayan bir talimat kullanarak işlemciye yakın gelecekte veri öğesinin kullanılmasını beklemediğinizi bildirirsiniz.

Önbellek kontrol talimatlarını kullanan elle kodlanmış derleme konusunda biraz şüpheliyim. Tecrübelerime göre bu şeyler, herhangi bir etkili performans artışından daha fazla kötü hataya yol açar.


"Önbellek kontrol talimatlarını kullanan elle kodlanmış derleme" hakkında soru. JavaVM gibi bir şey hakkında açıkça "elle kodlanmış" dediğini biliyorum. Bu daha iyi bir kullanım durumu mu? JavaVM / Compiler programın statik ve dinamik davranışını analiz etmiş ve bu geçici olmayan talimatları kullanmıştır.
Pat

4
Sorunlu etki alanınızın, algoritmanızın veya uygulamanızın bilinen yerel özelliklerinden (veya bunların eksikliğinden) kaçınılmamalıdır. Önbellek kirliliğinden kaçınmak gerçekten çok çekici ve etkili bir optimizasyon görevidir. Ayrıca, neden toplanmaya karşı tiksinti? Bir derleyicinin yararlanamayacağı çok sayıda kazanç fırsatı var
awdz9nld

5
Bilgili bir düşük seviyeli programcının küçük çekirdekler için bir derleyiciden daha iyi performans gösterebileceği kesinlikle doğrudur. Bu, makaleler ve blog gönderileri yayınlamak için harika ve ikisini de yaptım. Aynı zamanda iyi öğretici araçlardır ve "gerçekten" neler olup bittiğini anlamaya yardımcı olurlar. Deneyimlerime göre, üzerinde çalışan birçok programcının olduğu gerçek bir sisteme sahip olduğunuz ve doğruluk ve sürdürülebilirliğin önemli olduğu uygulamada, düşük seviyeli kodlamanın faydası neredeyse her zaman risklerden daha ağır basmaktadır.
Pramod

4
@Pramod, aynı argümanın genel olarak optimizasyona kolayca genelleştirdiğini ve gerçekten tartışmanın kapsamında olmadığını - açıkça, zaten zamansal olmayan talimatlardan bahsettiğimiz gerçeği göz önüne alındığında, değiş tokuşun zaten düşünüldüğü veya başka bir şekilde alakasız görüldüğü
awdz9nld

7

Intel® 64 ve IA-32 Mimarileri Yazılım Geliştirici Kılavuzu, Cilt 1: Temel Mimari, "Intel Akış SIMD Uzantıları (Intel SSE) ile Programlama" bölümüne göre:

Geçici ve Geçici Olmayan Verilerin Önbelleğe Alınması

Bir program tarafından referans verilen veriler geçici (veriler tekrar kullanılacak) veya geçici olmayan (verilere bir kez başvurulacak ve yakın gelecekte tekrar kullanılmayacaktır) olabilir. Örneğin, program kodu genellikle geçicidir, oysa bir 3-D grafik uygulamasındaki görüntüleme listesi gibi multimedya verileri genellikle geçici değildir. İşlemcinin önbelleklerinden verimli bir şekilde yararlanmak için, genellikle geçici verileri önbelleğe almak ve geçici olmayan verileri önbelleğe almak istenmez. İşlemcinin önbelleklerinin zamansal olmayan verilerle aşırı yüklenmesi, bazen "önbellekleri kirletme" olarak adlandırılır. SSE ve SSE2 önbelleğe alınabilirlik denetim talimatları, bir programın geçici olmayan verileri belleğe önbellek kirliliğini en aza indirecek şekilde yazmasını sağlar.

Geçici olmayan yükleme ve depolama talimatlarının açıklaması. Kaynak: Intel 64 ve IA-32 Mimarileri Yazılım Geliştirici Kılavuzu, Cilt 2: Yönerge Seti Referansı

YÜK (MOVNTDQA — Geçici Olmayan Hizalanmış Çift Dört Sözcük Yükle)

Bellek kaynağı WC (yazma birleştirme) bellek türü ise, geçici olmayan bir ipucu kullanarak kaynak işlenenden (ikinci işlenen) hedef işlenene (ilk işlenen) bir çift dört sözcük yükler [...]

[...] işlemci veriyi önbellek hiyerarşisine okumaz veya karşılık gelen önbellek satırını bellekten önbellek hiyerarşisine getirmez.

Peter Cordes'in yorumladığı gibi, mevcut işlemcilerdeki normal WB (geri yazma) belleğinde kullanışlı olmadığını unutmayın çünkü NT ipucu yok sayılır (muhtemelen NT'ye duyarlı HW ön getiricileri olmadığı için) ve tam olarak sıralı yük semantiği geçerlidir . prefetchntaWB belleğinden kirliliği azaltan bir yük olarak kullanılabilir

MAĞAZA (MOVNTDQ — Geçici Olmayan İpucu Kullanarak Paketlenmiş Tamsayıları Depola)

Belleğe yazma sırasında verilerin önbelleğe alınmasını önlemek için geçici olmayan bir ipucu kullanarak kaynak işlenendeki (ikinci işlenen) paketlenmiş tamsayıları hedef işlenene (ilk işlenen) taşır.

[...] işlemci veriyi önbellek hiyerarşisine yazmaz veya karşılık gelen önbellek satırını bellekten önbellek hiyerarşisine getirmez.

Önbellek Yazma Politikaları ve Performansında tanımlanan terminolojiyi kullanarak , bunlar etrafına yazma (yazma-ayırma, yazma-kaçırma-getirme-yok) olarak düşünülebilir.

Son olarak, geçici olmayan mağazalar hakkındaki John McAlpin notlarını incelemek ilginç olabilir .


3
SSE4.1 MOVNTDQAyalnızca WC (önbelleğe alınamayan Yazma-Birleştirme) bellek bölgelerinde, örneğin video RAM'de özel bir şey yapar. Mevcut donanımda normal WB (geri yazma) belleğinde hiç de yararlı değildir, NT ipucu yok sayılır ve tam olarak sıralı yük semantiği uygulanır. prefetchntayine de WB belleğinden gelen kirliliği azaltan bir yük olarak yararlı olabilir . Mevcut x86 mimarileri, geçici olmayan yükleri ("normal" bellekten) destekliyor mu? .
Peter Cordes

2
Bu doğru, NT depoları WB belleğinde iyi çalışır ve zayıf sıralıdır ve genellikle büyük bellek bölgelerini yazmak için iyi bir seçimdir . Ancak NT yükleri değil. Kağıt üzerindeki x86 kılavuzu, NT ipucunun WB belleğinden gelen yükler için bir şeyler yapmasına izin verir, ancak mevcut CPU'larda hiçbir şey yapmaz . (Muhtemelen NT'ye duyarlı HW ön getirici olmadığı için.)
Peter Cordes

İlgili bilgiyi yanıta ekledim. Çok teşekkür ederim.
chus

1
@LewisKelsey: NT depoları bellek tipini geçersiz kılar. Bu yüzden WB hafızasında zayıf bir şekilde sıralanabilirler. Ana etki, RFO'lardan kaçınmaktır (görünüşe göre mem'e ulaştıklarında diğer kirli hatları bile temizleyen bir geçersiz kılma gönderiyorlar). Aynı zamanda görünür hale gelebilirler, böylece daha önceki bir önbellek kaçırma (normal) mağaza taahhütlerini veya daha önceki bir önbellek-kayıp yükü verileri alana kadar beklemek zorunda kalmazlar . Örneğin, içinde sorulan darboğaz türü Çok işlemcili bir sistemde her çekirdeğin dışındaki bellek kavramsal olarak her zaman düz / tek tip / eşzamanlı mıdır? .
Peter Cordes

1
@LewisKelsey: Temiz bir bellek sipariş makinesi, gerekirse erken yapılmaması gereken bir UC deposundan sonraki tüm yükleri öldürebilir. Bunun dışında, mağaza hizmet dışı arka uçtan emekli olana kadar commit emri devreye girmez. Bu, depo adresi uop çalıştırılana kadar gerçekleşemez, bu noktada adres için bellek tipi kontrol edilebilir. Bir mağaza adresi, çalıştırıldığında TLB'yi kontrol eder; CPU'lar, arızalı depoları kullanımdan kalkmadan önce bu şekilde algılayabilir. SB girişi L1d'ye bağlanmaya hazır olana kadar bekleyemez; bu noktada yürütme geride kaldı.
Peter Cordes
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.