Her şeyden önce ana bellek erişimi çok pahalıdır. Şu anda 2GHz CPU (bir kez en yavaş) saniyede 2G kenelere (döngü) sahiptir. Bir CPU (günümüzde sanal çekirdek), işaret başına bir kez bir değer alabilir. Sanal çekirdek birden fazla işlem biriminden (ALU - aritmetik mantık birimi, FPU vb.) Oluştuğundan, mümkünse bazı talimatları paralel olarak işleyebilir.
Ana belleğe erişim yaklaşık 70ns ila 100ns arasındadır (DDR4 biraz daha hızlıdır). Bu süre temelde L1, L2 ve L3 önbelleğini arar ve daha sonra belleğe vurur (bellek bankalarına gönderen bellek denetleyicisine komut gönder), yanıtı bekle ve bitti.
100ns yaklaşık 200 keneyi ifade eder. Temel olarak, bir program her bir belleğin eriştiği önbellekleri her zaman özleyecekse, CPU zamanının yaklaşık% 99,5'ini (yalnızca belleği okursa) belleği beklemeden harcayacaktır.
İşleri hızlandırmak için L1, L2, L3 önbellekleri var. Doğrudan çipin üzerine yerleştirilen ve verilen bitleri saklamak için farklı bir transistör devresi kullanan belleği kullanırlar. Bir CPU genellikle daha gelişmiş bir teknoloji kullanılarak üretildiği ve L1, L2, L3 belleğindeki bir üretim arızasının CPU'yu değersiz hale getirme şansına sahip olduğu için bu daha fazla yer, daha fazla enerji ve ana bellekten daha maliyetlidir. büyük L1, L2, L3 önbellekleri, ROI'yi doğrudan azaltan verimi azaltan hata oranını artırır. Dolayısıyla, mevcut önbellek boyutu söz konusu olduğunda büyük bir değişim var.
(şu anda gerçek üretim kusurunun önbellek alanları CPU hatasını bir bütün olarak ortaya koyma olasılığını azaltmak için belirli bölümleri devre dışı bırakabilmek için daha fazla L1, L2, L3 önbellek oluşturur).
Bir zamanlama fikri vermek için (kaynak: önbelleklere ve belleğe erişim maliyetleri )
- L1 önbellek: 1ns - 2ns (2-4 döngü)
- L2 önbellek: 3ns - 5ns (6-10 döngü)
- L3 önbellek: 12ns - 20ns (24-40 döngü)
- RAM: 60ns (120 döngü)
Farklı CPU türlerini karıştırdığımız için bunlar sadece tahminlerdir, ancak bir bellek değeri getirildiğinde gerçekten neler olduğunu iyi bir fikir verir ve belirli önbellek katmanında bir isabet veya özlem olabilir.
Bu nedenle önbellek temel olarak bellek erişimini büyük ölçüde hızlandırır (60ns ve 1ns).
Bir değeri getirmek, tekrar okuma şansı için önbellekte saklamak, genellikle erişilen değişkenler için iyidir, ancak bellek kopyalama işlemleri için, bir değer okuduğu, değeri bir yere yazdığı ve değeri asla okumadığı için hala yavaş olacaktır. tekrar ... hiçbir önbellek isabet, ölü yavaş (bunun yanında paralel olarak olabilir çünkü biz sıra dışı yürütme var).
Bu bellek kopyası o kadar önemlidir ki, onu hızlandırmak için farklı yollar vardır. İlk günlerde bellek genellikle CPU dışında bellek kopyalayabiliyordu. Bellek denetleyicisi tarafından doğrudan işlendi, bu nedenle bellek kopyalama işlemi önbellekleri kirletmedi.
Ancak, düz bir bellek kopyasının yanı sıra, belleğin diğer seri erişimi de oldukça yaygındı. Bir örnek, bir dizi bilgiyi analiz etmektir. Bir tamsayı dizisine sahip olmak ve toplamı, ortalama, ortalama veya daha basit bir değeri belirli bir değeri (filtre / arama) hesaplamak, her zaman herhangi bir genel amaçlı CPU'da çalışan çok önemli bir algoritma sınıfıdır.
Bu nedenle, bellek erişim paternini analiz ederek verilerin sıralı olarak çok sık okunduğu anlaşıldı. Bir program indeks i'deki değeri okursa, programın i + 1 değerini de okuyabilme olasılığı yüksektir. Bu olasılık, aynı programın i + 2 değerini de okuma olasılığından biraz daha yüksektir.
Bu nedenle, bir bellek adresi verildiğinde, önceden okumak ve ek değerler getirmek iyi bir fikirdi (ve hala da öyle). Güçlendirme modunun olmasının nedeni budur.
Güçlendirme modunda bellek erişimi, bir adresin gönderildiği ve birden çok değerin sıralı olarak gönderildiği anlamına gelir. Her ek değer gönderimi yalnızca yaklaşık 10ns (hatta daha düşük) sürer.
Başka bir sorun da adresti. Adres göndermek zaman alır. Belleğin büyük bir bölümünü ele almak için büyük adresler gönderilmelidir. İlk günlerde, adres veri yolunun adresi tek bir döngüde (kene) gönderecek kadar büyük olmadığı ve adresi daha fazla gecikme ekleyerek göndermek için birden fazla döngü gerektiği anlamına geliyordu.
Örneğin 64 baytlık bir önbellek satırı, belleğin 64 bayt büyüklüğünde farklı (çakışmayan) bellek bloklarına bölündüğü anlamına gelir. 64bayt, her bloğun başlangıç adresinin her zaman sıfır olmak üzere en düşük altı adres bitine sahip olduğu anlamına gelir. Bu nedenle, bu altı sıfır biti her seferinde göndermek gerekli değildir, böylece herhangi bir sayıda adres veriyolu genişliği için adres alanını 64 kat arttırır (hoş geldiniz efekti).
Önbellek satırının çözdüğü bir diğer sorun (ileri okuma ve adres veriyoluna altı bit kaydetme / boşaltma yanında) önbelleğin düzenlenme biçimidir. Örneğin, bir önbellek 8 baytlık (64 bit) bloklara (hücrelere) bölünürse, bu önbellek hücresinin değeri ile birlikte bellek hücresinin adresini saklaması gerekir. Adres 64 bit ise, bu önbellek boyutunun yarısının% 100 ek yük ile sonuçlanan adres tarafından tüketildiği anlamına gelir.
Bir önbellek satırı 64bayt olduğundan ve bir CPU 64bit - 6bit = 58bit (sıfır bitlerini çok doğru depolamaya gerek yok) kullanabileceğinden, 64bit veya 512 bit'i 58bit (% 11 ek yük) ile önbelleğe alabileceğimiz anlamına gelir. Gerçekte saklanan adresler bundan daha küçüktür, ancak durum bilgileri vardır (önbellek satırı geçerli ve doğru, kirli ve ram'de geri yazılması gerekir gibi).
Başka bir yönü de set-ilişkisel önbellek var. Her önbellek hücresi belirli bir adresi değil, yalnızca bir alt kümesini saklayabilir. Bu, gerekli saklanan adres bitlerini daha da küçük yapar, önbelleğe paralel erişime izin verir (her alt kümeye bir kez erişilebilir, ancak diğer alt kümelerden bağımsız olarak).
Özellikle, farklı sanal çekirdekler, çekirdek başına bağımsız çoklu işlem birimleri ve son olarak bir anakartta (48 işlemci ve daha fazlası içeren kartlar içeren) birden fazla işlemci arasında önbellek / bellek erişimini senkronize etmek söz konusu olduğunda daha çok şey var.
Temelde neden önbellek hatlarımız olduğuna dair şu anki fikir budur. Ön okumadan elde edilen yarar çok yüksektir ve önbellek satırından tek bir bayt okumanın en kötü durumu ve geri kalanını bir daha asla okumama olasılığı çok incedir.
Önbellek satırının boyutu (64), daha büyük önbellek satırları arasında seçilen akıllıca bir ödünleşmedir ve son baytının yakın gelecekte de okunması, tüm önbellek satırının alınması için gereken süre bellekten (ve geri yazmak için) ve ayrıca önbellek organizasyonundaki ek yük ve önbellek ve bellek erişiminin paralelleştirilmesi.