İşlemciler CPU Nasıl Tasarlanır ve Üretilir?

TechSpiker

Teknoloji Haberleri
Yönetici
Yetki Sahibi
Mesajlar
53
Tepkime puanı
284
Konum
Türkiye

Bilgisayar Mimarisinin Temelleri​

CPU Mimarisi


Hepimiz CPU'yu bir bilgisayarın beyni olarak düşünüyoruz, ama bu aslında ne anlama geliyor? Bilgisayarınızın çalışmasını sağlayan milyarlarca transistörün içinde neler oluyor? Bu dört bölümlük seride, bir bilgisayarın çalışmasını sağlayan parçaların içini ve dışını kapsayan bilgisayar donanımı tasarımına odaklanacağız.

Seri, bilgisayar mimarisini, işlemci devre tasarımını, VLSI'yi çok büyük ölçekli entegrasyon, çip üretimini ve bilgi işlemde gelecekteki eğilimleri kapsayacak. İşlemcilerin içeride nasıl çalıştığının ayrıntılarıyla her zaman ilgilendiyseniz, okumaya devam edin, başlamak için bilmeniz gereken şey budur.

Bir CPU Aslında Ne Yapar?​

Bir işlemcinin ne yaptığı ve yapı taşlarının işlevsel bir tasarımda nasıl bir araya geldiği ile çok yüksek bir seviyeden başlayalım. Buna işlemci çekirdekleri, bellek hiyerarşisi, dal tahmini ve daha fazlası dahildir. İlk olarak, bir CPU'nun ne yaptığına dair temel bir tanıma ihtiyacımız var.

En basit açıklama, bir CPU'nun bir dizi girdi üzerinde bazı işlemleri gerçekleştirmek için bir dizi talimatı takip etmesidir. Örneğin, bu, bellekten bir değer okumak, başka bir değere eklemek ve son olarak sonucu farklı bir konumda bellekte saklamak olabilir. Önceki hesaplamanın sonucu sıfırdan büyükse iki sayıyı bölmek gibi daha karmaşık bir şey de olabilir.

Bir işletim sistemi veya oyun gibi bir programı çalıştırmak istediğinizde, programın kendisi CPU'nun yürütmesi için bir dizi talimattır. Bu talimatlar bellekten yüklenir ve basit bir işlemcide, program bitene kadar tek tek yürütülür. Örneğin, yazılım geliştiriciler programlarını C++ veya Python gibi üst düzey dillerde yazarken, işlemci bunu anlayamaz. Yalnızca 1'leri ve 0'ları anlar, bu nedenle kodu bu formatta temsil etmenin bir yoluna ihtiyacımız var.

İşlemciler CPU Nasıl Tasarlanır ve Üretilir?


CPU Talimatlarının Temelleri​

Programlar, Komut Kümesi Mimarisi'nin (ISA) bir parçası olarak assembly dili adı verilen bir dizi düşük seviyeli talimat halinde derlenir. Bu, CPU'nun anlamak ve yürütmek için oluşturulduğu talimatlar kümesidir. En yaygın ISA'lardan bazıları x86, MIPS, ARM, RISC-V ve PowerPC'dir. Tıpkı C++'da bir işlev yazmak için kullanılan sözdiziminin Python'da aynı şeyi yapan bir işlevden farklı olması gibi, her ISA'nın da kendi sözdizimi vardır.

İşlemciler CPU Nasıl Tasarlanır ve Üretilir1.webp


Bu ISA'lar iki ana kategoriye ayrılabilir: sabit uzunluk ve değişken uzunluk. RISC-V ISA, sabit uzunlukta talimatlar kullanır, bu da her komutta önceden tanımlanmış belirli bir bit sayısının ne tür bir talimat olduğunu belirlediği anlamına gelir. Bu, değişken uzunluklu talimatlar kullanan x86'dan farklıdır. x86'da, talimatlar farklı parçalar için farklı şekillerde ve farklı bit sayılarıyla kodlanabilir. Bu karmaşıklık nedeniyle, x86 CPU'lardaki komut kod çözücü tipik olarak tüm tasarımın en karmaşık parçasıdır.


Sabit uzunluktaki talimatlar, düzenli yapıları nedeniyle daha kolay kod çözmeye izin verir, ancak bir ISA'nın destekleyebileceği toplam talimat sayısını sınırlar. RISC-V mimarisinin yaygın sürümleri yaklaşık 100 talimata sahip ve açık kaynaklı olsa da, x86 tescillidir ve kimse kaç tane talimat olduğunu gerçekten bilmiyor. İnsanlar genellikle birkaç bin x86 talimatı olduğuna inanır, ancak kesin sayı herkese açık değildir. ISA'lar arasındaki farklılıklara rağmen, hepsi temelde aynı temel işlevselliği taşır.

CPU Mimarisi


Artık bilgisayarımızı açmaya ve bir şeyler çalıştırmaya başlamaya hazırız. Bir talimatın yürütülmesi aslında bir işlemcinin birçok aşaması boyunca parçalanan birkaç temel parçaya sahiptir.


Getir, Kodunu Çöz, Yürüt: CPU Yürütme Döngüsü​

İlk adım, yürütmeye başlamak için talimatı bellekten CPU'ya getirmektir. İkinci adımda, komutun kodu çözülür, böylece CPU ne tür bir komut olduğunu anlayabilir. Aritmetik talimatlar, dal talimatları ve hafıza talimatları dahil olmak üzere birçok tür vardır. CPU ne tür bir talimat yürüttüğünü öğrendikten sonra, talimatın işlenenleri CPU'daki bellekten veya dahili kayıtlardan toplanır. A sayısını B numarasına eklemek istiyorsanız, A ve B'nin değerlerini gerçekten bilmeden toplama işlemini yapamazsınız. Modern işlemcilerin çoğu 64 bittir, bu da her veri değerinin boyutunun 64 bit olduğu anlamına gelir. CPU, talimat için işlenenlere sahip olduktan sonra, işlemin giriş üzerinde yapıldığı yürütme aşamasına geçer. Bu, sayıları toplamak, sayılar üzerinde mantıksal bir manipülasyon yapmak veya sayıları değiştirmeden sadece geçirmek olabilir. Sonuç hesaplandıktan sonra, sonucu depolamak için belleğe erişilmesi gerekebilir veya CPU değeri dahili kayıtlarından birinde tutabilir. Sonuç kaydedildikten sonra, CPU çeşitli öğelerin durumunu güncelleyecek ve bir sonraki komuta geçecektir.

Bu açıklama elbette büyük bir basitleştirmedir ve çoğu modern işlemci, verimliliği artırmak için bu birkaç aşamayı 20 veya daha fazla küçük aşamaya bölecektir. Bu, işlemcinin her döngüde birkaç talimatı başlatıp bitirmesine rağmen, herhangi bir talimatın baştan sona tamamlanmasının 20 veya daha fazla döngü alabileceği anlamına gelir. Bu modele genellikle boru hattı denir, çünkü boru hattını doldurmak ve sıvının içinden tam olarak geçmesi biraz zaman alır, ancak bir kez dolduğunda sabit bir çıktı elde edersiniz.

CPU Mimarisi


Sıra Dışı Yürütme ve Superskaler Mimari​

Bir talimatın geçtiği tüm döngü çok sıkı bir şekilde koreografisi yapılmış bir süreçtir, ancak tüm talimatlar aynı anda bitmeyebilir. Örneğin, toplama işlemi çok hızlıdır, bölme veya bellekten yükleme ise yüzlerce döngü sürebilir. Yavaş bir komut tamamlanırken tüm işlemciyi durdurmak yerine, çoğu modern işlemci sıra dışı çalışır.

Bu, belirli bir zamanda hangi talimatın yürütülmesinin en faydalı olacağını belirleyecekleri ve hazır olmayan diğer talimatları arabelleğe alacakları anlamına gelir. Geçerli komut henüz hazır değilse, işlemci başka bir şeyin hazır olup olmadığını görmek için kodda ileri atlayabilir.

Sıra dışı yürütmeye ek olarak, tipik modern işlemciler süper skalar mimari olarak adlandırılan şeyi kullanır. Bu, herhangi bir zamanda, işlemcinin boru hattının her aşamasında aynı anda birçok talimat yürüttüğü anlamına gelir. Ayrıca infazlarına başlamak için yüzlercesini daha bekliyor olabilir. Aynı anda birçok talimatı yürütmek için, işlemcilerin içinde her bir boru hattı aşamasının birkaç kopyası olacaktır.

Bir işlemci, iki talimatın yürütülmeye hazır olduğunu ve aralarında herhangi bir bağımlılık olmadığını görürse, bunların ayrı ayrı bitmesini beklemek yerine, her ikisini de aynı anda yürütecektir. Bunun yaygın bir uygulaması, Hyper-Threading olarak da bilinen Eşzamanlı Çoklu İş Parçacığı Kullanımı (SMT) olarak adlandırılır. Intel ve AMD işlemciler genellikle iki yönlü SMT'yi desteklerken, IBM sekiz yönlü SMT'ye kadar destekleyen yongalar geliştirmiştir.
Dikkatli bir şekilde koreografisi yapılmış bu yürütmeyi gerçekleştirmek için, bir işlemcinin temel çekirdeğe ek olarak birçok ekstra öğesi vardır. Bir işlemcide her biri belirli bir amaca hizmet eden yüzlerce ayrı modül vardır, ancak biz sadece temel bilgileri gözden geçireceğiz. En büyük ve en faydalı ikisi önbellekler ve dal tahmincisidir. Ele almayacağımız ek yapılar arasında arabellekleri yeniden sıralama, kayıt takma ad tabloları ve rezervasyon istasyonları gibi şeyler yer alır.

Önbellekler Bellek Erişimini Hızlandırma​

Önbelleklerin amacı, verileri tıpkı RAM veya SSD gibi depoladıkları için genellikle kafa karıştırıcı olabilir. Önbellekleri diğerlerinden ayıran şey, erişim gecikmeleri ve hızlarıdır. RAM son derece hızlı olmasına rağmen, bir CPU için çok yavaştır. RAM'in verilerle yanıt vermesi yüzlerce döngü alabilir ve işlemcinin yapacak hiçbir şeyi kalmaz. Veriler RAM'de değilse, bir SSD'deki verilere erişilmesi on binlerce döngü sürebilir. Önbellekler olmasaydı, işlemcilerimiz durma noktasına gelirdi.

İşlemciler genellikle bellek hiyerarşisi olarak bilinen şeyi oluşturan üç önbellek düzeyine sahiptir. L1 önbelleği en küçük ve en hızlısıdır, L2 ortadadır ve L3 önbelleklerin en büyüğü ve en yavaşıdır. Hiyerarşideki önbelleklerin üzerinde, hesaplama sırasında tek bir veri değerini depolayan küçük kayıtlar bulunur. Bu kayıtlar, büyüklük sırasına göre sisteminizdeki en hızlı depolama aygıtlarıdır. Bir derleyici üst düzey bir programı assembly diline dönüştürdüğünde, bu kayıtları kullanmanın en iyi yolunu belirler.

CPU bellekten veri istediğinde, önce bu verilerin zaten L1 önbelleğinde depolanıp depolanmadığını kontrol eder. Eğer öyleyse, verilere sadece birkaç döngüde hızlı bir şekilde erişilebilir. Mevcut değilse, CPU L2'yi kontrol edecek ve ardından L3 önbelleğini arayacaktır. Önbellekler, genellikle çekirdeğe saydam olacak şekilde uygulanır. Çekirdek sadece belirli bir bellek adresinde bazı veriler isteyecek ve hiyerarşide hangi düzeyde olursa olsun yanıt verecektir. Bellek hiyerarşisinde sonraki aşamalara geçtikçe, boyut ve gecikme süresi genellikle büyüklük sırasına göre artar. Sonunda, CPU aradığı verileri herhangi bir önbellekte bulamazsa, ancak o zaman ana belleğe (RAM) gidecektir.

CPU Mimarisi

Tipik bir işlemcide, her çekirdeğin iki L1 önbelleği olacaktır: biri veriler ve diğeri talimatlar için. L1 önbellekleri tipik olarak toplam 100 kilobayt civarındadır ve boyut, yongaya ve nesle bağlı olarak değişebilir. Ayrıca her çekirdek için tipik olarak bir L2 önbelleği vardır, ancak bazı mimarilerde iki çekirdek arasında paylaşılabilir. L2 önbellekleri genellikle birkaç yüz kilobayttır. Son olarak, tüm çekirdekler arasında paylaşılan ve onlarca megabayt mertebesinde olan tek bir L3 önbelleği vardır.

Bir işlemci kod yürütürken, en sık kullandığı yönergeler ve veri değerleri önbelleğe alınır. Bu, işlemcinin ihtiyaç duyduğu veriler için sürekli olarak ana belleğe gitmesi gerekmediğinden yürütmeyi önemli ölçüde hızlandırır. Bu serinin ikinci ve üçüncü bölümlerinde bu bellek sistemlerinin gerçekte nasıl uygulandığı hakkında daha fazla konuşacağız.