Veri ve talimatlar için neden ayrı L1 önbellekleri var?


Yanıtlar:


28

Aslında birkaç neden var.

Öncelikle ve muhtemelen en önemlisi, talimat önbelleğinde depolanan veriler genellikle veri önbelleğinde depolanandan biraz farklıdır - talimatların kendileri ile birlikte, bir sonraki talimatın başladığı yerler için kod çözücülere yardımcı olmak için ek açıklamalar vardır. Bazı işlemciler (örneğin, Netburst, bazı SPARC'lar), orijinal talimatı kodlanmış biçiminde saklamak yerine, bir talimatın kodunun çözülmesinin sonucunu saklayan bir "iz önbelleği" kullanır.

İkincisi, devreyi biraz basitleştirir - veri önbelleğinin okuma ve yazma işlemleriyle ilgilenmesi gerekir, ancak komut önbelleği yalnızca okuma ile ilgilidir. (Bu, kod değiştirmenin neden bu kadar pahalı olduğunun bir parçasıdır - talimat önbelleğindeki verilerin üzerine doğrudan yazmak yerine, yazma işlemi veri önbelleğindeki L2 önbelleğine gider ve daha sonra önbellekteki satır geçersiz olur ve yeniden L2'den yüklendi).

Üçüncüsü, bant genişliğini arttırır: çoğu modern işlemci, komut önbelleğindeki ve veri önbelleğindeki verileri aynı anda okuyabilir. Birçoğunun önbelleğe "girişinde" sıraları da vardır, bu nedenle herhangi bir döngüde iki okuma ve bir yazma yapabilirler.

Dördüncü olarak, güç tasarrufu sağlayabilir. İçeriklerini korumak için bellek hücrelerinin kendi güçlerini korumanız gerekirken, bazı işlemciler kullanılmadıkları zaman ilişkili devrelerin bir kısmını (kod çözücüler vb.) Kapatıp açabilirler. Ayrı önbelleklerle, bu devreleri talimatlar ve veriler için ayrı ayrı açabilirler, herhangi bir döngüde güçsüz kalma şansını artırabilirler (x86 işlemcilerin bunu yaptığından emin değilim - AFAIK, daha çok ARM şey).


3
Kodun ve verilerin farklı erişim düzenleri gösterebileceğini belirtmek de önemlidir; örneğin, bir dizideki tüm elemanları toplama talimatları geçici konum sergiler (aynı talimatlar sık ​​sık kullanılır (bunu bir döngü ile yaparsanız)) ve dizideki veriler uzaysal konum sergiler (aşağıdaki veriler kullanılır).
gablin

1
@gablin: Doğru olsa da, kalıplardaki bu farklılıklar çoğu zaman birleşik bir önbellek tercih eder. Bahsettiğiniz gibi sıkı bir döngüde , talimat önbelleğinin çoğu boşta oturuyor. Birleştirilmiş bir önbellek, döngü süresince veri önbelleğinin boyutunu temelde iki katına çıkarır.
Jerry Coffin,

Gerçekten değil, çünkü bu küçük döngüden sonra daha fazla kod var ve bu da diziyle birlikte çalışıyor olabilir. Bu çok fazla sayıda kodu (örneğin, string işleme) karakterize eder. Aslında, CPU'lardaki ilk önbellekler birleştirilmiş önbelleklerdi - CPU'ların ana bellek arabirimi ile onları koymak için basit bir yer olan harici veri yolu arasına oturdular - ancak şimdi bölümlenmiş bir önbellek kullanıyoruz çünkü pratikte daha hızlı .
Donal Fellows,

@ Donal Fellows: Evet, gerçekten. Önbelleğin ne kadar erken yapıldığını ve neden bölünmüş bir önbellek yaptıklarını çok iyi biliyorum.
Jerry Coffin,

5

Emlak gibi, önbellek kullanımı da üç şey tarafından yönlendirilir: konum, konum, konum. Bir önbelleğe sahip olmanın asıl amacı çoğu programın konum modellerini göstermesidir: 1111111 baytına erişirlerse, bir sonraki bayt erişecekleri muhtemelen 1111110 veya 1111112 olur ve 9999999 çok fazla bayt olmaz. Ancak, çoğu program çok farklı sergiler talimatları ve verileri için konum örnekleri. Bu, talimatların ve verilerin önbelleği verimli bir şekilde paylaşabilmelerinin olası olmadığı anlamına gelir. Çünkü talimatlar ve veriler mutlaka bellekte birbirine yakın değildir. Bir veri erişimi önbellekten gelen talimatlara çarpacak ve yükleme yönergeleri önbellekteki verileri de çarpacak.

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.