Önbellek, talep edilmesi en muhtemel bilgileri içeren, hızlı erişimli bir ara ara bellektir. Önbellekteki verilere erişim, orijinal verileri operasyonel bellekten (RAM) almaktan ve harici bellekten (sabit sürücü veya yarıiletken sürücü) almaktan daha hızlıdır, böylece ortalama erişim süresi azalır ve bilgisayar sisteminin genel performansı artar.

Kayıtlardan daha yavaş olan rastgele erişim belleğine (RAM) erişimi en aza indirmek için bazı merkezi işlem birimi (CPU) modellerinin kendi önbellekleri vardır. Önbellek, RAM saat hızı CPU saat hızından önemli ölçüde düşük olduğunda önemli performans avantajları sağlayabilir. Önbellek için saat hızı genellikle CPU hızından çok daha az değildir.

Önbellek düzeyleri

CPU önbelleği çeşitli düzeylere bölünmüştür. Günümüzde genel amaçlı bir işlemcide düzey sayısı 3'e kadar çıkabilir. Düzey N+1 önbellek genellikle boyut olarak daha büyüktür ve erişim hızı ve veri aktarımı açısından düzey N önbelleğe göre daha yavaştır.

En hızlı bellek, birinci düzey önbellektir - L1 önbelleği. Aslında işlemcinin ayrılmaz bir parçasıdır çünkü aynı çip üzerinde bulunur ve fonksiyonel blokların bir parçasıdır. Modern işlemcilerde, L1 önbelleği genellikle talimat önbelleği ve veri önbelleği (Harvard mimarisi) olmak üzere iki önbelleğe ayrılır. L1 önbelleği olmayan çoğu işlemci çalışamaz. L1 önbelleği işlemci frekansında çalışır ve genel olarak her saat döngüsünde erişilebilir. Çoğu zaman birden fazla okuma/yazma işlemini aynı anda gerçekleştirmek mümkündür. Erişim gecikmesi genellikle 2-4 çekirdek saat döngüsüdür. Birim genellikle küçüktür - 384 KB'den fazla değildir.

İkinci en hızlısı L2 önbelleğidir - genellikle L1 gibi çip üzerinde bulunan ikinci düzey bir önbellek. Eski işlemcilerde anakart üzerinde bir dizi çip bulunur. L2 önbellek hacmi 128 KB'tan 1?12 MB'a çıkarıldı. Modern çok çekirdekli işlemcilerde, aynı yonga üzerinde bulunan ikinci düzey önbellek ayrı bir bellektir - toplam önbellek boyutu nM MB'dir, her çekirdek nM/nC MB'ye sahiptir; burada nC, işlemci çekirdeklerinin sayısıdır. Tipik olarak, çekirdek çip üzerinde bulunan L2 önbelleğinin gecikmesi 8 ila 20 çekirdek saat döngüsü arasındadır.

Üçüncü düzey önbellek en az hızlı olanıdır, ancak boyutu çok etkileyici olabilir - 24 MB'tan fazla. L3 önbellek önceki önbelleklerden daha yavaştır ancak yine de RAM'den önemli ölçüde daha hızlıdır. Çok işlemcili sistemlerde ortak kullanımdadır ve farklı L2'lerden gelen verileri senkronize etmek için tasarlanmıştır.

Bazen 4. seviye bir önbellek de bulunur, genellikle ayrı bir çipte bulunur. Düzey 4 önbelleğin kullanımı yalnızca yüksek performanslı sunucular ve ana bilgisayarlar için uygundur.

Farklı önbellekler (hem bir hem de birden çok işlemci) arasındaki senkronizasyon sorunu, önbellek tutarlılığı ile çözülür. Farklı düzeylerdeki önbellekler veya dedikleri gibi önbellek mimarileri arasında bilgi alışverişi için üç seçenek vardır: kapsayıcı, özel ve özel olmayan.

AMD işlemciler için L3 önbellek ne kadar önemlidir?

Aslında çok çekirdekli işlemcileri, mevcut tüm çekirdekler tarafından paylaşılacak özel bellekle donatmak mantıklıdır. Bu rolde, hızlı bir üçüncü düzey (L3) önbellek, en sık talep edilen verilere erişimi önemli ölçüde hızlandırabilir. Böylece çekirdeklerin mümkünse yavaş ana belleğe (RAM) erişmesi gerekmeyecek.

En azından teoride. Son zamanlarda AMD Athlon II X4 işlemcisini duyurdu L3 önbelleği olmayan bir Phenom II X4 modeli olan bu özellik, bunun o kadar da gerekli olmadığını ima ediyor. Önbelleğin performansı nasıl etkilediğini test etmek için iki işlemciyi (L3 önbellekli ve L3 önbelleksiz) doğrudan karşılaştırmaya karar verdik.

Büyütmek için resmin üzerine tıklayın.

Önbellek nasıl çalışır?

Testlere geçmeden önce bazı temel hususları anlamak önemlidir. Önbelleğin çalışma prensibi oldukça basittir. Önbellek, CPU isteklerini daha uzak ve yavaş belleğe azaltmak için verileri işlemcinin işlem çekirdeklerine mümkün olduğunca yakın arabelleğe alır. Modern masaüstü platformlarında önbellek hiyerarşisi, RAM'e erişimden önce gelen üç seviyeye kadar içerir. Ayrıca, ikinci ve özellikle üçüncü seviyelerin önbellekleri yalnızca verileri tamponlamakla kalmaz. Amaçları, çekirdeklerin bilgi alışverişi yapması gerektiğinde işlemci veri yolunun aşırı yüklenmesini önlemektir.

İsabetler ve özlüyor

Önbellek mimarilerinin etkinliği isabet oranıyla ölçülür. Önbellek tarafından karşılanabilecek veri istekleri isabet olarak kabul edilir. Bu önbellek gerekli verileri içermiyorsa, istek bellek hattı boyunca iletilir ve bir kayıp sayılır. Tabii ki, gözden kaçırılanlar bilgi edinmek için daha fazla zamana ihtiyaç duyulmasına yol açar. Sonuç olarak, bilgi işlem hattında "kabarcıklar" (boşta kalma) ve gecikmeler ortaya çıkıyor. İsabetler ise tam tersine maksimum performansı korumanıza olanak tanır.

Önbellek girişi, ayrıcalık, tutarlılık

Değiştirme politikaları, yeni girişler için önbellekte nasıl yer açılacağını belirler. Önbelleğe yazılan verilerin eninde sonunda ana bellekte görünmesi gerektiğinden, sistemler bunu önbelleğe yazarken (yazma) aynı anda yapabilir veya veri alanlarını "kirli" (geri yazma) olarak işaretleyip ön belleğe yazabilir. bellek önbellekten çıkarıldığında.

Çeşitli önbellek seviyelerindeki veriler, artıklık olmaksızın özel olarak depolanabilir. O zaman aynı veri satırlarını iki farklı önbellek hiyerarşisinde bulamazsınız. Veya önbellekler kapsamlı bir şekilde çalışabilir; yani, daha düşük önbellek düzeylerinin, üst önbellek düzeylerinde (işlemci çekirdeğine daha yakın) bulunan verileri içermesi garanti edilir. AMD Phenom özel bir L3 önbellek kullanırken Intel kapsayıcı bir önbellek stratejisi izliyor. Tutarlılık protokolleri, farklı çekirdekler, önbellek düzeyleri ve hatta işlemciler arasındaki verilerin bütünlüğünü ve güncelliğini sağlar.

Önbellek boyutu

Daha büyük bir önbellek daha fazla veri tutabilir ancak gecikmeyi artırma eğilimindedir. Ek olarak, büyük bir önbellek önemli sayıda işlemci transistörü tüketir; dolayısıyla transistör bütçesi, kalıp boyutu, güç tüketimi ve performans/gecikme arasında bir denge bulmak önemlidir.

çağrışımsallık

RAM'deki girişler doğrudan önbelleğe eşlenebilir, yani RAM'den veri kopyası için yalnızca bir önbellek konumu vardır veya bunlar n-yollu ilişkisel olabilir, yani önbellekte bu işlemin gerçekleştirileceği n olası konum vardır. veriler saklanabilir. Daha yüksek derecede ilişkilendirilebilirlik (tamamen ilişkisel önbelleklere kadar), önbellekteki mevcut verilerin yeniden yazılmasına gerek olmadığından daha fazla önbelleğe alma esnekliği sağlar. Başka bir deyişle, yüksek n dereceli bir ilişkisellik, daha yüksek bir isabet oranını garanti eder, ancak aynı zamanda gecikmeyi de artırır çünkü bir isabet için tüm bu ilişkileri kontrol etmek daha fazla zaman alır. Tipik olarak, maksimum kapasite burada mevcut olduğundan ve bu önbellek dışında veri aramak, işlemcinin yavaş RAM'e erişmesine neden olacağından, en yüksek ilişkilendirme derecesi son önbellekleme düzeyi için makuldür.

İşte bazı örnekler: Core i5 ve i7, veriler için 8 yönlü ilişkilendirilebilirliğe sahip 32 KB L1 önbellek ve talimatlar için 4 yönlü ilişkilendirilebilirliğe sahip 32 KB L1 önbellek kullanır. Intel'in talimatların daha hızlı sunulmasını ve L1 veri önbelleğinin maksimum isabet oranına sahip olmasını istemesi anlaşılabilir bir durumdur. Intel işlemcilerdeki L2 önbellek 8 yönlü ilişkiselliğe sahiptir ve Intel L3 önbellek, isabetleri en üst düzeye çıkarmak için 16 yönlü ilişkisellik uyguladığından daha da akıllıdır.

Ancak AMD, gecikmeyi azaltmak için 2 yollu ilişkisel L1 önbellek kullanan Phenom II X4 işlemcilerde farklı bir strateji izliyor. Olası hataları telafi etmek için önbellek kapasitesi iki katına çıkarıldı: veriler için 64 KB ve talimatlar için 64 KB. L2 önbelleği, Intel tasarımı gibi 8 yollu ilişkiselliğe sahiptir, ancak AMD'nin L3 önbelleği 48 yollu ilişkisellikle çalışır. Ancak bir önbellek mimarisini diğerine tercih etme kararı, CPU mimarisinin tamamı dikkate alınmadan değerlendirilemez. Test sonuçlarının pratik öneme sahip olması oldukça doğaldır ve amacımız tam olarak bu karmaşık, çok seviyeli önbellekleme yapısının tamamının pratik bir testiydi.

Her modern işlemcinin, işlemci talimatlarını ve verilerini neredeyse anında kullanıma hazır şekilde saklayan özel bir önbelleği vardır. Bu düzeye genellikle Düzey 1 veya L1 önbellek adı verilir ve ilk olarak 486DX işlemcilerde kullanılmaya başlanmıştır. Son zamanlarda, AMD işlemcileri çekirdek başına 64 KB L1 önbellek (veri ve talimatlar için) ile standart hale geldi ve Intel işlemciler çekirdek başına 32 KB L1 önbellek (ayrıca veri ve talimatlar için) kullanıyor

L1 önbellek ilk olarak 486DX işlemcilerde ortaya çıktı ve daha sonra tüm modern CPU'ların ayrılmaz bir özelliği haline geldi.

Pentium III'ün piyasaya sürülmesinden sonra tüm işlemcilerde ikinci düzey önbellek (L2) ortaya çıktı, ancak bunun ambalaj üzerindeki ilk uygulamaları Pentium Pro işlemcideydi (ancak çip üzerinde değil). Modern işlemciler 6 MB'a kadar çip üzerinde L2 önbellekle donatılmıştır. Kural olarak bu hacim, örneğin Intel Core 2 Duo işlemcideki iki çekirdek arasında bölünür. Tipik L2 yapılandırmaları çekirdek başına 512 KB veya 1 MB önbellek sağlar. Daha küçük L2 önbelleğe sahip işlemciler daha düşük fiyat seviyesinde olma eğilimindedir. Aşağıda erken L2 önbellek uygulamalarının bir diyagramı bulunmaktadır.

Pentium Pro'nun işlemci paketinde L2 önbelleği vardı. Sonraki nesil Pentium III ve Athlon'da L2 önbelleği, o zamanlar çok yaygın olan ayrı SRAM yongaları aracılığıyla uygulandı (1998, 1999).

Daha sonra 180 nm'ye kadar işlem teknolojisinin duyurulması, üreticilerin nihayet L2 önbelleğini işlemci kalıbına entegre etmelerine olanak tanıdı.


İlk çift çekirdekli işlemciler, paket başına iki kalıp içeren mevcut tasarımları kullanıyordu. AMD, monolitik bir çip üzerinde çift çekirdekli işlemciyi tanıttı, bir bellek denetleyicisi ve bir anahtar ekledi ve Intel, ilk çift çekirdekli işlemcisi için iki tek çekirdekli çipi tek bir pakette bir araya getirdi.


İlk kez L2 önbelleği, Core 2 Duo işlemcilerdeki iki bilgi işlem çekirdeği arasında paylaşılmaya başlandı. AMD daha da ileri giderek ilk dört çekirdekli Phenom'unu sıfırdan yarattı ve Intel, maliyetleri azaltmak amacıyla ilk dört çekirdekli işlemcisi için yine bir çift kalıp, bu sefer iki adet çift çekirdekli Core 2 kalıp kullandı.

Üçüncü düzey önbellek, Alpha 21165 işlemcinin (96 KB, 1995'te tanıtılan işlemciler) veya IBM Power 4'ün (256 KB, 2001) ilk günlerinden beri mevcuttur. Ancak x86 tabanlı mimarilerde L3 önbellek ilk olarak Intel Itanium 2, Pentium 4 Extreme (Gallatin, her ikisi de 2003'te işlemci) ve Xeon MP (2006) modelleriyle ortaya çıktı.

Her ne kadar modern mimariler çok çekirdekli işlemcilerde çekirdekler arası veri aktarımı için L3 önbelleğini büyük, paylaşılan bir arabellek olarak kullansa da, ilk uygulamalar önbellek hiyerarşisinde başka bir düzey sağladı. Bu, yüksek n dereceli ilişkisellik ile vurgulanmaktadır. Birkaç çekirdeğin ana RAM'e çok yavaş erişim kullandığı bir durumla karşılaşmaktansa, önbellekte verileri biraz daha uzun süre aramak daha iyidir. AMD, L3 önbelleğini ilk kez daha önce bahsedilen Phenom serisiyle bir masaüstü işlemcide tanıttı. 65 nm Phenom X4, 2 MB paylaşımlı L3 önbellek içeriyordu ve modern 45 nm Phenom II X4'te zaten 6 MB paylaşımlı L3 önbellek bulunuyor. Intel Core i7 ve i5 işlemciler 8 MB L3 önbellek kullanır.

Modern dört çekirdekli işlemciler, her çekirdek için özel L1 ve L2 önbelleklerinin yanı sıra tüm çekirdekler tarafından paylaşılan büyük bir L3 önbelleğe sahiptir. Paylaşılan L3 önbellek aynı zamanda çekirdeklerin paralel olarak üzerinde çalışabileceği veri alışverişine de olanak tanıyor.


AMD işlemciler için L3 önbellek ne kadar önemlidir?

Aslında çok çekirdekli işlemcileri, mevcut tüm çekirdekler tarafından paylaşılacak özel bellekle donatmak mantıklıdır. Bu rolde, hızlı bir üçüncü düzey (L3) önbellek, en sık talep edilen verilere erişimi önemli ölçüde hızlandırabilir. Böylece çekirdeklerin mümkünse yavaş ana belleğe (RAM) erişmesi gerekmeyecek.

En azından teoride. AMD yakın zamanda Phenom II X4'ün L3 önbelleği olmayan bir modeli olan Athlon II X4 işlemcisini duyurdu ve bunun o kadar da gerekli olmadığının sinyalini verdi. Önbelleğin performansı nasıl etkilediğini test etmek için iki işlemciyi (L3 önbellekli ve L3 önbelleksiz) doğrudan karşılaştırmaya karar verdik.

Önbellek nasıl çalışır?

Testlere geçmeden önce bazı temel hususları anlamak önemlidir. Önbelleğin çalışma prensibi oldukça basittir. Önbellek, CPU isteklerini daha uzak ve yavaş belleğe azaltmak için verileri işlemcinin işlem çekirdeklerine mümkün olduğunca yakın arabelleğe alır. Modern masaüstü platformlarında önbellek hiyerarşisi, RAM'e erişimden önce gelen üç seviyeye kadar içerir. Ayrıca, ikinci ve özellikle üçüncü seviyelerin önbellekleri yalnızca verileri tamponlamakla kalmaz. Amaçları, çekirdeklerin bilgi alışverişi yapması gerektiğinde işlemci veri yolunun aşırı yüklenmesini önlemektir.

İsabetler ve özlüyor

Önbellek mimarilerinin etkinliği isabet oranıyla ölçülür. Önbellek tarafından karşılanabilecek veri istekleri isabet olarak kabul edilir. Bu önbellek gerekli verileri içermiyorsa, istek bellek hattı boyunca iletilir ve bir kayıp sayılır. Tabii ki, gözden kaçırılanlar bilgi edinmek için daha fazla zamana ihtiyaç duyulmasına yol açar. Sonuç olarak, bilgi işlem hattında "kabarcıklar" (boşta kalma) ve gecikmeler ortaya çıkıyor. İsabetler ise tam tersine maksimum performansı korumanıza olanak tanır.

Önbellek girişi, ayrıcalık, tutarlılık

Değiştirme politikaları, yeni girişler için önbellekte nasıl yer açılacağını belirler. Önbelleğe yazılan verilerin eninde sonunda ana bellekte görünmesi gerektiğinden, sistemler bunu önbelleğe yazarken (yazma) aynı anda yapabilir veya veri alanlarını "kirli" (geri yazma) olarak işaretleyip ön belleğe yazabilir. bellek önbellekten çıkarıldığında.

Çeşitli önbellek seviyelerindeki veriler, artıklık olmaksızın özel olarak depolanabilir. O zaman aynı veri satırlarını iki farklı önbellek hiyerarşisinde bulamazsınız. Veya önbellekler kapsamlı bir şekilde çalışabilir; yani, daha düşük önbellek düzeylerinin, üst önbellek düzeylerinde (işlemci çekirdeğine daha yakın) bulunan verileri içermesi garanti edilir. AMD Phenom özel bir L3 önbellek kullanırken Intel kapsayıcı bir önbellek stratejisi izliyor. Tutarlılık protokolleri, farklı çekirdekler, önbellek düzeyleri ve hatta işlemciler arasındaki verilerin bütünlüğünü ve güncelliğini sağlar.

Önbellek boyutu

Daha büyük bir önbellek daha fazla veri tutabilir ancak gecikmeyi artırma eğilimindedir. Ek olarak, büyük bir önbellek önemli sayıda işlemci transistörü tüketir; dolayısıyla transistör bütçesi, kalıp boyutu, güç tüketimi ve performans/gecikme arasında bir denge bulmak önemlidir.

çağrışımsallık

RAM'deki girişler doğrudan önbelleğe eşlenebilir, yani RAM'den veri kopyası için yalnızca bir önbellek konumu vardır veya bunlar n-yollu ilişkisel olabilir, yani önbellekte bu işlemin gerçekleştirileceği n olası konum vardır. veriler saklanabilir. Daha yüksek derecede ilişkilendirilebilirlik (tamamen ilişkisel önbelleklere kadar), önbellekteki mevcut verilerin yeniden yazılmasına gerek olmadığından daha fazla önbelleğe alma esnekliği sağlar. Başka bir deyişle, yüksek n dereceli bir ilişkisellik, daha yüksek bir isabet oranını garanti eder, ancak aynı zamanda gecikmeyi de artırır çünkü bir isabet için tüm bu ilişkileri kontrol etmek daha fazla zaman alır. Tipik olarak, maksimum kapasite burada mevcut olduğundan ve bu önbellek dışında veri aramak, işlemcinin yavaş RAM'e erişmesine neden olacağından, en yüksek ilişkilendirme derecesi son önbellekleme düzeyi için makuldür.

İşte bazı örnekler: Core i5 ve i7, veriler için 8 yönlü ilişkilendirilebilirliğe sahip 32 KB L1 önbellek ve talimatlar için 4 yönlü ilişkilendirilebilirliğe sahip 32 KB L1 önbellek kullanır. Intel'in talimatların daha hızlı sunulmasını ve L1 veri önbelleğinin maksimum isabet oranına sahip olmasını istemesi anlaşılabilir bir durumdur. Intel işlemcilerdeki L2 önbellek 8 yönlü ilişkiselliğe sahiptir ve Intel L3 önbellek, isabetleri en üst düzeye çıkarmak için 16 yönlü ilişkisellik uyguladığından daha da akıllıdır.

Ancak AMD, gecikmeyi azaltmak için 2 yollu ilişkisel L1 önbellek kullanan Phenom II X4 işlemcilerde farklı bir strateji izliyor. Olası hataları telafi etmek için önbellek kapasitesi iki katına çıkarıldı: veriler için 64 KB ve talimatlar için 64 KB. L2 önbelleği, Intel tasarımı gibi 8 yollu ilişkiselliğe sahiptir, ancak AMD'nin L3 önbelleği 48 yollu ilişkisellikle çalışır. Ancak bir önbellek mimarisini diğerine tercih etme kararı, CPU mimarisinin tamamı dikkate alınmadan değerlendirilemez. Test sonuçlarının pratik öneme sahip olması oldukça doğaldır ve amacımız tam olarak bu karmaşık, çok seviyeli önbellekleme yapısının tamamının pratik bir testiydi.

Neredeyse tüm geliştiriciler, işlemci önbelleğinin, yakın zamanda ziyaret edilen bellek alanlarından verileri depolayan küçük ama hızlı bir bellek olduğunu biliyor - tanım kısa ve oldukça doğru. Ancak önbellek mekanizmalarıyla ilgili sıkıcı detayları bilmek, kod performansını etkileyen faktörleri anlamak için gereklidir.

Bu makalede, önbelleklerin çeşitli özelliklerini ve bunların performans üzerindeki etkisini gösteren birkaç örneğe bakacağız. Örnekler C# dilinde olacaktır; dil ve platform seçimi performans değerlendirmesini ve nihai sonuçları büyük ölçüde etkilemez. Doğal olarak makul sınırlar dahilinde, bir diziden değer okumanın karma tablosuna erişmeye eşdeğer olduğu bir dil seçerseniz yorumlanabilir herhangi bir sonuç elde edemezsiniz. Çevirmenin notları italik yazılmıştır.

Habracut - - -

Örnek 1: Bellek Erişimi ve Performansı

İkinci döngünün birinciden ne kadar daha hızlı olduğunu düşünüyorsunuz?
int arr = yeni int;

// Birinci
for (int i = 0; i< arr.Length; i++) arr[i] *= 3;

// ikinci
for (int i = 0; i< arr.Length; i += 16) arr[i] *= 3;


İlk döngü dizideki tüm değerleri 3 ile çarpar, ikinci döngü ise yalnızca her on altıncı değeri çarpar. İkinci döngü ancak tamamlanır %6 iş ilk döngü, ancak modern makinelerde her iki döngü de yaklaşık olarak eşit sürede gerçekleştirilir: 80 ms Ve 78 ms sırasıyla (makinemde).

Çözüm basit; belleğe erişim. Bu döngülerin hızı, tamsayı çarpımının hızına göre değil, öncelikle bellek alt sisteminin hızına göre belirlenir. Bir sonraki örnekte göreceğimiz gibi, RAM'e erişim sayısı hem birinci hem de ikinci durumda aynıdır.

Örnek 2: Önbellek Hatlarının Etkisi

Daha derine inelim ve yalnızca 1 ve 16'yı değil diğer adım değerlerini deneyelim:
for (int i = 0; i< arr.Length; i += K /* шаг */ ) arr[i] *= 3;

Farklı adım değerleri K için bu döngünün çalışma süreleri şöyledir:

Lütfen 1'den 16'ya kadar olan adım değerlerinde çalışma süresinin neredeyse hiç değişmediğini unutmayın. Ancak 16'dan büyük değerlerde, adımı her ikiye katladığımızda çalışma süresi yaklaşık yarı yarıya azalır. Bu, döngünün bir şekilde sihirli bir şekilde daha hızlı çalışmaya başladığı anlamına gelmez, yalnızca yinelemelerin sayısı da azalır. Anahtar nokta, 1'den 16'ya kadar olan adım değerleri ile aynı çalışma süresidir.

Bunun nedeni, modern işlemcilerin belleğe tek seferde tek bayt olarak değil, önbellek hatları adı verilen küçük bloklar halinde erişmesidir. Tipik olarak dize boyutu 64 bayttır. Bellekten herhangi bir değeri okuduğunuzda en az bir önbellek satırı önbelleğe girer. Bu satırdan herhangi bir değere daha sonra erişim çok hızlıdır.

16 int değeri 64 byte yer kapladığından, 1'den 16'ya kadar olan adımlarla döngüler aynı sayıda önbellek satırına, daha doğrusu dizinin tüm önbellek satırlarına erişir. Adım 32'de her ikinci satıra, adım 64'te ise her dördüncü satıra erişim gerçekleşir.

Bunu anlamak bazı optimizasyon teknikleri için çok önemlidir. Erişim sayısı, verilerin bellekteki konumuna bağlıdır. Örneğin, hizalanmamış veriler ana belleğe bir yerine iki erişim gerektirebilir. Yukarıda öğrendiğimiz gibi çalışma hızı iki kat daha düşük olacaktır.

Örnek 3: Düzey 1 ve 2 önbellek boyutları (L1 ve L2)

Modern işlemciler genellikle L1, L2 ve L3 olarak adlandırılan iki veya üç düzeyde önbelleğe sahiptir. Farklı düzeylerdeki önbelleklerin boyutlarını bulmak için CoreInfo yardımcı programını veya Windows API işlevi GetLogicalProcessorInfo'yu kullanabilirsiniz. Her iki yöntem de her düzey için önbellek satırı boyutu hakkında bilgi sağlar.

Makinemde CoreInfo, 32 KB L1 veri önbelleklerini, 32 KB L1 talimat önbelleklerini ve 4 MB L2 veri önbelleklerini rapor ediyor. Her çekirdeğin kendi kişisel L1 önbellekleri vardır, L2 önbellekleri her çekirdek çifti tarafından paylaşılır:

Mantıksal İşlemciden Önbelleğe Alma Haritası: *--- Veri Önbelleği 0, Düzey 1, 32 KB, Assoc 8, LineSize 64 *--- Talimat Önbelleği 0, Düzey 1, 32 KB, Assoc 8, LineSize 64 -*-- Veri Önbelleği 1, Düzey 1, 32 KB, Assoc 8, LineSize 64 -*-- Talimat Önbelleği 1, Düzey 1, 32 KB, Assoc 8, LineSize 64 **-- Birleşik Önbellek 0, Düzey 2, 4 MB, Assoc 16, LineSize 64 --*- Veri Önbelleği 2, Düzey 1, 32 KB, Assoc 8, LineSize 64 --*- Talimat Önbelleği 2, Düzey 1, 32 KB, Assoc 8, LineSize 64 ---* Veri Önbelleği 3, Düzey 1, 32 KB, Assoc 8, LineSize 64 ---* Talimat Önbelleği 3, Düzey 1, 32 KB, Assoc 8, LineSize 64 --** Birleşik Önbellek 1, Düzey 2, 4 MB, Assoc 16, LineSize 64
Bu bilgiyi deneysel olarak kontrol edelim. Bunu yapmak için, her 16. değeri artırarak dizimizi inceleyelim; her önbellek satırındaki verileri değiştirmenin kolay bir yolu. Sona ulaştığımızda başlangıca dönüyoruz. Farklı dizi boyutlarını kontrol edelim; dizi artık farklı düzeylerdeki önbelleklere sığmadığında performansta bir düşüş görmeliyiz.

Kod:

int adımlar = 64 * 1024 * 1024; // yineleme sayısı
int uzunlukMod = arr.Length - 1; // dizi boyutu -- ikinin kuvveti

for (int i = 0; i< steps; i++)
{
// x &lengthMod = x % arr.Length, çünkü ikinin kuvvetleri
arr[(i * 16) &lengthMod]++;
}


Test sonuçları:

Makinemde 32 KB ve 4 MB'tan sonra performansta gözle görülür düşüşler var - bunlar L1 ve L2 önbelleklerinin boyutlarıdır.

Örnek 4: Talimat Paralelliği

Şimdi başka bir şeye bakalım. Sizce bu iki döngüden hangisi daha hızlı çalışacak?
int adımlar = 256 * 1024 * 1024;
int a = yeni int;

// Birinci
for (int i = 0; i< steps; i++) { a++; a++; }

// ikinci
for (int i = 0; i< steps; i++) { a++; a++; }


İkinci döngünün en azından test ettiğim tüm makinelerde neredeyse iki kat daha hızlı çalıştığı ortaya çıktı. Neden? Çünkü döngülerin içindeki komutların farklı veri bağımlılıkları vardır. İlk komutlar aşağıdaki bağımlılık zincirine sahiptir:

İkinci döngüde bağımlılıklar şunlardır:

Modern işlemcilerin işlevsel parçaları, genellikle çok fazla sayıda olmayan, belirli sayıda belirli işlemi aynı anda gerçekleştirme kapasitesine sahiptir. Örneğin, L1 önbelleğindeki verilere iki adresten paralel erişim mümkündür ve iki basit aritmetik talimatın eşzamanlı yürütülmesi de mümkündür. İlk döngüde işlemci bu yetenekleri kullanamaz ancak ikinci döngüde kullanabilir.

Örnek 5: Önbellek İlişkilendirmesi

Önbellek tasarlarken cevaplanması gereken en önemli sorulardan biri, belirli bir bellek bölgesindeki verilerin herhangi bir önbellek hücresinde mi yoksa yalnızca bazılarında mı saklanabileceğidir. Üç olası çözüm:
  1. Doğrudan Eşleme Önbelleği RAM'deki her önbellek satırının verileri yalnızca önceden tanımlanmış bir önbellek konumunda depolanır. Eşlemeyi hesaplamanın en basit yolu şudur: row_index_in_memory % number_of_cache_cells. Aynı hücreye eşlenen iki satır aynı anda önbellekte bulunamaz.
  2. N girişli kısmi ilişkisel önbellek, her satır N farklı önbellek konumunda saklanabilir. Örneğin, 16 girişli bir önbellekte, grubu oluşturan 16 hücreden birinde bir satır saklanabilir. Tipik olarak, eşit en az anlamlı endeks bitlerine sahip satırlar bir grubu paylaşır.
  3. Tamamen ilişkisel önbellek, herhangi bir satır herhangi bir önbellek konumunda saklanabilir. Çözüm, davranışı açısından karma tabloya eşdeğerdir.
Doğrudan eşlemeli önbellekler çekişmeye açıktır; örneğin, iki satır aynı hücre için rekabet ettiğinde ve dönüşümlü olarak birbirini önbellekten çıkardığında verimlilik çok düşüktür. Öte yandan, tamamen ilişkisel önbellekler bu dezavantaja sahip olmamasına rağmen uygulanması çok karmaşık ve pahalıdır. Kısmen ilişkisel önbellekler, uygulama karmaşıklığı ile verimlilik arasındaki tipik bir dengedir.

Örneğin, makinemdeki 4 MB L2 önbellek, 16 girişli kısmi ilişkisel bir önbellektir. RAM'in tamamı, endekslerinin en az önemli bitlerine göre satır kümelerine bölünür; her kümedeki çizgiler, 16 L2 önbellek hücresinden oluşan bir grup için rekabet eder.

L2 önbelleğinde 65.536 hücre (4*2 20/64) olduğundan ve her grup 16 hücreden oluştuğundan toplam 4.096 grubumuz olur. Böylece satır indeksinin alt 12 biti bu satırın hangi gruba ait olduğunu belirler (2 12 = 4,096). Sonuç olarak, adresleri 262.144'ün (4.096 * 64) katı olan satırlar, aynı 16 hücrelik grubu paylaşır ve içinde yer kapmak için rekabet eder.

İlişkiselliğin etkilerinin etkili olması için, örneğin aşağıdaki kodu kullanarak aynı gruptan çok sayıda satıra sürekli olarak erişmemiz gerekir:

genel statik uzun UpdateEveryKthByte(byte arr, int K)
{
const int rep = 1024 * 1024; // yineleme sayısı

Kronometre sw = Stopwatch.StartNew();

int p = 0;
for (int i = 0; i< rep; i++)
{
dizi[p]++;

P += K; if (p >= dizi.Uzunluk) p = 0;
}

Sw.Stop();
sw.ElapsedMilliseconds değerini döndürün;
}


Yöntem, dizinin her K'inci öğesini artırır. Sona ulaştığımızda yeniden başlıyoruz. Oldukça fazla sayıda yinelemeden sonra (2 20) duruyoruz. Farklı dizi boyutları ve K adım değerleri için çalıştırmalar yaptım.Sonuçlar (mavi - uzun çalışma süresi, beyaz - kısa):

Mavi alanlar, sürekli veri değişiklikleri nedeniyle önbelleğin uyum sağlayamadığı durumlara karşılık gelir gerekli tüm veriler aynı anda. Parlak mavi renk, yaklaşık 80 ms'lik, neredeyse beyaz - 10 ms'lik bir çalışma süresini belirtir.

Mavi alanlarla ilgilenelim:

  1. Neden dikey çizgiler görünüyor? Dikey çizgiler, bir gruptan çok fazla satıra (16'dan fazla) erişilen adım değerlerine karşılık gelir. Bu değerler için makinemin 16 girişli önbelleği gerekli tüm verileri barındıramıyor.

    Kötü adım değerlerinden bazıları ikinin kuvvetleridir: 256 ve 512. Örneğin, adım 512'yi ve 8 MB'lık bir diziyi düşünün. Bu adımla birlikte dizide 512 önbellek grubundaki (262 144/512) hücreler için birbiriyle yarışan 32 bölüm (8*2 20/262 144) bulunur. 32 bölüm var ama önbellekte her grup için yalnızca 16 hücre var, dolayısıyla herkese yetecek kadar alan yok.

    İkinin kuvvetleri olmayan diğer adım değerleri şanssızdır, bu da aynı önbellek gruplarına çok sayıda isabet verilmesine neden olur ve ayrıca şekilde dikey mavi çizgilerin görünmesine neden olur. Bu noktada sayılar teorisini sevenleri düşünmeye davet ediyoruz.

  2. Dikey çizgiler neden 4 MB sınırında kırılıyor? Dizi boyutu 4 MB veya daha az olduğunda, 16 girişli önbellek tamamen ilişkisel bir önbellek gibi davranır, yani dizideki tüm verileri çakışma olmadan barındırabilir. Bir önbellek grubu için savaşan 16'dan fazla alan yok (262.144 * 16 = 4 * 2 20 = 4 MB).
  3. Sol üstte neden büyük mavi bir üçgen var?Çünkü küçük bir adım ve büyük bir dizi ile önbellek gerekli tüm verileri sığdıramaz. Önbellek ilişkilendirilebilirliğinin derecesi burada ikincil bir rol oynar; sınırlama L2 önbelleğinin boyutuyla ilgilidir.

    Örneğin, 16 MB dizi boyutu ve 128 adımla her 128 bayta erişiriz, böylece her ikinci dizi önbellek satırını değiştiririz. Her ikinci satırı önbellekte saklamak için 8 MB önbelleğe ihtiyacınız var, ancak makinemde yalnızca 4 MB var.

    Önbellek tamamen ilişkisel olsa bile, içinde 8 MB'lık verinin depolanmasına izin vermez. Daha önce tartışılan 512 adımlık ve 8 MB dizi boyutuna sahip örnekte, gerekli tüm verileri depolamak için yalnızca 1 MB önbelleğe ihtiyacımız olduğunu, ancak bunun yetersiz önbellek ilişkilendirilebilirliği nedeniyle imkansız olduğunu unutmayın.

  4. Neden üçgenin sol tarafı giderek yoğunluk kazanıyor? Maksimum yoğunluk, önbellek satırının boyutuna eşit olan 64 baytlık bir adım değerinde meydana gelir. Birinci ve ikinci örneklerde gördüğümüz gibi aynı satıra sıralı erişimin neredeyse hiçbir maliyeti yoktur. Diyelim ki, 16 baytlık bir adımla, bir fiyatına dört bellek erişimimiz var.

    Testimizde yineleme sayısı herhangi bir adım değeri için aynı olduğundan, daha ucuz bir adım daha az çalışma süresiyle sonuçlanır.

Keşfedilen etkiler büyük parametre değerlerinde devam eder:

Önbellek ilişkilendirilebilirliği, belirli koşullar altında kendini gösterebilen ilginç bir şeydir. Bu makalede tartışılan diğer sorunların aksine, o kadar ciddi değil. Program yazarken kesinlikle sürekli dikkat gerektiren bir şey değil.

Örnek 6: Yanlış Önbellek Bölümlendirmesi

Çok çekirdekli makinelerde başka bir sorunla karşılaşabilirsiniz: önbellek tutarlılığı. İşlemci çekirdeklerinin kısmen veya tamamen ayrı önbellekleri vardır. Makinemde L1 önbellekleri ayrıdır (her zamanki gibi) ve ayrıca her çekirdek çifti tarafından paylaşılan iki L2 önbelleği vardır. Ayrıntılar değişebilir ancak genel olarak modern çok çekirdekli işlemciler çok düzeyli hiyerarşik önbelleklere sahiptir. Üstelik en hızlı ama aynı zamanda en küçük önbellekler ayrı çekirdeklere aittir.

Bir çekirdek önbelleğindeki bir değeri değiştirdiğinde diğer çekirdekler artık eski değeri kullanamaz. Diğer çekirdeklerin önbelleklerindeki değerin güncellenmesi gerekir. Üstelik güncellenmesi gerekiyor tüm önbellek hattıçünkü önbellekler satır düzeyindeki veriler üzerinde çalışır.

Bu sorunu aşağıdaki kodla gösterelim:

özel statik int s_counter = yeni int;

özel void UpdateCounter(int konumu)
{
for (int j = 0; j< 100000000; j++)
{
s_sayacı = s_sayacı + 3;
}
}


Dört çekirdekli makinemde bu yöntemi dört iş parçacığından aynı anda 0, 1, 2, 3 parametreleriyle çağırırsam, çalışma süresi şu şekilde olacaktır: 4,3 saniye. Ancak yöntemi 16, 32, 48, 64 parametreleriyle çağırırsam çalışma süresi yalnızca 0,28 saniye.

Neden? İlk durumda, iş parçacığı tarafından herhangi bir zamanda işlenen dört değerin tümü büyük olasılıkla tek bir önbellek satırında sonuçlanacaktır. Bir çekirdek bir değeri her artırdığında, diğer çekirdeklerdeki bu değeri içeren önbellek hücrelerini geçersiz olarak işaretler. Bu işlemden sonra diğer tüm çekirdeklerin satırı tekrar önbelleğe alması gerekecektir. Bu, önbellekleme mekanizmasını çalışmaz hale getirerek performansı düşürür.

Örnek 7: Donanım Karmaşıklığı

Şimdi bile, önbellek işleminin ilkeleri sizin için bir sır değilken, donanım size yine de sürprizler verecektir. İşlemciler optimizasyon yöntemleri, buluşsal yöntemler ve diğer uygulama incelikleri açısından birbirlerinden farklılık gösterir.

Bazı işlemcilerin L1 önbelleği, farklı gruplara aitlerse iki hücreye paralel olarak erişebilir, ancak aynı gruba aitlerse yalnızca sırayla erişebilir. Hatta bazıları paralel olarak aynı hücrenin farklı bölgelerine bile erişebiliyor bildiğim kadarıyla.

İşlemciler akıllı optimizasyonlarla sizi şaşırtabilir. Örneğin, yanlış önbellek paylaşımıyla ilgili önceki örnekteki kod ev bilgisayarımda amaçlandığı gibi çalışmıyor; en basit durumlarda işlemci işi optimize edebilir ve olumsuz etkileri azaltabilir. Kodu biraz değiştirirseniz her şey yerine oturur.

İşte tuhaf donanım tuhaflıklarına başka bir örnek:

özel statik int A, B, C, D, E, F, G;

özel statik void Tuhaflık ()
{
for (int i = 0; i< 200000000; i++)
{
<какой-то код>
}
}


Bunun yerine<какой-то код>Üç farklı seçeneği değiştirin, aşağıdaki sonuçları elde edebilirsiniz:

A, B, C, D alanlarının arttırılması, A, C, E, G alanlarının arttırılmasından daha uzun sürer. Daha da tuhaf olan, A ve C alanlarının arttırılmasının A, C alanlarından daha uzun sürmesidir. Ve E, G. Bunun sebeplerinin tam olarak ne olduğunu bilmiyorum ama belki de hafıza bankalarıyla ilgilidir ( evet, evet, sıradan üç litrelik tasarruflu hafıza bankalarıyla ve düşündüğünüz gibi değil). Bu konuyla ilgili düşünceleriniz varsa lütfen yorumlarda belirtin.

Makinemde yukarıdakiler gözlemlenmiyor, ancak bazen anormal derecede kötü sonuçlar olabiliyor - büyük olasılıkla görev zamanlayıcı kendi "ayarlarını" yapıyor.

Bu örnekten çıkarılacak ders, donanımın davranışını tamamen tahmin etmenin çok zor olduğudur. Evet, OlabilmekÇok fazla tahminde bulunun, ancak tahminlerinizi ölçümler ve testlerle sürekli doğrulamanız gerekir.

Çözüm

Umarım yukarıda tartışılan her şey işlemci önbelleklerinin tasarımını anlamanıza yardımcı olmuştur. Artık kodunuzu optimize etmek için bu bilgiyi uygulamaya koyabilirsiniz.

Çoğu modern masaüstü bilgisayardaki çipler dört çekirdeğe sahiptir, ancak çip üreticileri altı çekirdeğe geçme planlarını zaten duyurmuşlardır ve 16 çekirdekli işlemciler günümüzün ileri teknoloji sunucuları için hala alışılmadık bir durum değildir.

Ne kadar çok çekirdek varsa, aynı anda birlikte çalışırken tüm çekirdekler arasında hafızanın dağıtılması sorunu da o kadar büyük olur. Çekirdek sayısındaki artışla birlikte, veri işlenirken çekirdeklerin yönetilmesinde kaybedilen sürenin en aza indirilmesi giderek daha faydalı hale geliyor; çünkü veri alışverişinin hızı, işlemcinin ve bellekteki veri işleme hızının gerisinde kalıyor. Başka birinin hızlı önbelleğine fiziksel olarak erişebilir veya kendi yavaş önbelleğinize erişebilir, ancak veri aktarım süresinden tasarruf edebilirsiniz. Programlar tarafından talep edilen bellek miktarının her türün önbellek miktarına açıkça karşılık gelmemesi nedeniyle görev karmaşıktır.

Fiziksel olarak, yalnızca çok sınırlı miktarda bellek işlemcinin mümkün olduğu kadar yakınına yerleştirilebilir - işlemcinin hacmi son derece önemsiz olan L1 önbelleği. Massachusetts Teknoloji Enstitüsü'nün Bilgisayar Bilimi ve Yapay Zeka Laboratuvarı'ndan araştırmacılar Daniel Sanchez, Po-An Tsai ve Nathan Beckmann, bir bilgisayara gerçek zamanlı olarak esnek bir program hiyerarşisi için farklı bellek türlerini yapılandırmayı öğretti. Jenga adı verilen yeni sistem, programların belleğe erişim sıklığını ve hacimsel ihtiyaçlarını analiz ediyor ve 3 tür işlemci önbelleğinin her birinin gücünü, daha fazla verimlilik ve enerji tasarrufu sağlayan kombinasyonlar halinde yeniden dağıtıyor.


Başlangıç ​​olarak, araştırmacılar tek çekirdekli işlemci programları üzerinde çalışırken statik ve dinamik belleği birleştirirken performans artışını test ettiler ve hangi kombinasyonu kullanmanın daha iyi olduğu konusunda bir birincil hiyerarşi elde ettiler. 2 tür bellekten veya birinden. İki parametre değerlendirildi: sinyal gecikmesi (gecikme) ve her programın çalışması sırasındaki enerji tüketimi. Programların yaklaşık% 40'ı, bellek türlerinin birleşimiyle daha kötü çalışmaya başladı, geri kalanı daha iyi. Hangi programların karma performansı "beğendiğini" ve hangilerinin bellek boyutunu beğendiğini kaydeden araştırmacılar, Jenga sistemlerini oluşturdular.

36 çekirdekli sanal bir bilgisayarda 4 tür programı sanal olarak test ettiler. Test edilen programlar:

  • omnet - Objective Modular Network Testbed, C simülasyon kütüphanesi ve ağ simülasyon araçları platformu (resimde mavi)
  • mcf - Meta İçerik Çerçevesi (kırmızı renk)
  • yıldız - sanal gerçeklik görüntüleme yazılımı (yeşil)
  • bzip2 - arşivleyici (mor renk)


Resimde her programa ait verilerin nerede ve nasıl işlendiği gösterilmektedir. Harfler her uygulamanın nerede çalıştığını (çeyrek başına bir tane), renkler verinin nerede bulunduğunu gösterir ve gölgeleme mevcut olduğunda sanal hiyerarşinin ikinci düzeyini gösterir.

Önbellek düzeyleri

CPU önbelleği çeşitli düzeylere bölünmüştür. Evrensel işlemciler için - 3'e kadar. En hızlı bellek, işlemciyle aynı yonga üzerinde bulunduğundan birinci seviye önbellektir - L1 önbellek. Talimat önbelleği ve veri önbelleğinden oluşur. L1 önbelleği olmayan bazı işlemciler çalışamaz. L1 önbelleği işlemci frekansında çalışır ve her saat döngüsünde erişilebilir. Çoğu zaman birden fazla okuma/yazma işlemini aynı anda gerçekleştirmek mümkündür. Birim genellikle küçüktür - 128 KB'den fazla değildir.

İkinci düzey önbellek L2, L1 önbelleğiyle etkileşime girer. En hızlı ikincidir. Genellikle L1 gibi çip üzerinde veya işlemci kartuşu gibi çekirdeğe yakın bir yerde bulunur. Eski işlemcilerde anakart üzerinde bir dizi çip bulunur. L2 önbellek hacmi 128 KB'tan 12 MB'a çıkarıldı. Modern çok çekirdekli işlemcilerde, aynı yonga üzerinde bulunan ikinci seviye önbellek ayrı bir bellektir - toplam önbellek boyutu 8 MB olup, her çekirdek 2 MB'tır. Tipik olarak, çekirdek çip üzerinde bulunan L2 önbelleğinin gecikmesi 8 ila 20 çekirdek saat döngüsü arasındadır. Sınırlı bir bellek alanına çok sayıda erişimi içeren görevlerde, örneğin bir DBMS'de, tam kullanımı üretkenliği on kat artırır.

L3 önbelleği genellikle daha da büyüktür, ancak L2 önbelleğinden biraz daha yavaştır (L2 ile L3 arasındaki veri yolunun L1 ve L2 arasındaki veri yolundan daha dar olması nedeniyle). L3 genellikle CPU çekirdeğinden ayrı olarak bulunur, ancak 32 MB'ın üzerinde büyük olabilir. L3 önbellek önceki önbelleklerden daha yavaştır ancak yine de RAM'den daha hızlıdır. Çok işlemcili sistemlerde yaygın olarak kullanılır. Üçüncü düzey bir önbelleğin kullanımı çok dar bir görev yelpazesinde haklıdır ve yalnızca performansta bir artış sağlamakla kalmayıp, tam tersine sistem performansında genel bir düşüşe yol açabilir.

İkinci ve üçüncü düzey önbelleğin devre dışı bırakılması, veri miktarının önbellek boyutundan az olduğu matematik problemlerinde en kullanışlıdır. Bu durumda tüm verileri aynı anda L1 önbelleğine yükleyebilir ve ardından işleyebilirsiniz.


Jenga, kaynak sınırlamalarını ve uygulama davranışını dikkate alarak veri alışverişini en aza indirmek için işletim sistemi düzeyindeki sanal hiyerarşileri periyodik olarak yeniden yapılandırır. Her yeniden yapılandırma dört adımdan oluşur.

Jenga, verileri yalnızca hangi programların gönderildiğine (büyük tek hızlı belleği sevenlere veya karma önbelleklerin hızını sevenlere) bağlı olarak değil, aynı zamanda bellek hücrelerinin işlenen verilere fiziksel yakınlığına da bağlı olarak dağıtır. Programın varsayılan olarak veya hiyerarşiye göre ne tür bir önbellek gerektirdiğine bakılmaksızın. Önemli olan sinyal gecikmesini ve enerji tüketimini en aza indirmektir. Programın "beğendiği" bellek türü sayısına bağlı olarak Jenga, her sanal hiyerarşinin gecikmesini bir veya iki düzeyle modeller. İki düzeyli hiyerarşiler bir yüzey oluşturur, tek düzeyli hiyerarşiler ise bir eğri oluşturur. Jenga daha sonra VL1'in boyutlarında minimum gecikmeyi yansıtarak iki eğri elde eder. Son olarak Jenga, en iyi hiyerarşiyi (yani VL1 boyutunu) seçmek için bu eğrileri kullanır.

Jenga'yı kullanmanın gözle görülür bir etkisi oldu. 36 çekirdekli sanal çip yüzde 30 daha hızlı çalışmaya ve yüzde 85 daha az enerji kullanmaya başladı. Elbette Jenga şimdilik çalışan bir bilgisayarın simülasyonu ve bu önbelleğin gerçek örneklerini görmeniz ve hatta çip üreticilerinin teknolojiyi beğenmeleri halinde bunu benimsemeleri biraz zaman alacak.

Geleneksel bir 36 nükleer makinenin konfigürasyonu

  • İşlemciler. 36 çekirdek, x86-64 ISA, 2,4 GHz, Silvermont benzeri OOO: 8B genişliğinde
    getir; 512×10 bit BHSR'ler + 1024×2 bit PHT, 2 yollu kod çözme/verme/yeniden adlandırma/kayıt, 32 girişli IQ ve ROB, 10 girişli LQ, 16 girişli SQ ile 2 seviyeli bpred; 371 pJ/komut, 163 mW/çekirdek statik güç
  • L1 önbellekleri. 32 KB, 8 yollu set-ilişkili, bölünmüş veri ve talimat önbellekleri,
    3 döngülü gecikme; Vuruş/ıskalama başına 15/33 pJ
  • Önceden Getirici Hizmeti. 16 girişli akış önceden getiricileri buna göre modellenmiş ve ona göre doğrulanmıştır
    Nehalem
  • L2 önbellekleri. Çekirdek başına 128 KB özel, 8 yollu set ilişkisel, kapsayıcı, 6 döngülü gecikme; Vuruş/ıskalama başına 46/93 pJ
  • Tutarlı mod. Jenga için 16 yollu, 6 döngülü gecikmeli dizin bankaları; diğerleri için önbellek içi L3 dizinleri
  • Küresel NoC. 6×6 örgü, 128 bitlik geçişler ve bağlantılar, X-Y yönlendirme, 2 döngülü ardışık düzen yönlendiriciler, 1 döngülü bağlantılar; Yönlendirici/bağlantı geçiş geçişi başına 63/71 pJ, 12/4mW yönlendirici/bağlantı statik gücü
  • Statik bellek SRAM'ı engeller. 18 MB, parça başına bir adet 512 KB banka, 4 yollu 52 aday zcache, 9 döngülü banka gecikmesi, Vantage bölümlendirme; İsabet/ıskalama başına 240/500 pJ, 28 mW/banka statik güç
  • Çok Katmanlı Yığılmış DRAM. 1152 MB, 4 döşeme başına bir 128 MB kasa, MAP-I DDR3-3200 (1600 MHz) ile Alaşım, 128 bit veri yolu, 16 sıra, 8 sıra/derece, 2 KB satır arabelleği; İsabet/ıskalama başına 4,4/6,2 nJ, 88 mW/kasa statik gücü
  • Ana hafıza. 4 DDR3-1600 kanal, 64 bit veri yolu, 2 sıra/kanal, 8 sıra/derece, 8 KB satır arabelleği; 20 nJ/erişim, 4W statik güç
  • DRAM zamanlamaları. tCAS=8, tRCD=8, tRTP=4, tRAS=24, tRP=8, tRRD=4, tWTR=4, tWR=8, tFAW=18 (tCK'deki tüm zamanlamalar; yığılmış DRAM'de ana bellek olarak tCK'nin yarısı bulunur) )