Mikro-op önbellek nasıl etiketlenir?


3

Real World Technologies'inIntel'in Sandy Bridge Mikro Mimarisi ” başlıklı makalesine göre :

“Sandy Bridge'in uop önbelleği, toplam 1.5K kapasite için 32 set ve 8 yoldan, her satırda 6 uops olarak düzenleniyor. Uop önbelleği kesinlikle L1 komut önbelleğinde bulunur. Her satır, satırdaki geçerli uops sayısını ve uop önbellek satırına karşılık gelen x86 komutlarının uzunluğunu içeren meta verileri de tutar. Uop önbelleği ile eşlenen her 32B penceresi, kümedeki 8 yoldan 3'ünü kaplayabilir, en fazla 18 ay - yaklaşık 1.8B / ay. Bir 32B pencerede 18'den fazla uops varsa, uop önbelleğine sığamaz ve geleneksel ön ucu kullanması gerekir. Mikro kodlanmış talimatlar uop önbelleğinde tutulmaz ve bunun yerine mikrokod ROM'una ve isteğe bağlı olarak ilk birkaç uops'a bir işaretçi ile gösterilir. ”

'Her 32B penceresi (komut önbelleğinden) uop önbelleğine eşlenir, kümenin 8 yolundan 3 tanesini kapatabilir'

Öyleyse, bir L1 komut önbellek satırının yarısı olacak bir 32B komut penceresi olduğunu varsayalım, bu satırda, sadece ofset bitleri farklı olacaktır, ancak etiket ve ayar bitleri satırdaki tüm baytlar için aynı olacaktır.

Bir 32 baytlık pencerenin kodu çözüldükten sonra, uops, 16 byte getirme bloğunu L1 talimat önbelleğinden almak için kullanılan aynı sanal adresle uop önbelleğine girilir (böylece her 32B marjında ​​paralel olarak problanabilirler)

Bu çetelerin bir kümedeki 8 yolun 3'ünü kapsayabileceği, ancak aynı küme bitimine sahip olmaları gerektiği anlamına gelir, ancak aynı kümede sonuçlanmaları için farklı etiket bitlerine sahip olmaları gerektiği anlamına gelir (bu, üzerinde olmayacakları anlamına gelir). L1I önbelleğindeki aynı satır) bu, uop önbelleğinin biraz farklı bir şekilde düzenlenmiş olduğu, bir satırın başında tek bir sanal adres olduğu ve uops'un kümede bir sonraki yolla ve kümede bir sonraki yolla doldurduğu anlamına gelir. Ayarlamak. Yine aynı etikete ve aynı set bitlerine sahip olacak bir sonraki 32B komut penceresinin, ancak farklı ofset bitlerinin (L1I'deki 64 B çizgisinin 2. yarısı), bu setin 4. yolu ile eşleştirilmesi nasıl sağlanmıştır.

Postulation : uop önbellek yolu sanal dizin fiziksel etiketiyle etiketlenmiş, sonraki yolu hiçbir şey üçüncü, hiçbir şey ile etiketlenmiş, 4 farkı ofset 0'dan değişti ki sanal bir indeks / fiziksel etiketiyle etiketlenmiş 32, bu nedenle, özünde, L1I önbellekinin etiketlenme biçiminin aksine farklı ofset bitleri kullanılarak bir yol seçilebilir: ofset bitleri, önbellek hattı için bir ofset işlevi görür.

Uop önbellek düzenini veya bu etiketlemenin gerçekte nasıl çalıştığını netleştiren var mı?


AMD Zen'de ayrıca bir uop önbelleği bulunduğunu, ancak iç kısımları hakkında daha az şey bilindiğini unutmayın. Demek özel olarak Sandy Bridge ailesindeki Intel'in önbellekini soruyorsun. Agner Fog'un testine göre ( agner.org/optimize , özellikle de microarch pdf), iTLB aramalarının gecikme / gücünü koruyan neredeyse (VIVT) ele alındı.
Peter Cordes

Yanıtlar:


1

AMD Zen'de ayrıca bir uop önbelleği bulunduğunu, ancak iç kısımları hakkında daha az şey bilindiğini unutmayın. Demek özel olarak Sandy Bridge ailesindeki Intel'in önbellekini soruyorsun.

Agner Fog'un testine göre ( https://www.agner.org/optimize/ , özellikle de microarch pdf), iTLB aramalarının gecikme / güç tasarrufu uop-cache hit'leri için tasarruf sağlandı (VIVT). Ve bir VIPT L1 önbellek için normal bir şekilde iTLB'yi L1i önbellek ile çok sıkı bir şekilde bütünleştirmeyi mümkün kılar.

(ayrıca ilgili: intel core i7 işlemcisinde hangi önbellek haritalama tekniği kullanılır? Bu ve diğer önbelleklerin özeti için ve https://stackoverflow.com/tags/x86/info adresinde daha fazla performans / uç bağlantısı için kullanılır.)

Bir 32 baytlık pencerenin kodu çözüldüğünde

Düşünce sürecinde yanlış gittiğin yer burası.

Uop önbelleği, yalnızca (spekülatif) yürütme yolu boyunca kodu çözülen uops'ları önbelleğe alır. x86 komutları ancak doğru başlangıç ​​noktasını biliyorsanız doğru şekilde çözülebilir. Koşulsuzluktan sonraki baytlar jmp, bir talimatın başlangıcı olmayabilir.

Ayrıca, uop önbelleğini işlevler arasında birçok tek baytlık dolgu talimatıyla kirletmek istemezsiniz (örneğin, 0x90 NOP veya 0xcc int3MSVC tarafından kullanılır). Veya genel olarak, alınan bir dalın ardından normal uygulama sırasında ulaşılmayan "soğuk" talimatlarla. Bir uop-önbellek "satırı" / yolu koşulsuz bir atlama ile veya a ile erken biter call.

Eski kod çözücüleri ya işlemci aslında yürütmek için beklediği talimatları deşifre edilir (sonradan yeniden kullanım için uop önbelleğine bunları besleyen ve ıDQ doğrudan kullanım için hemen), ya da kapatılmış konum . P4'ün aksine, eski kod çözücüler zayıf değildir; Core2 / Nehalem'deki kod çözücülere benzerler, bu nedenle L1i'den yürütme, büyük ortalama komut büyüklüğüne sahip yüksek verimli kod dışında genellikle tamamdır. Önceden “izler oluşturmaya” çalışmak zorunda değiller. (Uop önbelleğidir değil zaten bir izleme önbellek, aynı atlayışları takip etmiyor Ama yine de her 32 talimat bayt için uop önbelleği doldurmak çalışmaz. Olabilir hemen önbelleğe alınması.)

Ancak ilginç bir şekilde, Agner " Aynı kod parçası jumpop önbelleğinde birden fazla atlama girişi varsa birden fazla giriş yapabilir " diyor.


En iyi tahminim önbellek arama makineleri aslında nasıl çalıştığına:

Üzerinden kod almak için 64 bit sanal adres verildi:

  • Düşük 5 bit, 32 bayt sınırına göre ofsettir.
  • Sonraki 5 bit bir dizindir. 64-bayt L1i hatları için 6 bit değildir; Uop önbellekten almak, doğrudan bununla ilgilenmez.
  • Daha yüksek bit (en fazla 48 bit) etikettir.

Bir küme seçmek için 5 bitlik dizini kullanın.
Bu kümeden 8 yöntemi de al (etiket + meta veriler ve ayrıca veriler paralel olarak veriler, çünkü bu yüksek performanslı bir önbellek).

8 yolun tümü için paralel olarak karşılaştırın:

  • etiketin tümü eşleşmesi bit
  • ofset, x86 makine kodunun start + uzunluk aralığı dahilinde bu şekilde önbellekleri önbelleğe alır. (Bir yol yalnızca x86 makine kodunun 1 bitişik bloğu için önyükleyebilir).

Sette en fazla 1 yol, verilen talimat adresi için doğru olan her iki koşula da sahip olacaktır. Bir tane varsa, bu sizin isabetinizdir ve eşleşen bir şekilde uops alabilirsiniz. (Normal bir bayt önbelleğinde olduğu gibi, bir yolun ortasına atladıysanız, hangi uop’u almaya başlayacağınızı seçmek için meta verileri kontrol etmeniz gerekir.)

Bu, uop önbelleğinin nasıl performans gösterdiğine ve ne zaman atıldığına bağlı olarak yapılan tahmindir. Ancak faydalı bir zihinsel model elde etmenize yardımcı olabilir.


Adres unutmayın gelmez 16 bayt hizalanması gerekir. Hizalı olmayan dal hedeflerini ve 32 bayt sınırlarıyla aynı çizgide olmayan komut sınırlarını içeren düz çizgi kodu verimli bir şekilde desteklemesi gerekir. (En iyi söyleyebileceğim gibi, 32 baytlık bir sınırı geçen talimatlar, bir sonraki L1i önbellek satırında 64 baytlık bir sınır boyunca bitse bile, talimatın başlangıç ​​adresi için uop-önbellek olarak önbelleğe alınır.)

Lli alma blokları / talimat uzunluğu için ön kod çözme aynı hizadadır, ancak eski kod çözücülerde tam kod çözme, kod çözme ile kod çözme arasındaki kuyruktan alınan her hizalamanın 16 baytına kadar çalışır. Döngü giriş noktalarının belirli hizalama sınırlarına hizalanması eskisinden daha az önemlidir.


Daha sonra, alım adresinin talimat başlangıç ​​adreslerinden biriyle tam olarak eşleştiğine dair bir kontrol var sanırım. Bu verimli bir şekilde desteklenmez, çünkü yalnızca karışık kod aynı baytları iki farklı yolla çözer.

Uop önbelleği aynı anda her iki yolu da önbelleğe alamaz, bu nedenle CPU'nun eski kod çözücülere geri dönmesi ve bu 32B bloğu için uop önbellek yollarını atması gerekir (etiket karşılaştırıcısında zaten algılandı).

Sonra, bu noktadan uops kodunu çözerken, uop önbelleğini yeniden doldurmaya başlayabilir.

Benzer bir şey, 3 yol zaten dolu olduğunda da olur, ancak aynı 32B x86 kod kodundan daha fazla hata var. Uop-önbellek, bu blok için 3 yolu da atıyor. (Bir dahaki sefere onları önbelleğe almayı denememeyi hatırlamıyor mu, yoksa her seferinde sadece önbellek oluşturuyor mu ve limit attığında atıyor mu, nopörneğin 20 tek baytlık talimatı olan bir döngüde . )

Bkz Intel SNB-aile CPU üzerindeki mikro-kodlu talimatlara içeren döngüler için Şubesi hizalama Bu durumda ilgili bazı detaylar için . Unutmayın ki mikro kodlu talimatlar div, uop önbelleğinin tamamını kendi başlarına kullanmak ve kolayca tüm 3 yolun doldurulmasına ve DSB-MITE anahtarlarının tetiklenmesine yol açabilir (eski kod çözme anahtarlarına uop önbellek ön uçtaki baloncuk balonu).

Soru ve Cevapların, aygıtların nasıl önbelleğe alındığına ilişkin birçok ayrıntılı deney ve sonuç vardır. Uop önbelleğinin fiziksel olarak nasıl uygulandığı hakkında çok fazla değil; Bu tamamen benim açımdan tahmin.

Ayrıca, Skylake'ten önceki Intel CPU'ların, uop önbelleğinden IDQ'ya yalnızca 4 uops ekleyebileceğini unutmayın, ancak uop önbelleğinde 4 yerine 3 veya 6 uops olan yollar olduğunda bir şekilde tıkanmaz. dallanmayan uop alımı için tamponlama. Bu biraz gizemli. Her birinin 6 uop'luk tam çizgilerden getirilmesi durumunda 4, 2, 4, 2 düzeninde getirilmeyi beklersiniz, ancak 2 ile uop önbellekten çalışan döngüler için böyle bir ön uç darboğazı görmüyoruz. gibi talimatlarla bayt xor eax,eax. Intel, uop önbelleğinin sadece döngü başına 1 yoldan uop alabileceğini belirtti, bu yüzden belki 4-uop sınırı sadece IDQ'ya eklemek içindir, aslında uop önbelleğinden bir birleştirme arabelleğine okumak için değildir.


Bunun için teşekkür ederiz: 'Kod, çift tampondan kod çözücülere IFETCH blokları (komut alma blokları) diyeceğim kod çözücülere iletilir. IFETCH blokları 16 byte uzunluğundadır. Çoğu durumda, komut alma ünitesi her bir IFETCH bloğunu 16 baytlık bir sınırdan ziyade bir komut sınırından başlatır. ' - mikro mimarlık.pdf. Netleştirme için '16 bayta kadar' yazıyor, bunun anlamı, her zaman tam talimatlar içermesini sağladığı anlamına geliyor, yani 5,5,4,4 ise, ilk 3'ü birlikte paketleyip 14 baytlık bir blok olarak gönderebilir ve sonraki 4 yeni bir blokta başlayacak ..?
Lewis Kelsey

.. böylece toplama biriminden gelen verim her zaman 16 bayt değildir
Lewis Kelsey

@LewisKelsey: oh Ön kod çözmeden önce tamponlama olduğunu unuttum, ancak bu işlem hacmini artırmak ve 16 byte ile sınırlandırılmış güçle açılmış donanımdan daha fazla faydalanmak için mantıklı geliyor. Her neyse, CPU’nun talimatların ön kod çözme işleminden sonrasına kadar nerede biteceğini bilmediğini ya da dal tahmini, alınmış bir dal olduğunu söylüyorsa, bunun sonu bilinir. Ancak aksi takdirde ön uç, ön kod çözücülere 16 bayt besleyecektir. Son bayt bir insn'in ortası ise, bir sonraki kod çözme bloğunun başlangıcı o komutun başlangıcı olacaktır (bir sonraki döngüye kadar takılır).
Peter Cordes

@LewisKelsey: Her neyse, evet, ön kod çözücünün kod çözücülere göndermeden önce bir talimatın sonunu bulması gerekir . Ancak Agner Fog'un IFETCH bloklarından bahseden uç kılavuzunun bölümleri Core2'den önceki bölümlerdir. Core2'nin şube tahmini ile talimat getirme arasında bir sıra eklediğini söyledi. Ancak yine de “ 16 baytlık bir sınırı geçen herhangi bir komut bir sonraki 16 baytlık blok işlenene kadar bırakılacak ” diyor, bu yüzden ön kod çözme hala hizalanmış bloklara dayanıyor. (Ancak kod çözme, önceki CPU'larda bile değildir.) Eğlence olgusu: SnB öncesi kod çözücüler 7 ay (4-1-1-1) kadar sürebilir. SnB = 4.
Peter Cordes

Teşekkürler, başka bir faydalı kaynak şudur: intel.co.uk/content/dam/www/public/us/en/documents/manuals/…
Lewis Kelsey
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.