Nehalem (mikromimari)

**Nehalem**, İntel firmasının Eylül 2008'de piyasaya sürülen Core i7 işlemcisiyle birlikte kullanılmaya başlanmıştır. 2011'de Sandy Bridge mikromimarisi sunulana kadar İntel'in en gelişmiş mikromimarisi olarak piyasada kalmıştır. Selefi Core mikromimarisine göre paralelliği ve saat frekansını arttırmış, Core mikromimarisinde İntel'in kullanmadığı fakat daha önce NetBurst'de kullanılan Hyper Threading teknolojisi Nehalem ile tekrar kullanılmaya başlamıştır. Nehalem'le birlikte Core mikromimarisinde terkedilmiş olan üçüncü seivye bir önbellek de yonganın içerisine eklenmiştir. İntel, Nehalem ile ilk defa bellek denetim birimini işlemci yongasının içine koymuş ve front-side bus dan ayırmıştır.

## Bellek Organizasyonu

Nehalem'in halefi olan Core mikromimarisinde NetBurst'ün bazı sürümlerinde bulunan 3. seviye önbellek çıkarılmıştır ve bunun yerine geniş bir ikinci seviye önbellek (2MB) yerleştirilmiştir. Nehalem ise üçüncü seviye önbelleği yeniden kullanmıştır ve boyutu da ilk üretilen Core i7 mikroişlemcilerde 8 MB kadardır. Nehalem, birinci seviye önbellekte Core mikromimarisindeki yapıyı korumuştur; 32 KB buyruk ve 32 KB veri önbelleğine sahiptir. İkinci seviye önbellekte küçültmeye giderek daha hızlı erişim sağlamaya çalışmıştır. Nehalem mikromimarisinde ikinci seviye önbellek 256 KB'dir. Birinci seviye buyruk önbelleği 4-yollu kümeli ilişkili, veri önbelleği 8-yollu kümeli ilişkilidir. İkinci seviye önbellek 8-yollu kümeli ilişkili, üçüncü seviye önbellek de 16-yollu kümeli ilişkilidir. Ana bellek teknolojisinde de Nehalem DDR3 SDRAM desteğini getirmiştir. DDR3 ana bellek denetleyici birimi 3 kanallıdır. Nehalem mikromimarisinde bütün önbellekler kapsamlıdır *(ing. inclusive)*. Yani, 1. seviyede herhangi bir çekirdeğin önbelleğinde bulunan veri aynı çekirdeğin 2. seviye önbelleğinde de tutulur. Üçüncü seviye paylaşımlı önbellekte ise bütün çekirdeklerin birinci ve ikinci seviye önbelleklerinde bulundurduğu veriler tutulur. Önbelleklerin kapsamlı olması yüzünden üçüncü seviye önbellekte 1.26 MB'lık bir alan tekrar edilen verilerden oluşmaktadır. Normalde olumsuz gibi görünen bu durum, çekirdekler arasındaki haberleşmede *snoop* filtresi özelliğini kazandırmaktadır. Yani bir çekirdekte istenilen veri bir ve ikinci seviye önbelleklerde bulunamadığı zaman, üçüncü seviye önbelleğe bakılması yeterli olacaktır; çünkü diğer çekirdeklerin önbelleklerindeki veriler üçüncü seviye önbelleklerde de bulunmaktadır. Nehalem mikromimarisinde birinci seviye önbelleğe erişim 3 saat vuruşu, ikinci seviye önbelleğe erişim 11 saat vuruşu ve üçüncü seviye önbelleğe erişim 52 saat vuruşu kadardır.

## Boru Hattı Aşamaları

Nehalem, Core mikromimarisinde 12-14 olan boru hattı aşama sayısını 20-24'e çıkarmıştır. Genel olarak boru hattı aşamalarını 4 ana bölge olarak tanımlamak gerekirse bunlar: Getir, Çöz, Yürüt ve Yaz aşamalarıdır.
### Buyrukların Getirilmesi
Nehalem mikromimarisinde, buyruklar ilk önce 32 KB'lık buyruk önbelleğinde aranır. Burada bulunamadıkları takdirde sırasıyla ikinci seviye önbellek ve üçüncü seviye önbellekte aranır. Burada da bulunamadığı takdirde ana belleğe erişim gerekmektedir. Nehalemde, sanal bellek kullanıldığı için, sanal adreslerin gerçek adreslere dönüştürme işlemine ihtiyaç duyulmaktadır. Bunun için, sanal adreslere karşılık gelen gerçek (fiziksel) adreslerin tutulduğu bir sayfa tablosu vardır ve sayfa tablosu ana bellekte tutulmaktadır. Her bir sayfa dönüşüm işlemi için ana belleğe gitmek zaman alıcıdır, bu yüzden sayfa tablosunun bir kısmı Etkin sayfalar önbelleğinde (ESÖ) tutulur. Nehalemde ESÖ daha önceki tek seviye uygulamaların aksine iki seviyeli olarak gerçekleştirilmiştir. Birinci seviye ESÖ buyruklar için 7-128 adet buyruk taşıyabilecek şekilde, veriler için 32-64 adet veri taşıyabilecek şekilde tasarlanmıştır.

### Buyrukların Çözülmesi
IA-64, Karmaşık komut setli bilgisayar*(ing: CISC(complex instruction set computing))* mimarisinde tasarlandığı için, buyruklar düzenli, yalın değildir ve eşit uzunlukta değildirler. Bu yüzden buyrukların çözülüp fonksiyonun ve işlenenlerin belirlenmesi birkaç saat vuruşu sürmektedir. Compile edilmiş halde bulunan IA-64 buyrukları buyruk önbelleğinden çekilirler ve İntel bunlara Macro-Op ismini vermektedir. Macro-Op'ların önçözme aşamasında uzunlukları belirlenir (bir Makro-Op 1 bayt da olabilir 17 bayt da). Macro_Op'lar daha sonra buyruk kuyruğuna (ing: Instruction Queue), bellek hizalaması (ing: Memory Alignment) işlemi uygulanarak yerleştirilirler. Nehalem mikromimarisinde yürütme birimi Macro-Op'ları yürütecek şekilde tasarlanmamıştır. Bu yüzden Makro-Op'ların çözme aşamasından geçerek Micro-Op'lara dönüştürülmesi gerekir. Nehalemde, 3 adet basit kodçözücü ve 1 adet de karmaşık kodçözücü bulunmaktadır ve bunlar paralel çalışabilecek şekilde tasarlanmışlardır. Karmaşık kodçözücüye 1 adet Makro-Op'tan 4 adet Micro-Op çıkarabilecek buyruklar girerler. Daha basit buyruklar için basit kodçözücü birimleri kullanılır. Kodçözücülerden çıkan Micro-Op'lar daha sonra çözülmüş buyruk kuyruğuna (ing: Micro-Op Instruction Queue) yerleştirilirler. Çözülmüş buyruk kuyruğunda bulunan Micro-Op'ların işlenenleri yazmaç adlandırma işlemine sokulur ve aldıkları yeni yazmaç isimleriyle yeniden sıralama tamponundan (ing: re-order buffer) yer alırlar. Aynı anda Micro-Op'lar yayın kuyruğundan (ing: issue queue) da sıra alırlar ve yürütülmek için beklerler.

### Buyrukların Yürütülmesi
Yayın kuyruğunda buyruklar, önceki buyruklara bağımlılıkları oldukları sürece beklemede kalırlar. Her bir saat vuruşu sonrasında yürütme biriminde sonuçları hazır olan yazmaçlar yayın kuyruğunda bekleyen buyruklara adreslerini gönderirler böylece bekleyen işlenenlerin hazır olup olmadığı kontrol edilir. Eğer bir buyruğun bütün işlenenleri hazır konumuna geldiyse, buyruk yürütüleceği yürütme birimine gönderilir. Nehalem'de yayın kuyruğu altı portludur, yani altı farklı yürütme birimi bulunmaktadır. Bunlardan üç tanesi bellek işlemleriyle ilgilidir ve bellek adresinin hesaplanmasından sonra bu birimlere gelen yükle ve sakla buyrukları bellek düzenleme tamponuna (ing: memory order buffer) aktarılır. Bu tamponda sakla buyruklarından yükle buyruklarına yönlendirme olup olmadığı kontrol edilir ve eğer böyle bir durum varsa yükle buyruğu önbelleğe gitmeye gerek kalmadan boru hattı içerisinde istediği veriyi elde edecektir. Diğer üç yürütme birimi ise aritmetik mantık birimi ve kayan nokta işlemlerinin yapıldığı birimlerdir. Nehalem ile birlikte SSE 4.2 buyruk kümesi mimariye eklenmiştir ve birçok yeni buyruk eklenmiştir. Mesela XML dosyalarını ayrıştırma (parsing) işlemini hızlandırıcı ve 16 baytlık iki karakter dizisini tek seferde karşılaştırma gibi buyruklar mimari kümesine eklenmiştir.

### Sonuçların Yazılması
Yürütme biriminde işlenen buyrukların sonuçları iki farklı yere yazılabilir: Veri önbelleği ya da sonuç yazmacı. Veri önbelleğine yazılacak olan veri, ilk olarak birinci seviye önbellekte aranır ve eğer adres bulunursa buraya yazılır. Adres bulunamazsa diğer önbellekler ve ana bellekte aranıp bulunduğu takdirde yazılır. Yazmaç sonuçları ise hem bağımlı buyrukların çözülmesi için yayın kuyruğuna yollanır, hem de yeniden düzenleme tamponuna yazılır. Buyruk emekli olana kadar yeniden düzenleme tamponunda verisinin okunması için bekletilir. Buyruk emekli olduktan sonra yazmaç boşa çıkar ve başka bir buyruğun sonuç yazmacı için kullanılabilir.

## Kaynakça
*Intel Core i7 - Nehalem Architecture Dive. http://www.bit-tech.net/hardware/cpus/2008/11/03/intel-core-i7-nehalem-architecture-dive/7 
*Cache Organization and Memory Management of the Intel Nehalem Computer Architecture, Trent Rolf. https://web.archive.org/web/20140830111714/http://rolfed.com/nehalem/nehalemPaper.pdf
*First Look at Nehalem Microarchitecture. https://web.archive.org/web/20081106102523/http://xbitlabs.com/articles/cpu/display/nehalem-microarchitecture.html