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
int3
MSVC 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.