@ peufeu'nun cevabı, bunların sistem genelinde toplam bant genişlikleri olduğuna işaret ediyor. L1 ve L2, Intel Sandybridge ailesindeki her bir çekirdek için özel önbellek, yani sayılar tek bir çekirdeğin yapabileceği miktarın 2 katı. Fakat bu bizi etkileyici bir yüksek bant genişliği ve düşük gecikmeyle bırakıyor.
L1D önbelleği doğrudan CPU çekirdeğine yerleştirilmiştir ve yükleme yürütme birimleri (ve depo tamponu) ile çok sıkı bir şekilde birleştirilmiştir . Benzer şekilde, L1I önbelleği, çekirdeğin komut alma / kod çözme bölümünün hemen yanındadır. (Aslında bir Sandybridge silikon taban planına bakmadım, bu yüzden bu tam anlamıyla doğru olmayabilir. Ön uçtaki sorun / yeniden adlandırma kısmı, muhtemelen güç tasarrufu sağlayan ve daha iyi bant genişliğine sahip olan "L0" kodlu kullanıcı önbelleğine daha yakındır. kod çözücülerden daha fazla.)
Fakat L1 önbellekle her döngüde okuyabilsek bile ...
Neden orada durdun? Sandybridge'den beri Intel ve K8'den beri AMD döngü başına 2 yük yapabilir. Çok portlu önbellek ve TLB'ler bir şeydir.
David Kanter'in Sandybridge mikro mimari yazısının güzel bir şeması var (IvyBridge CPU'nuz için de geçerli):
( "Birleşik zamanlayıcı" ALU tutar ve hafıza onların girişler hazır olması için bekleyen UOPs ve / veya onların yürütme portu bekliyor. (Örn vmovdqa ymm0, [rdi]
kod çözümünü beklemek zorunda yük UOP için rdi
bir önceki eğer add rdi,32
henüz infaz edilmemiştir için, Örnek). Intel, zaman çizelgesini yayın / yeniden adlandırma sırasındaki bağlantı noktalarına zamanlıyor.Bu şekil yalnızca bellek aygırları için yürütme bağlantı noktalarını gösteriyor, ancak yürütülemeyen ALU ayraçları da bunun için rekabet ediyor. Emekliliğe kadar ROB'da kalırlar, ancak programlayıcıda yalnızca bir yürütme limanına gönderilinceye kadar kalırlar (Bu, Intel terminolojisidir; diğer insanlar sorunu kullanır ve farklı şekilde gönderir). AMD, tam sayı / FP için ayrı zamanlayıcılar kullanır, ancak adresleme modları her zaman tam sayı kayıtlarını kullanır.
Görüldüğü gibi, sadece 2 AGU portu var ( [rdi + rdx*4 + 1024]
doğrusal bir adres gibi bir adresleme modu alan ve adres oluşturma birimleri olan adres oluşturma birimleri ). Biri mağaza olmak üzere, saat başına 2 bellek op'unu (her biri 128b / 16 bayt) çalıştırabilir.
Ancak manşetini biraz kandırdı: SnB / IvB 256b AVX yük / depo portunda 2 devir alan tek bir üp olarak yükler / depolar ancak ilk devirde sadece AGU'ya ihtiyaç duyar. Bu, bir mağaza adresinin AGU'da, bu ikinci döngü sırasında hiçbir yük verimini kaybetmeden 2/3 portunda çalışmasını sağlar. Dolayısıyla, AVX ile (Intel Pentium / Celeron CPU'ların desteklemediği: /), SnB / IvB (teoride) döngü başına 2 yük ve 1 mağaza alabilir.
IvyBridge CPU'nuz Sandybridge'in kalıp küçültmesidir ( mov-eleme , ERMSB (memcpy / memset) ve sonraki sayfa donanım ön ayarı). Ondan sonraki nesil (Haswell), veri yollarını yürütme birimlerinden L1'e 128b'den 256b'ye genişleterek saat başına L1D bant genişliğini iki katına çıkardı, böylece AVX 256b yükleri saatte 2 kalabilir. Aynı zamanda basit adresleme modları için ilave bir AGU portu ekledi.
Haswell / Skylake'in en yüksek verimi, saat başına 96 bayt yüklü + depolandı, ancak Intel'in optimizasyon el kitabı, Skylake'in sürekli ortalama veriminin (hala L1D veya TLB'nin özlüyor olmadığını varsayarak) döngü başına ~ 81B olduğunu gösteriyor. (Bir sayısal tam sayı döngü için sürdürmek benim test göre saatin başına 2 yükler + 1 deposu 4 kaynaşık alan UOPs gelen saat başına UOPs) 7 (kaynaşmamış-alan yürütülmesi SKL ile. Ancak bu 64-bit işlenen yerine sahip bir şekilde yavaşlar 32-bit, görünüşe göre bazı mikro mimari kaynak limitleri var ve bu sadece mağaza adreslerini 2/3 portuna düşürmek ve yüklerden döngü çalmaktan ibaret değil.)
Bir önbelleğin verimini parametrelerinden nasıl hesaplıyoruz?
Parametreler pratik çıkış numaraları içermedikçe, yapamazsınız. Yukarıda belirtildiği gibi, Skylake'in L1D'si bile 256b vektörler için yük / mağaza çalıştırma ünitelerine yetişemiyor. Her ne kadar yakın ve 32-bit tamsayılar için de olabilir. (Önbelleğin okuma bağlantı noktalarından daha fazla yük birimine sahip olması anlamlı değildir, ya da tam tersi. Asla tam olarak kullanılamayan bir donanımı dışlarsınız. L1D'nin hatları göndermek / almak için fazladan bağlantı noktaları olabileceğini unutmayın. / diğer çekirdeklerden, hem de çekirdeğin içindeki okuma / yazmalar için.)
Sadece veri yolu genişliklerine ve saatlerine bakmak size tüm hikayeyi vermez.
L2 ve L3 (ve bellek) bant genişliği, L1 veya L2'nin izleyebileceği sıra dışı cevapların sayısıyla sınırlandırılabilir . Bant genişliği gecikmeyi geçemez * max_concurrency ve daha yüksek gecikme süresi olan L3 (çok çekirdekli Xeon gibi) yongaları, aynı mikro mimarideki çift / dört çekirdekli CPU'dan çok daha az tek çekirdekli L3 bant genişliğine sahiptir. Bu SO cevabının "gecikmeyle bağlı platformları" bölümüne bakın . Sandybridge ailesi CPU'lar, L1D özlemlerini takip etmek için 10 satır doldurma arabelleğine sahiptir (ayrıca NT mağazaları tarafından da kullanılır).
(Çok sayıda çekirdek etkin olan toplu L3 / bellek bant genişliği büyük bir Xeon'da çok büyük, ancak tek iş parçacıklı kod aynı saat hızında dört çekirdekten daha kötü bant genişliği görüyor, çünkü daha fazla çekirdek ring veriyolunda daha fazla durma anlamına geliyor ve bu nedenle daha yüksek gecikme süresi L3.)
Önbellek gecikme süresi
Böyle bir hız nasıl elde edilir?
L1D önbelleğin 4 çevrim yük kullanım gecikmesi oldukça şaşırtıcı , özellikle de bir adresleme modu ile başlaması gerektiğini göz önünde bulundurarak [rsi + 32]
, bir sanal adres almadan önce bir ekleme yapmak zorunda . Daha sonra bir eşleşmenin önbellek etiketlerini kontrol etmek için bunu fiziksel olarak çevirmek zorundadır.
( [base + 0-2047]
Intel Sandybridge-ailesinde fazladan döngü alma dışındaki adresleme modları , bu nedenle AGU'larda basit adresleme modları için bir kısayol var (düşük yük kullanım gecikmesinin muhtemelen en önemli olduğu, ancak genel olarak yaygın olduğu işaretçi izleme durumları için tipik) (Bkz. Intel'in optimizasyon el kitabı , Sandybridge bölüm 2.3.5.2 L1 DCache.) Bu, bölüm geçersiz kılma ve bunun 0
normal olan bölüm temel adresini de varsaymaz .)
Ayrıca, daha önce herhangi bir mağazayla çakışıp çakışmadığını görmek için mağaza tamponunu da araştırmak zorundadır. Ve daha önce (program sırasına göre) mağaza adresi uopu henüz çalışmamış olsa bile bunu çözmesi gerekir, bu nedenle mağaza adresi bilinmiyor. Ancak, bu muhtemelen bir L1D vuruşu kontrolü ile paralel olarak gerçekleşebilir. L1D verilerine ihtiyaç duyulmadığı için, mağaza yönlendirme verileri mağaza tamponundan sağlayabilir, o zaman bu bir kayıp olmaz.
Intel, hemen hemen herkes gibi tıpkı önbellek yeterince küçük ve PIPT önbellek gibi davranması için yeterince yüksek bir ilişkilendirme (sıralamayı yapamaz) VIPT (önbellekleme yapamaz) özelliği gibi standart bir numara kullanarak VIPT (Neredeyse Endekslenmiş Fiziksel Olarak Etiketlenen) önbelleklerini kullanır TLB sanal-> fiziksel aramaya paralel).
Intel'in L1 önbellekleri 32-yönlü, 8-yönlü birleşimdir. Sayfa boyutu 4B'dır. Bu, "dizin" bitlerinin (hangi 8 yol kümesinin belirli bir satırı önbelleğe alabileceğini seçtiği anlamına gelir) tümü sayfa ofsetinin altında olduğu anlamına gelir; yani, bu adres bitleri bir sayfaya mahsustur ve sanal ve fiziksel adreslerde her zaman aynıdır.
Küçük / hızlı önbelleklerin neden yararlı / mümkün olduğunu (ve daha büyük önbelleklerle eşleştirildiğinde iyi çalışır) hakkında daha fazla ayrıntı ve L1D'nin neden L2'den daha küçük / daha hızlı olduğu konusundaki cevabımı görün .
Küçük önbellek, daha büyük önbelleklerde çok pahalı olabilecek şeyleri yapabilir; örneğin, veri dizilerini bir kümeden veri alma gibi alır. Böylece bir karşılaştırıcı hangi etiketin eşleştiğini bulduğunda, SRAM'den zaten alınmış olan sekiz adet 64-baytlık önbellek satırlarından birini karıştırması gerekir.
(Gerçekten o kadar basit değil: Sandybridge / Ivybridge, 16 baytlık sekiz bankanın sekiz bankası olan bir bankalı L1D önbellek kullanıyor. Farklı önbellek hatlarındaki iki aynı bankaya erişim aynı döngüde yürütülmeye çalışırsa önbellek çakışması alabilirsiniz. (8 banka var, bu yüzden adreslerin 128 katı, 2 önbellek satırı gibi adresleri olabilir.)
IvyBridge ayrıca 64B önbellek sınırını geçmediği sürece hizalanmamış erişim için bir ceza almaz. Sanırım düşük adres bitlerine dayanarak hangi bankaların alınacağını belirliyor ve doğru 1 ila 16 bayt veri alabilmek için ne gibi bir kayma olacağına karar veriyor.
Önbellek satırlarında hala sadece tek bir kullanıcı arayüzü var, ancak birden fazla önbellek erişimi var. 4k bölme hariç ceza hala küçük. Skylake, 4k'lık bölmeleri bile oldukça ucuz hale getiriyor ve gecikme süresi yaklaşık 11 döngü, karmaşık bir adresleme moduna sahip normal bir önbellek hattıyla aynı. Ancak 4k'lık bölünmüş verim, bölünmemiş bölünmüşlükten belirgin şekilde daha kötüdür.
Kaynaklar :