Bilgisayar Mimarisi: Komut Kümesi, Boru Hattı ve Bellek Sistemi
ISA, RISC/CISC, program kontrolü, pipeline, vektör işleme, bilgisayar aritmetiği, G/Ç, bellek hiyerarşisi ve çoklu işlemci yapılarını birlikte ele alan ayrıntılı mimari notları.
Bilgisayar mimarisi notlarını organizasyon dersindeki temel bilgisayar modelinin ötesine geçerek ISA, pipeline, bellek hiyerarşisi ve paralellik kararlarını birlikte değerlendirmek için tutmuştum. İlk sürümün RISC/CISC, aritmetik, G/Ç ve çoklu işlemci konularını korudum; daha sonraki işlemci ailelerine ilişkin örnekleri teknik güncelleme olarak ekledim.
Ünite 1: CISC ve RISC Merkezi İşlem Birimleri
Komut kümesi mimarisi
Bilgisayar mimarisi, yazılım ile donanım arasındaki sınırı tanımlayan komut kümesi mimarisi ile başlar. İşlemcinin hangi komutları çalıştırdığı, hangi veri tiplerini kullandığı, yazmaçlarının yapısı, adresleme biçimleri, ayrıcalık düzeyleri ve kesinti modeli bu sınırın parçalarıdır.
Komut kümesi mimarisi, yani ISA - Instruction Set Architecture, işlemcinin programcıya ve derleyiciye görünen sözleşmesidir. Aynı ISA farklı mikro mimarilerle gerçekleştirilebilir. Örneğin aynı komut kümesini kullanan iki işlemci farklı pipeline derinliğine, cache düzenine, yürütme birimlerine ve tahmin mekanizmalarına sahip olabilir.
Bu ayrım önemlidir:
- ISA, yazılımın gördüğü mimari sözleşmedir.
- Mikro mimari, bu sözleşmenin donanımda nasıl gerçekleştirildiğidir.
CISC ve RISC kavramları
CISC - Complex Instruction Set Computer, zengin ve çoğu zaman değişken uzunluklu komut kümeleriyle ilişkilendirilen tarihsel mimari yaklaşımıdır.
RISC - Reduced Instruction Set Computer, daha düzenli komut formatları, load/store yaklaşımı, geniş yazmaç kümeleri ve pipeline ile verimli yürütme düşüncesi üzerine kurulmuştur.
Klasik ayrım şöyledir:
| Özellik | CISC | RISC | | --- | --- | --- | | Komut kümesi | Geniş ve karmaşık | Daha düzenli ve sade | | Komut uzunluğu | Sıklıkla değişken | Sıklıkla sabit veya düzenli | | Bellek işlemleri | Bazı işlemler doğrudan bellek operandı kullanabilir | Genellikle load/store ile ayrılır | | Adresleme biçimleri | Çok sayıda olabilir | Daha sınırlı ve düzenli | | Decode | Daha karmaşık olabilir | Daha basit olabilir | | Pipeline | Tarihsel olarak daha güç | Düzenli komut yapısı nedeniyle kolaylaştırılmış |
Bu ayrım günümüz işlemcilerinde mutlak değildir. Modern x86 işlemcileri karmaşık x86 komutlarını iç mikro işlemlere dönüştürerek geniş, sıralama dışı yürütme motorlarında çalıştırır. Arm ve RISC-V gibi RISC kökenli ISA'lar da vektör, kriptografi ve atomik işlem uzantılarıyla oldukça zengin komut kümelerine sahip olabilir.
Bu nedenle bugün CISC-RISC ayrımı daha çok ISA tasarım felsefesini anlamak için kullanılır.
CISC karakteristikleri
CISC yaklaşımının klasik özellikleri:
- çok sayıda komut,
- çok sayıda adresleme biçimi,
- değişken uzunluklu komutlar,
- bellek operandları üzerinde doğrudan işlem yapabilen komutlar,
- karmaşık komut çözme mantığı,
- geriye dönük uyumluluğa güçlü önem verilmesidir.
Değişken uzunluklu komutlar kod yoğunluğunu artırabilir. Buna karşılık komut sınırlarının bulunması ve decode işlemi karmaşıklaşabilir.
Modern x86-64 bu yaklaşımın en önemli yaşayan örneğidir. ISA tarihsel olarak CISC özellikleri taşırken, modern işlemciler içeride mikro işlemler, register renaming, out-of-order execution ve speculative execution gibi gelişmiş teknikler kullanır.
RISC karakteristikleri
RISC yaklaşımının temel düşüncesi, sık kullanılan işlemleri düzenli ve pipeline dostu komutlarla gerçekleştirmektir.
Yaygın özellikler:
- load/store mimarisi,
- geniş genel amaçlı yazmaç kümesi,
- düzenli komut kodlaması,
- az sayıda temel adresleme biçimi,
- register-register aritmetik,
- derleyici optimizasyonuna uygun yapı,
- pipeline gerçekleştirimine elverişli komut formatlarıdır.
Load/store mimarisinde aritmetik işlemler doğrudan ana bellek üzerinde yapılmaz.
Örnek:
LOAD R1, [A]
LOAD R2, [B]
ADD R3, R1, R2
STORE [C], R3Burada bellek erişimi LOAD ve STORE komutlarına ayrılmıştır.
Bir komut bir saat darbesi midir?
RISC için kullanılan "bir komut bir saat darbesinde çalışır" ifadesi dikkatle yorumlanmalıdır.
Bir komutun baştan sona gecikmesi birden fazla saat darbesi olabilir. Pipeline dolduktan sonra ideal koşullarda her saat darbesinde bir komutun tamamlanması mümkündür.
Bu iki kavram farklıdır:
- Latency: Tek komutun tamamlanma süresi.
- Throughput: Birim zamanda tamamlanan komut sayısı.
Modern superscalar işlemciler uygun koşullarda bir saat darbesinde birden fazla komut veya mikro işlem tamamlayabilir.
PowerPC ve Power ISA
PowerPC, IBM, Motorola ve Apple tarafından geliştirilen RISC tabanlı bir komut kümesi ailesidir. Daha sonraki gelişim Power ISA altında sürmüştür.
Power ISA'nın güncel sürümleri:
- kullanıcı komutlarını,
- sanal bellek modelini,
- ayrıcalıklı çalışma modelini,
- vektör ve sayısal işlem olanaklarını
tanımlayan kapsamlı bir RISC ISA'dır.
PowerPC'nin CISC ile RISC arasında hibrit bir ISA olarak değerlendirilmesi doğru değildir. Mimari temeli RISC yaklaşımına dayanır.
Günümüzde x86-64, Arm AArch64 ve RISC-V daha görünür genel amaçlı mimariler olsa da Power ISA özellikle sunucu ve yüksek performanslı sistemler açısından önemini korur.
Yazmaç pencereleri
RISC tarihinin ilginç tekniklerinden biri register window, yani yazmaç pencereleridir.
Bu teknik özellikle SPARC mimarisiyle bilinir.
Bir yordam çağrıldığında yeni bir yazmaç penceresi etkinleştirilir. Çağıran yordamın çıkış yazmaçlarının bir bölümü çağrılan yordamın giriş yazmaçlarıyla fiziksel olarak örtüşür.
Kavramsal yapı:
Çağıran yordam
[ global | local | out ]
||||||
Çağrılan yordam
[ in | local | out ]Bu yöntem:
- parametre aktarımını,
- yordam çağrılarını,
- geçici değerlerin korunmasını
hızlandırmayı amaçlar.
Yazmaç pencereleri RISC'in zorunlu bir özelliği değildir. Modern RISC-V ve AArch64 gibi yaygın ISA'lar aynı yaklaşımı kullanmaz. Yordam çağrıları ABI tarafından belirlenen yazmaç ve yığın kurallarıyla yürütülür.
Pencere organizasyonu
Klasik register window modeli:
G = global yazmaç sayısı
L = yerel yazmaç sayısı
C = komşu pencereyle ortak yazmaç sayısı
W = pencere sayısıBir anda görünen pencere boyutu:
Pencere boyutu = G + L + 2CFiziksel yazmaç sayısı modelin gerçekleştirim biçimine göre pencereler ve ortak alanlar üzerinden hesaplanabilir.
Temel fikir, her yordam çağrısında bütün yazmaçları belleğe yazmak yerine fiziksel yazmaç kümesinin farklı bölümünü etkinleştirmektir.
Pencere sayısı sınırlıdır. Çok derin yordam çağrılarında pencere taşması oluşabilir ve yazmaçların belleğe aktarılması gerekebilir.
Komut sınıfları
Bir işlemcinin komutları genel olarak üç ana sınıfta incelenebilir:
- veri transfer komutları,
- veri işleme komutları,
- program kontrol komutları.
Veri transfer komutları
Veri transfer komutları veriyi bir konumdan diğerine taşır.
Örnekler:
LOAD
STORE
MOVE
PUSH
POPKaynak ve hedef:
- yazmaç,
- ana bellek,
- yığın,
- G/Ç alanı
olabilir.
RISC mimarilerinde ana bellek erişimi çoğunlukla load/store komutlarıyla sınırlandırılır.
Adresleme biçimleri
Bir komut operandın yerini çeşitli biçimlerde belirleyebilir.
Yaygın adresleme biçimleri:
- immediate,
- register,
- direct,
- register indirect,
- base + offset,
- indexed,
- PC-relative.
Örnek:
ADDI R1, R2, 10Burada 10 immediate değerdir.
LOAD R1, 16(R2)Burada efektif adres:
EA = R2 + 16biçimindedir.
PC-relative adresleme özellikle dallanma ve konumdan bağımsız kod için önemlidir.
Veri işleme komutları
Veri işleme komutları:
- aritmetik,
- mantıksal,
- kaydırma,
- karşılaştırma
işlemlerini içerir.
Örnekler:
ADD
SUB
MUL
DIV
AND
OR
XOR
SHIFT
COMPAREModern ISA'larda ayrıca:
- vektör işlemleri,
- kriptografik işlemler,
- atomik işlemler,
- bit manipülasyonu,
- fused multiply-add
gibi gelişmiş işlem sınıfları bulunabilir.
Program kontrol komutları
Program kontrol komutları program sayacının normal ardışık akışını değiştirir.
Örnekler:
- koşulsuz dallanma,
- koşullu dallanma,
- yordam çağırma,
- yordamdan dönüş,
- exception veya trap üretme.
Program sayacı normal durumda bir sonraki komutu gösterir.
Dallanma halinde:
PC <- hedef_adresişlemi gerçekleşir.
CISC ve RISC programlama farkı
Şu ifade ele alınsın:
X = (A + B) * (C + D)RISC benzeri load/store biçimi:
LOAD R1, A
LOAD R2, B
ADD R3, R1, R2
LOAD R4, C
LOAD R5, D
ADD R6, R4, R5
MUL R7, R3, R6
STORE X, R7Bellek erişimleri açıkça ayrılmıştır.
CISC benzeri ISA'larda bazı aritmetik komutlar bellek operandlarını doğrudan kullanabilir. Bu daha az assembly komutu üretebilir ancak her komutun mikro mimari maliyeti farklı olabilir.
Komut sayısı tek başına performans göstergesi değildir.
Performansın temel eşitliği
İşlemci performansı için temel ilişki:
CPU zamanı =
Komut sayısı x Komut başına çevrim x Saat çevrim süresiveya:
CPU time = IC x CPI / Clock RateBurada:
IC: instruction count,CPI: cycles per instruction,Clock Rate: saat frekansıdır.
Bu nedenle yalnız MIPS veya GHz değeri farklı mimarilerin performansını güvenilir biçimde karşılaştırmaz.
Program kontrolü ve durum bitleri
ALU işlemleri sonucunda bazı durum bilgileri üretilebilir.
Yaygın bayraklar:
Z: zero,NveyaS: negative/sign,C: carry,V: signed overflow.
Örneğin 8 bit işaretsiz toplamada:
250 + 20 = 270sonuç 8 bite sığmaz. Carry oluşur.
İşaretli iki'nin tümleyeni aritmetiğinde ise overflow farklı koşullarla belirlenir.
İki pozitif sayının toplamı negatif görünüyorsa signed overflow oluşmuştur.
Carry ve overflow farkı
Carry ile overflow aynı kavram değildir.
Carry, işaretsiz aritmetik açısından bit genişliğinin aşılmasıyla ilgilidir.
Overflow, işaretli sayının temsil aralığının aşılmasıdır.
Örneğin 8 bit iki'nin tümleyeni:
127 + 1matematiksel olarak 128'dir ancak 8 bit signed aralık:
-128 ... +127olduğu için signed overflow oluşur.
Alt rutin çağırma
Alt rutin, belirli işi gerçekleştiren yeniden kullanılabilir komut dizisidir.
Bir çağrıda en az:
- dönüş adresi saklanır,
- parametreler aktarılır,
- kontrol alt rutine geçer,
- sonuç üretilir,
- dönüş adresi geri alınır,
- çağıran programa dönülür.
Dönüş adresi:
- özel link yazmacında,
- genel yazmaçta,
- yığında
saklanabilir.
Yığın kullanımı
İç içe ve özyinelemeli çağrılarda yığın doğal çözümdür.
Her çağrı için bir stack frame oluşturulabilir.
Tipik frame bilgileri:
- dönüş adresi,
- saklanan yazmaçlar,
- yerel değişkenler,
- taşan parametreler,
- hizalama bilgileri.
Özyineleme sırasında her çağrının ayrı frame'i olduğu için dönüş adresleri birbirini bozmaz.
ABI
Modern işlemcilerde yordam çağrısının ayrıntıları yalnız ISA tarafından değil ABI - Application Binary Interface tarafından da belirlenir.
ABI şunları tanımlar:
- hangi yazmaçların parametre taşıdığını,
- hangi yazmaçları çağıranın koruyacağını,
- hangilerini çağrılanın koruyacağını,
- dönüş değerinin yerini,
- yığın hizalamasını,
- çağrı sözleşmesini.
Kesinti ve exception
Normal program akışının özel bir olay nedeniyle başka bir servis koduna yönlendirilmesine genel olarak kontrol transferi denebilir.
Kaynağına göre kavramlar ayrılır:
- interrupt: çoğunlukla dış donanım olayı ve asenkron,
- exception: çalışan komutun neden olduğu senkron olay,
- trap: mimariye göre yazılım tarafından bilinçli oluşturulan veya genel exception sınıfı için kullanılan terim.
Örnek:
- zamanlayıcı kesintisi: interrupt,
- sayfa hatası: exception,
- geçersiz komut: exception,
- sistem çağrısı: trap veya exception mekanizması.
Alt rutin ile kesinti arasındaki fark
Alt rutin çağrısı programın kendi komut akışının parçasıdır.
Kesinti ise genellikle programa dışarıdan gelir ve zamanlaması program tarafından doğrudan belirlenmez.
Kesinti sırasında işlemci:
- mevcut komutu tamamlar veya mimarinin tanımladığı noktada durur,
- gerekli yürütme durumunu korur,
- kesinti vektöründen servis adresini bulur,
- ayrıcalıklı moda geçebilir,
- servis rutinini çalıştırır,
- özel dönüş komutuyla eski bağlamı geri yükler.
Kesinti vektörü
Kesinti kaynaklarının servis adreslerini bulmak için kesinti vektörü veya vektör tablosu kullanılabilir.
Kavramsal olarak:
Kesinti no -> vektör tablosu -> servis yordamıModern işlemcilerde ayrıntılar mimariye göre değişir.
İşlemci durumu
Kesinti veya exception sonrasında programa doğru biçimde dönebilmek için şu bilgilerin korunması gerekebilir:
- program sayacı,
- durum ve kontrol yazmaçları,
- ayrıcalık seviyesi,
- kesinti maskeleri,
- hata bilgisi.
Klasik metinlerde bu bilgiler topluca PSW - Processor Status Word biçiminde ifade edilir.
Sistem ve kullanıcı modu
İşlemci, işletim sisteminin korunmasını sağlamak için ayrıcalık düzeyleri kullanır.
En temel ayrım:
- kullanıcı modu,
- çekirdek veya supervisor modu.
Kullanıcı modunda:
- sayfa tablolarını doğrudan değiştirmek,
- kesinti denetleyicisini programlamak,
- fiziksel aygıt yazmaçlarına sınırsız erişmek
engellenir.
Uygulama çekirdek hizmeti istediğinde kontrollü bir sistem çağrısı mekanizması kullanılır.
RISC-V bunu kullanıcı, supervisor ve machine gibi ayrıcalık düzeyleriyle tanımlar. x86 ise ring yapısını destekler; modern işletim sistemleri ağırlıklı olarak ring 3 ve ring 0 ayrımını kullanır.
Ünite 2: Sıralamalı ve Vektör İşlemciler
Paralel işleme
Paralel işlemenin amacı aynı zaman aralığında daha fazla iş yapmaktır.
Paralellik farklı düzeylerde ortaya çıkar:
- bit düzeyi,
- komut düzeyi,
- veri düzeyi,
- thread düzeyi,
- süreç veya düğüm düzeyi.
Bir işlemcinin aynı anda farklı komut aşamalarını yürütmesi de paralelliktir. Bir GPU'nun binlerce veri öğesi üzerinde çalışması da paralelliktir. Birden fazla CPU çekirdeğinin farklı thread'leri çalıştırması da paralelliktir.
Flynn sınıflandırması
Flynn sınıflandırması komut ve veri akışlarının sayısına göre dört yapı tanımlar:
| Sınıf | Komut akışı | Veri akışı | | --- | --- | --- | | SISD | Tek | Tek | | SIMD | Tek | Çoklu | | MISD | Çoklu | Tek | | MIMD | Çoklu | Çoklu |
SISD, klasik tek akışlı işlem modelidir.
SIMD, aynı işlemi çok sayıda veri öğesine uygular.
MIMD, modern çok çekirdekli ve çok işlemcili sistemlerin genel modelidir.
MISD genel amaçlı bilgisayar tasarımında nadirdir.
Komut düzeyi paralellik
Tek işlemci çekirdeğinde bile birden fazla komut örtüşebilir.
Başlıca teknikler:
- pipelining,
- superscalar issue,
- out-of-order execution,
- speculative execution,
- register renaming.
Bu teknikler tek thread'in komutları arasındaki bağımsızlıktan yararlanır.
Pipeline
Pipeline, bir işlemi aşamalara bölerek farklı işlerin farklı aşamalarda aynı anda çalışmasını sağlar.
Bir üretim hattına benzer.
Basit bir komut pipeline'ı:
IF -> ID -> EX -> MEM -> WBBurada:
IF: instruction fetch,ID: decode/register read,EX: execute,MEM: memory access,WB: write back.
Bir komut EX aşamasındayken sonraki komut ID, daha sonraki komut IF aşamasında bulunabilir.
Pipeline gecikmesi ve throughput
k aşamalı bir pipeline'da her aşamanın çevrim süresi t_p olsun.
n işin tamamlanma süresi ideal durumda:
T_pipeline = (k + n - 1) t_pPipeline kullanılmadan her iş k t_p sürüyorsa:
T_serial = n k t_pİdeal hızlanma:
S =
n k
-------
k+n-1n çok büyüdüğünde:
S -> kolur.
Bu sonuç yalnız aşamalar dengeli ve stall bulunmayan ideal durum içindir.
Pipeline verimi
İdeal verim:
E = S / kolarak düşünülebilir.
Pipeline başlangıcındaki dolma ve sonundaki boşalma kısa iş dizilerinde verimi düşürür.
Pipeline saat süresi
Pipeline saat çevrimi en yavaş aşamanın gecikmesine ve pipeline register maliyetine göre belirlenir.
Yaklaşık:
t_clock >= max(t_stage) + t_registerBu nedenle aşama sayısını artırmak sınırsız hız kazandırmaz.
Pipeline register gecikmesi, clock dağıtımı, bypass ağı ve kontrol karmaşıklığı büyür.
Uzay-zaman diyagramı
Üç aşamalı pipeline:
Saat: 1 2 3 4 5
I1 S1 S2 S3
I2 S1 S2 S3
I3 S1 S2 S3İlk işin gecikmesi üç çevrimdir. Pipeline dolduktan sonra her çevrimde bir iş tamamlanabilir.
Aritmetik pipeline
Yüzen nokta toplama gibi karmaşık işlem aşamalara ayrılabilir.
Örnek:
- üsleri karşılaştır,
- küçük mantissayı hizala,
- toplama veya çıkarma yap,
- sonucu normalize et,
- yuvarla ve paketle.
Farklı girdiler bu aşamalarda eşzamanlı işlenebilir.
Çoklu fonksiyonel birimler
İşlemci:
- integer ALU,
- floating-point unit,
- load/store unit,
- vector unit,
- branch unit
gibi farklı fonksiyonel birimlere sahip olabilir.
Bağımsız komutlar farklı birimlerde aynı anda yürütülebilir.
Bu yapı superscalar işlemcilerin temelidir.
Pipeline hazard kavramı
Pipeline'ın ideal hızda çalışmasını engelleyen koşullara hazard denir.
Üç ana sınıf vardır:
- structural hazard,
- data hazard,
- control hazard.
Structural hazard
İki komut aynı anda aynı donanım kaynağına ihtiyaç duyarsa oluşur.
Örneğin komut ve veri için tek bellek portu varsa aynı çevrimde hem instruction fetch hem veri erişimi çakışabilir.
Çözümler:
- kaynak çoğaltma,
- ayrı instruction/data cache,
- çok portlu yapılar,
- stall.
Data hazard
Komutlar arasında veri bağımlılığı vardır.
Örnek:
ADD R1, R2, R3
SUB R4, R1, R5İkinci komut R1 değerini birinci komut üretmeden kullanamaz.
Klasik bağımlılıklar:
- RAW: Read After Write,
- WAR: Write After Read,
- WAW: Write After Write.
In-order basit pipeline için en önemli gerçek veri bağımlılığı RAW'dır.
Forwarding
Sonuç register file'a yazılmadan doğrudan sonraki yürütme aşamasına aktarılabilir.
EX sonucu -> sonraki EX girişiBu teknik forwarding veya bypassing olarak adlandırılır.
Bazı bağımlılıklarda forwarding yeterli olmaz. Özellikle load-use durumunda stall gerekebilir.
Stall
Komut ilerlemesi geçici olarak durdurulur.
Pipeline'a boş çevrim eklenmesine bubble da denir.
Stall doğruluğu korur ancak throughput'u düşürür.
Control hazard
Koşullu dallanmanın sonucu bilinmeden hangi komutun sırada olduğu kesin olmayabilir.
Yanlış yönden komutlar getirilirse bunların iptal edilmesi gerekir.
Bu maliyet branch penalty oluşturur.
Dallanma tahmini
Modern işlemciler sonucu beklemek yerine dallanmanın yönünü tahmin eder.
Teknikler:
- statik tahmin,
- iki bitli sayaçlar,
- branch history,
- branch target buffer,
- global/local history,
- daha karmaşık modern tahminciler.
Tahmin doğruysa pipeline akmaya devam eder.
Yanlışsa spekülatif komutlar iptal edilir ve doğru hedeften yeniden başlanır.
Geciktirilmiş dallanma
Delayed branch, eski RISC tasarımlarında dallanma gecikmesini derleyiciye görünür hale getiren tarihsel tekniktir.
Dallanma komutundan sonraki bir veya daha fazla instruction slot her durumda çalıştırılır.
Derleyici bu slotlara yararlı komut yerleştirmeye çalışır.
Bu teknik SPARC ve klasik MIPS gibi mimarilerde görülmüştür. Modern ISA tasarımlarında yaygın değildir. Derin ve dinamik pipeline'larda donanımsal branch prediction daha uygundur.
Geciktirilmiş yük
Benzer biçimde bazı eski pipeline tasarımlarında load sonucunun bir sonraki komutta kullanılamaması ISA'ya görünür hale getirilmiştir.
Modern işlemciler bu tür gecikmeleri forwarding, stall ve dinamik zamanlama ile gizlemeye çalışır.
RISC ve pipeline
Düzenli komut formatı ve load/store modeli pipeline tasarımını kolaylaştırır.
Ancak modern performans yalnız ISA'nın RISC olmasına bağlı değildir.
Asıl faktörler:
- branch prediction,
- cache hit rate,
- instruction window,
- yürütme genişliği,
- bellek gecikmesi,
- veri bağımlılıkları,
- out-of-order yürütme,
- güç ve ısı sınırlarıdır.
Out-of-order execution
Program sırası:
I1
I2
I3
I4olsa bile bağımsız komutlar kaynakları hazır olduğunda farklı sırada yürütülebilir.
İşlemci mimari görünümü korumak için sonuçları program sırasına uygun biçimde retire edebilir.
Bu yaklaşım bellek ve yürütme gecikmelerinin bir bölümünü gizler.
Register renaming
WAR ve WAW gibi sahte bağımlılıklar fiziksel yazmaç yeniden adlandırmasıyla kaldırılabilir.
Mimari yazmaç:
R1farklı zamanlarda farklı fiziksel yazmaçlara eşlenebilir.
Bu sayede daha fazla bağımsız komut eşzamanlı yürütülebilir.
Vektör işleme
Vektör işlemci aynı işlemi bir veri dizisinin çok sayıda elemanına uygular.
Örnek:
C[i] = A[i] + B[i]Skaler işlemci bunu eleman eleman yürütür.
Vektör işlemci çok sayıda elemanı tek vektör komutuyla ifade eder.
Skaler ve vektörel işleme
Skaler:
LOAD A[i]
LOAD B[i]
ADD
STORE C[i]işlemlerini her eleman için tekrarlar.
Vektörel biçim:
VLOAD V1, A
VLOAD V2, B
VADD V3, V1, V2
VSTORE C, V3şeklinde kavramsallaştırılabilir.
Vektör komutu tek instruction ile çok sayıda eleman üzerinde işlem tanımlar.
SIMD ve vektör mimarisi
SIMD ve vector processing yakın kavramlardır fakat tamamen aynı değildir.
Klasik SIMD uzantılarında sabit genişlikli yazmaçlar kullanılır:
- x86 SSE/AVX ailesi,
- Arm NEON.
Modern vektör ISA'ları daha esnek uzunluk modelleri sunabilir:
- RISC-V Vector Extension,
- Arm SVE/SVE2.
RISC-V V uzantısı vektör yazmaç uzunluğunu gerçekleştirim parametresi olarak ele alır ve yazılımı farklı fiziksel vektör uzunluklarına taşınabilir biçimde yazmayı amaçlar.
Vektör uzunluğu
Bir problemde kalan eleman sayısı fiziksel vektör kapasitesinden küçük veya büyük olabilir.
Vektör uzunluğu denetimiyle işlem parçalara bölünür.
Bu işleme klasik olarak strip mining denir.
while eleman_kaldi:
VL = uygun_uzunluk
vektor_isle(VL)Maskeli vektör işlemleri
Her elemanın işlenmesi gerekmeyebilir.
Maske:
1 1 0 1 0 1 ...gibi hangi lane'lerin etkin olduğunu gösterir.
Koşullu veri paralelliğinde branch sayısını azaltabilir.
Chaining
Bir vektör işleminin ilk sonuçları üretilir üretilmez sonraki vektör birimine aktarılabilir.
Örneğin:
V1 = A + B
V2 = V1 * Cilk toplama sonuçlarının tüm vektör tamamlanmadan çarpma birimine aktarılması chaining yaklaşımıdır.
Bellek bankalama ve interleaving
Vektör işlemcinin yüksek veri hızına ulaşabilmesi için bellek sistemi de yeterli bant genişliğini sağlamalıdır.
Bellek çok sayıda bağımsız bankaya ayrılabilir.
Ardışık adresler farklı bankalara dağıtılır:
adres 0 -> bank 0
adres 1 -> bank 1
adres 2 -> bank 2
...Bu sayede eşzamanlı veya örtüşmeli bellek erişimleri yapılabilir.
Matris çarpımı
Matris çarpımı:
C[i,j] = Σ A[i,k] B[k,j]yoğun çarpma-toplama işlemleri içerir.
Modern işlemciler:
- SIMD,
- vector,
- FMA,
- matrix/tensor units
ile bu işlemleri hızlandırabilir.
İç çarpım
İki vektörün iç çarpımı:
S = Σ A[i] B[i]işlemidir.
Bu işlem:
- eleman bazında çarpım,
- reduction toplamı
gerektirir.
Makine öğrenmesi, sinyal işleme ve bilimsel hesaplamada temel işlemlerden biridir.
Dizi işlemciler
Klasik array processor çok sayıda aynı tür işlem elemanını düzenli yapı halinde kullanır.
Modern karşılıkları arasında:
- GPU'lar,
- AI hızlandırıcıları,
- vektör ve matris işlem birimleri
bulunur.
GPU modeli
GPU'lar büyük miktarda veri paralelliği için tasarlanmıştır.
CPU düşük gecikmeli genel amaçlı kontrol akışında güçlüyken GPU:
- çok sayıda thread,
- geniş SIMD/SIMT benzeri yürütme,
- yüksek bellek bant genişliği
ile throughput odaklı işlerde etkilidir.
Süper bilgisayarlar
Süper bilgisayarlar yüksek performanslı hesaplama için:
- çok sayıda CPU/GPU,
- yüksek bant genişlikli bellek,
- hızlı düğümler arası ağ,
- paralel dosya sistemi,
- büyük ölçekli soğutma ve güç altyapısı
kullanır.
Performans özellikle yüzen nokta işlemlerinde FLOPS ile ifade edilir:
GFLOPS = 10^9 FLOP/s
TFLOPS = 10^12 FLOP/s
PFLOPS = 10^15 FLOP/s
EFLOPS = 10^18 FLOP/sFLOPS tek başına bütün uygulamaların performansını göstermez. Bellek bant genişliği, iletişim gecikmesi ve ölçeklenebilirlik de belirleyicidir.
Ünite 3: Bilgisayar Aritmetiği
Sayı gösterimleri
İşlemci sayıları sonlu sayıda bit ile temsil eder.
Bu nedenle bilgisayar aritmetiği matematiksel tamsayı veya reel sayı aritmetiğinin birebir karşılığı değildir.
Başlıca gösterimler:
- işaretsiz tamsayı,
- işaretli-genlik,
- bir'in tümleyeni,
- iki'nin tümleyeni,
- sabit nokta,
- yüzen nokta.
İşaretsiz sayılar
n bitlik işaretsiz sayının aralığı:
0 ... 2^n - 18 bit için:
0 ... 255İşaretli-genlik
En anlamlı bit işareti gösterir:
0 -> pozitif
1 -> negatifKalan bitler büyüklüğü gösterir.
8 bit signed magnitude:
+127 ... -127aralığını temsil eder.
İki ayrı sıfır vardır:
00000000 = +0
10000000 = -0Bu nedenle genel amaçlı tamsayı aritmetiğinde tercih edilmez.
Bir'in tümleyeni
Negatif sayı pozitif sayının bütün bitleri ters çevrilerek elde edilir.
Bu gösterimde de +0 ve -0 bulunur.
Tarihsel önemi vardır ancak modern genel amaçlı CPU'larda signed integer için baskın yöntem değildir.
İki'nin tümleyeni
Modern işlemcilerde signed integer gösteriminin temelidir.
Negatif sayı:
~x + 1ile elde edilir.
n bit aralık:
-2^(n-1) ... 2^(n-1)-18 bit:
-128 ... +127Tek sıfır vardır ve toplama-çıkarma donanımı daha düzenlidir.
İşaret genişletme
Daha küçük signed değer daha geniş biçime çevrilirken işaret biti kopyalanır.
8 bit:
1111000016 bite:
11111111 11110000şeklinde genişletilir.
İşaretsiz genişletmede ise üst bitler sıfır yapılır.
Toplama
İki'nin tümleyeninde toplama normal ikili toplayıcıyla yapılabilir.
Örnek:
00000101 5
+ 11111101 -3
-----------
00000010 2Üstten taşan carry bitinin signed sonuç açısından doğrudan anlamı yoktur.
Signed overflow
Aynı işaretli iki operand toplanıp farklı işaretli sonuç oluşursa overflow vardır.
Pozitif + pozitif -> negatif:
01111111 + 00000001 = 100000008 bit signed sonuç temsil edilemez.
Çıkarma
İki'nin tümleyeninde:
A - B = A + (-B)kullanılır.
Bu nedenle ayrı büyük bir çıkarma donanımı yerine toplayıcı ve komplement mantığı paylaşılabilir.
Çarpma
İkili çarpmanın en temel biçimi shift-and-add yaklaşımıdır.
Örnek:
1011
x 0011
----------
1011
1011
----------
100001Yani:
11 x 3 = 33Her multiplier biti için:
- bit
1ise multiplicand eklenir, - bit
0ise ekleme yapılmaz, - uygun kaydırma uygulanır.
Donanımsal çarpma
Bir çarpma birimi tipik olarak:
- multiplicand register,
- multiplier register,
- accumulator,
- shifter,
- adder
bileşenleriyle gerçekleştirilebilir.
Modern yüksek performanslı işlemciler daha hızlı ağaç toplayıcılar, Booth kodlama ve pipeline çarpıcılar kullanabilir.
Booth algoritması
Booth algoritması iki'nin tümleyeni signed çarpma için ardışık 1 bitlerini daha az toplama/çıkarma işlemine dönüştürebilir.
Temel gözlem:
00111100gibi ardışık bir grup:
01000000 - 00000100biçiminde ifade edilebilir.
Bu teknik donanımsal çarpma tasarımında tarihsel ve kuramsal öneme sahiptir.
Bölme
İkili bölme ardışık:
- karşılaştırma,
- çıkarma,
- kaydırma
işlemleriyle gerçekleştirilebilir.
Klasik iki yöntem:
- restoring division,
- non-restoring division.
Restoring division
Kısmi kalan bölen çıkarıldıktan sonra negatif olursa eski değer geri yüklenir.
Kavramsal akış:
kalanı kaydır
böleni çıkar
eğer sonuç >= 0:
bölüm biti = 1
aksi halde:
bölüm biti = 0
kalanı geri yükleNon-restoring division
Negatif sonuçta hemen geri yükleme yapılmaz. Sonraki adımda çıkarma yerine toplama yapılarak işlem sürdürülür.
Amaç restore işlemlerinin bir bölümünü azaltmaktır.
Sıfıra bölme
Tamsayı veya yüzen nokta aritmetiğinde sıfıra bölmenin davranışı veri tipine ve mimariye göre farklıdır.
Tamsayı bölmede çoğu ISA exception veya tanımlanmış özel sonuç üretir.
IEEE 754 yüzen nokta aritmetiğinde sıfıra bölme, sonsuzluk ve exception flag gibi tanımlanmış davranışlara sahip olabilir.
Sabit nokta
Sabit noktalı gösterimde binary point konumu önceden kabul edilir.
Örneğin 8 bit sayının 4 biti tamsayı, 4 biti kesir için kullanılabilir.
Avantajları:
- basit donanım,
- deterministik ölçek,
- düşük enerji maliyeti.
Dezavantajı sınırlı dinamik aralıktır.
DSP ve gömülü sistemlerde halen önemlidir.
Yüzen nokta
Yüzen nokta sayı genel olarak:
(-1)^s x significand x radix^exponentbiçiminde ifade edilir.
Modern sistemlerin temel standardı IEEE 754'tür.
IEEE 754 binary32
32 bit tek duyarlıklı gösterim:
1 bit işaret
8 bit exponent
23 bit fractionNormal sayı:
(-1)^s x 1.fraction x 2^(exponent-127)biçimindedir.
IEEE 754 binary64
64 bit double precision:
1 bit işaret
11 bit exponent
52 bit fractionBias:
1023olarak kullanılır.
Özel değerler
IEEE 754:
+0,-0,+∞,-∞,- NaN,
- subnormal
değerlerini tanımlar.
Bu yapı taşma, çok küçük sayılar ve tanımsız işlemlerin kontrollü temsilini sağlar.
Yüzen nokta toplama
İki yüzen nokta sayının toplama işlemi:
- özel durumları kontrol et,
- üsleri karşılaştır,
- küçük significand'ı kaydır,
- significand'ları topla veya çıkar,
- normalize et,
- yuvarla,
- sonucu paketle.
Örneğin:
1.25 x 2^3
0.75 x 2^2önce ortak üsse getirilir.
Yüzen nokta çarpma
Çarpma:
sign = signA XOR signB
exponent = exponentA + exponentB - bias
significand = significandA x significandBtemeline dayanır.
Ardından:
- normalize,
- yuvarlama,
- overflow/underflow kontrolü
yapılır.
Yüzen nokta bölme
Bölme:
sign = signA XOR signB
exponent = exponentA - exponentB + bias
significand = significandA / significandBtemeline dayanır.
Sonuç tekrar normalize edilir ve yuvarlanır.
Yuvarlama
Sonlu bit genişliği nedeniyle bütün reel sayılar tam gösterilemez.
IEEE 754 çeşitli yuvarlama yönleri tanımlar.
Yaygın varsayılan:
round to nearest, ties to even.
Yuvarlama hataları birden fazla işlem boyunca birikebilir.
Fused multiply-add
FMA:
a x b + cişlemini ara çarpımı ayrı yuvarlamadan tek birleşik işlemle hesaplar.
Bu:
- daha yüksek doğruluk,
- daha yüksek performans
sağlayabilir.
Modern CPU, GPU ve vektör ISA'larında temel sayısal işlemdir.
Ünite 4: Giriş-Çıkış Organizasyonu
Giriş-çıkış sisteminin amacı
CPU ve ana bellek yüksek hızlı elektronik birimlerdir. Dış aygıtlar ise:
- farklı veri genişliklerine,
- farklı hızlara,
- farklı protokollere,
- farklı hata davranışlarına
sahiptir.
G/Ç organizasyonu bu farkları denetleyici ve arabirim katmanlarıyla yönetir.
Modern G/Ç aygıtları
Klasik aygıtlar:
- klavye,
- yazıcı,
- manyetik disk,
- optik disk,
- seri terminal
olarak ele alınmıştır.
Güncel sistemlerde bunlara:
- NVMe SSD,
- ağ arabirimi,
- GPU,
- USB aygıtı,
- kamera,
- ses arabirimi,
- hızlandırıcı,
- sensör,
- PCI Express aygıtı
eklenir.
Temel mimari problem değişmez: işlemci ile çevre birimi arasında veri ve kontrol aktarımı.
Karakter kodlama
ASCII 7 bitlik tarihsel karakter kodudur ve 128 kod noktası tanımlar.
Modern metin sistemlerinde temel standart Unicode'dur.
UTF-8, Unicode karakterlerini değişken uzunluklu bayt dizileriyle kodlar ve ASCII'nin ilk 128 koduyla geriye dönük uyumludur.
Bu nedenle güncel G/Ç sistemlerinde yalnız ASCII varsayımı yeterli değildir.
G/Ç arabirimi
Bir aygıt denetleyicisi tipik olarak şu mantıksal register'ları sunabilir:
- data register,
- status register,
- control/command register.
CPU bunlara:
- port tabanlı I/O,
- memory-mapped I/O
üzerinden erişebilir.
Sistem yolu
Klasik veri yolu modeli üç bileşen içerir:
- adres yolu,
- veri yolu,
- kontrol yolu.
Modern sistemlerde PCI Express gibi paket tabanlı seri bağlantılar klasik paralel bus modelinden farklı fiziksel yapıya sahiptir. Yine de adres, veri ve kontrolün mantıksal ayrımı öğretici olmaya devam eder.
G/Ç komutları
Aygıta gönderilen işlemler kavramsal olarak:
- kontrol,
- durum sorgulama,
- veri okuma,
- veri yazma
sınıflarına ayrılabilir.
Isolated I/O
Port-mapped veya isolated I/O yaklaşımında G/Ç ayrı adres uzayına sahiptir.
CPU özel I/O komutları kullanabilir.
x86 mimarisindeki IN ve OUT komutları tarihsel örnektir.
Memory-mapped I/O
MMIO'da aygıt register'ları işlemcinin adres uzayında görünür.
Normal load/store komutları aygıt register'larına erişebilir.
Kavramsal olarak:
0x0000... -> RAM
...
0xF000... -> device registerAdres aralığının özellikleri sıradan RAM'den farklı olabilir.
MMIO erişimleri:
- cache edilmemeli veya özel cache politikası kullanmalı,
- yeniden sıralama kurallarına dikkat etmeli,
- uygun memory barrier gerektirebilir.
Strobe kontrolü
Basit asenkron veri aktarımında tek kontrol işareti kullanılabilir.
Kaynak veriyi bus'a koyar ve strobe işareti üretir.
Bu yaklaşım tarafların zamanlama varsayımlarına bağlıdır.
Handshake
El sıkışma iki taraflı denetim kullanır.
Tipik akış:
Kaynak: veri hazır
Alıcı : kabul edildi
Kaynak: isteği kaldır
Alıcı : onayı kaldırBu yöntem farklı hızdaki aygıtların güvenilir haberleşmesini sağlar.
Senkron iletişim
Senkron aktarım ortak saat veya zamanlama ilişkisine dayanır.
Taraflar bit ve veri sınırlarını aynı zaman referansıyla belirler.
Asenkron seri iletişim
UART benzeri yapıda ortak sürekli clock hattı gerekmez.
Tipik karakter çerçevesi:
start bit
data bits
optional parity
stop bit(s)Alıcı ve verici önceden belirlenen baud rate üzerinde anlaşır.
Seri ve paralel iletişim
Paralel iletişim aynı anda birden fazla bit hattı kullanır.
Seri iletişim bitleri daha az fiziksel hat üzerinden ardışık taşır.
Modern yüksek hızlı sistemlerde seri bağlantılar baskındır:
- PCI Express,
- SATA,
- USB,
- Ethernet.
Yüksek hızlı seri bağlantılar clock recovery, encoding ve çoklu lane kullanarak çok yüksek bant genişliği sağlar.
FIFO
FIFO:
First In, First Outprensibiyle çalışan kuyruktur.
G/Ç arabirimlerinde hız farkını dengelemek için tampon olarak kullanılır.
Gönderici kısa süreli burst ile veri üretebilir, alıcı kendi hızında FIFO'dan tüketebilir.
Program kontrollü I/O
CPU aygıt durumunu sürekli kontrol eder.
while NOT ready:
status oku
data transfer etBu yöntem polling olarak da bilinir.
Basit ama bekleme sırasında CPU zamanı tüketebilir.
Kesinti kontrollü I/O
CPU işlemi başlatır ve başka işe geçer.
Aygıt hazır olduğunda kesinti üretir.
I/O başlat
↓
başka iş çalıştır
↓
interrupt
↓
ISRPolling maliyetini azaltır.
Polling ne zaman yararlı olabilir?
Polling tamamen kötü değildir.
Çok düşük gecikmeli aygıtlarda kesinti ve context switch maliyeti aygıtın bekleme süresinden büyük olabilir.
Bu nedenle bazı yüksek performanslı ağ ve depolama sistemleri:
- interrupt,
- interrupt coalescing,
- polling,
- hibrit teknikler
kullanabilir.
DMA
Direct Memory Access, aygıtın CPU'nun her kelimeyi taşımasına gerek kalmadan ana bellekle veri transferi yapmasını sağlar.
CPU:
- buffer adresini,
- veri uzunluğunu,
- yönü,
- denetim bilgilerini
DMA motoruna verir.
DMA aktarımı tamamlandığında kesinti üretilebilir.
DMA adresleri
Modern sistemde şu adresler aynı olmak zorunda değildir:
- CPU virtual address,
- CPU physical address,
- device DMA address.
IOMMU aygıtların DMA adreslerini fiziksel belleğe eşleyebilir.
Bu:
- izolasyon,
- sanallaştırma,
- scatter-gather,
- güvenlik
açısından önemlidir.
Cache ve DMA
Aygıt DMA ile belleği güncellerken CPU cache'lerinde aynı verinin eski kopyası bulunabilir.
Platforma göre:
- coherent DMA,
- non-coherent DMA
modelleri vardır.
Coherent sistemlerde donanım CPU ile aygıt görünümünü büyük ölçüde tutarlı tutabilir.
Non-coherent sistemlerde yazılımın cache temizleme ve invalidation işlemleri yapması gerekebilir.
Memory ordering ayrı bir konudur. Coherence bulunsa bile doğru bariyerler gerekebilir.
DMA kontrolörü
Klasik DMA denetleyicisi:
- source/destination address,
- word count,
- mode,
- status
register'larına sahip olabilir.
Modern aygıtlar çoğunlukla kendi bus-master DMA motorlarını içerir.
Örneğin yüksek hızlı NIC veya NVMe denetleyicisi descriptor ring üzerinden çok sayıda isteği bağımsız işler.
Bus mastering
Bus-master aygıt veri yolu üzerinde işlem başlatabilir.
CPU her veri transferini tek tek yürütmez.
PCI Express tabanlı aygıtlar bu yaklaşımın modern örnekleridir.
Kesinti önceliği
Birden fazla aygıt aynı anda kesinti isteyebilir.
Sistem:
- öncelik,
- maskeleme,
- yönlendirme
mekanizmasına ihtiyaç duyar.
Daisy chain
Klasik papatya zinciri önceliğinde onay sinyali aygıtlardan sırayla geçer.
Önceki aygıtlar daha yüksek sabit önceliğe sahip olabilir.
Basit ancak ölçeklenebilirliği sınırlıdır.
Paralel öncelik
Tüm kesinti istekleri merkezi öncelik mantığına gelir.
Priority encoder en yüksek öncelikli isteği seçer.
Modern sistemlerde programlanabilir interrupt controller yapıları daha gelişmiştir.
MSI ve MSI-X
PCI Express sistemlerinde aygıt fiziksel kesinti hattı yerine belleğe özel mesaj yazımıyla kesinti üretebilir.
MSI - Message Signaled Interrupts ve MSI-X:
- daha fazla kesinti vektörü,
- çok çekirdekli yönlendirme,
- yüksek performanslı aygıtlar
için uygundur.
I/O işlemcileri
Klasik I/O processor, G/Ç işlerini CPU'dan bağımsız yürüten programlanabilir işlemcidir.
Güncel sistemlerde benzer düşünce:
- storage controller,
- network processor,
- SmartNIC,
- DPU,
- GPU command processor
gibi özel işlemcilerde devam eder.
Temel amaç CPU'nun veri taşıma ve protokol yönetimi yükünü azaltmaktır.
Ünite 5: Ana Bellek Organizasyonu
Bellek hiyerarşisi
İşlemci performansının temel sorunlarından biri işlemci ile bellek arasındaki hız farkıdır.
Bellek hiyerarşisi:
CPU registers
↓
L1 cache
↓
L2 cache
↓
L3 / LLC
↓
DRAM
↓
SSD
↓
yüksek kapasiteli kalıcı depolama
↓
arşivşeklinde düşünülebilir.
Yukarı doğru:
- hız artar,
- kapasite azalır,
- bit başına maliyet artar.
Yerellik
Cache'in çalışmasını sağlayan temel davranış locality of reference özelliğidir.
İki tür yerellik vardır:
Temporal locality: Yakın zamanda kullanılan verinin yeniden kullanılma olasılığı yüksektir.
Spatial locality: Bir adrese erişildiğinde yakın adreslere erişilme olasılığı yüksektir.
Örnek:
for i = 0..N:
sum += A[i]ardışık dizi erişimi güçlü spatial locality gösterir.
SRAM
Static RAM hücreleri flip-flop benzeri devrelerle oluşturulur.
Özellikleri:
- refresh gerekmez,
- hızlıdır,
- hücre başına daha fazla transistor kullanır,
- yoğunluğu DRAM'den düşüktür,
- bit başına maliyeti yüksektir.
CPU cache'lerinde yaygın olarak SRAM kullanılır.
DRAM
Dynamic RAM bilgiyi kapasitif yük olarak saklar.
Özellikleri:
- periyodik refresh gerekir,
- yüksek yoğunluk sağlar,
- bit başına SRAM'den ucuzdur,
- ana bellekte yaygındır.
Modern DRAM sistemleri kanallar, rank'ler, bankalar ve row buffer yapılarıyla çok daha karmaşıktır.
ROM ve firmware
ROM ailesi değişmeyen veya nadiren güncellenen bilgiyi kalıcı olarak saklamak için kullanılır.
Modern sistemlerde firmware çoğunlukla yeniden programlanabilir flash bellekte tutulur.
Başlangıçta firmware:
- işlemci ve donanımı ilkler,
- bellek ve aygıtları hazırlar,
- boot sürecini başlatır,
- işletim sistemi yükleyicisine kontrol verir.
PC sistemlerinde BIOS'un modern karşılığı büyük ölçüde UEFI firmware'dir.
Kalıcı depolama
Klasik manyetik diskler halen kullanılır ancak genel amaçlı istemci ve sunucularda SSD önemli konuma gelmiştir.
Başlıca teknolojiler:
- HDD,
- SATA SSD,
- NVMe SSD,
- manyetik şerit,
- optik ortamlar.
HDD
Manyetik disk mekanik hareket içerir.
Erişim süresi kabaca:
seek time
+ rotational latency
+ transfer timebileşenlerinden oluşur.
Bu nedenle rastgele erişim sıralı erişimden çok daha pahalı olabilir.
SSD
SSD'de hareketli mekanik parça yoktur.
NAND flash:
- page düzeyinde okunur/yazılır,
- daha büyük erase block düzeyinde silinir.
Denetleyici:
- logical-to-physical mapping,
- garbage collection,
- wear leveling,
- error correction
işlerini yönetir.
NVMe, PCI Express üzerinde yüksek paralellik ve çoklu kuyruk desteği sağlayan modern depolama protokolüdür.
Manyetik şerit
Manyetik tape rastgele erişim için uygun değildir ancak:
- çok yüksek kapasite,
- düşük bit başına maliyet,
- uzun süreli arşiv
için günümüzde de kullanılır.
Bu nedenle eski bir teknoloji olmasına rağmen tamamen kullanım dışı değildir.
Associative memory
CAM - Content Addressable Memory, adresle değil içerikle arama yapar.
Normal RAM:
adres -> veriCAM:
aranan veri -> eşleşen girişşeklinde çalışır.
Çok sayıda karşılaştırma paralel gerçekleştirilebilir.
CAM kullanım alanları
CAM pahalı ve enerji yoğun olduğundan genel ana bellek olarak kullanılmaz.
Başlıca kullanım alanları:
- TLB,
- ağ yönlendirme tabloları,
- belirli cache tag arama yapıları,
- yüksek hızlı eşleşme donanımlarıdır.
Cache
Cache ana belleğin yakın zamanda gerekli olma olasılığı yüksek bloklarını daha hızlı bellekte tutar.
CPU adres ürettiğinde:
- ilgili cache set'i bulunur,
- tag karşılaştırılır,
- hit veya miss belirlenir.
Cache line
Cache veriyi tek kelime yerine bloklar halinde taşır.
Bu bloğa cache line denir.
Spatial locality sayesinde komşu baytların birlikte getirilmesi faydalı olabilir.
Hit ve miss
Aranan veri cache'te bulunursa hit.
Bulunmazsa miss oluşur.
Hit rate:
Hit rate =
cache hit sayısı
-----------------
toplam erişimMiss rate:
1 - hit rateOrtalama bellek erişim süresi
Basit model:
AMAT =
Hit time
+ Miss rate x Miss penaltyÖrneğin:
Hit time = 1 ns
Miss rate = 0.05
Miss penalty = 60 nsise:
AMAT = 1 + 0.05 x 60
= 4 nsolur.
Direct-mapped cache
Her ana bellek bloğu yalnız bir cache satırına gidebilir.
cache index =
block number mod number of linesAvantaj:
- basit,
- hızlı.
Dezavantaj:
- conflict miss olasılığı yüksektir.
Fully associative cache
Bir blok cache içindeki herhangi bir satıra yerleştirilebilir.
Avantaj:
- conflict miss en düşük.
Dezavantaj:
- çok sayıda tag'in paralel karşılaştırılması pahalıdır.
Set-associative cache
Direct-mapped ile fully associative arasında dengedir.
N-way set associative cache'te blok belirli bir sete gider ancak o set içindeki N yoldan herhangi birine yerleşebilir.
Modern CPU cache'lerinde yaygın yaklaşımdır.
Cache adres alanları
Adres genellikle:
tag | index | block offsetalanlarına ayrılır.
offset: cache line içindeki baytı seçer,index: set'i seçer,tag: doğru memory block olup olmadığını doğrular.
Replacement
Set doluysa hangi line'ın çıkarılacağı seçilir.
Politikalar:
- LRU,
- pseudo-LRU,
- random,
- FIFO benzeri yaklaşımlar.
Gerçek işlemciler alan, enerji ve gecikme nedeniyle çoğu zaman tam LRU kullanmaz.
Write-through
Her cache write ana belleğe veya alt cache seviyesine de gönderilir.
Avantaj:
- alt seviye daha güncel kalır.
Dezavantaj:
- write trafiği yüksektir.
Write-back
Yazma önce cache içinde yapılır.
Line dirty olarak işaretlenir.
Line çıkarılırken alt seviyeye yazılır.
Avantaj:
- daha az bellek yazma trafiği.
Dezavantaj:
- coherence ve replacement yönetimi daha karmaşıktır.
Write allocate
Write miss olduğunda line cache'e getirilir ve sonra yazılır.
Write-back cache'lerle sık kullanılır.
No-write allocate
Write miss doğrudan alt seviyeye gönderilebilir ve line cache'e alınmaz.
Bazı write-through tasarımlarla kullanılabilir.
Çok seviyeli cache
Modern CPU:
- küçük ve hızlı L1,
- daha büyük L2,
- daha büyük LLC
kullanabilir.
L1 çoğu işlemcide:
- instruction cache,
- data cache
olarak ayrılır.
Alt seviyelerde birleşik cache yaygındır.
Sanal bellek
Sanal bellek her sürece bağımsız bir sanal adres alanı sunar.
Programın gördüğü adres:
virtual addressMMU tarafından:
physical addressdeğerine çevrilir.
Sayfalama
Sanal bellek sabit boyutlu sayfalara bölünür.
Fiziksel bellek aynı boyutlu frame'lerden oluşur.
virtual address =
virtual page number + offsetPage table:
VPN -> PFNeşlemesini sağlar.
Çok düzeyli sayfa tabloları
64 bit adres alanında tek büyük page table çok fazla bellek kullanabilir.
Bu nedenle sayfa tabloları hiyerarşik düzeylere ayrılır.
Yalnız kullanılan adres alanları için alt tablolar oluşturulur.
TLB
Page table erişimini her memory operation'da yapmak pahalıdır.
TLB - Translation Lookaside Buffer, yakın adres dönüşümlerini cache'ler.
TLB hit:
virtual page -> physical framedönüşümünü hızlı sağlar.
Page fault
Sanal adres geçerli ancak fiziksel bellekte bulunmuyorsa page fault oluşabilir.
İşletim sistemi gerekli sayfayı:
- depolamadan,
- dosyadan,
- zero-fill kaynaktan
hazırlayabilir.
Geçersiz erişim de page fault/trap üretir fakat sonuç süreç hatası olabilir.
Sayfa değiştirme
Bellek doluysa bir frame'in boşaltılması gerekebilir.
Klasik algoritmalar:
- FIFO,
- LRU,
- Clock/Second Chance.
FIFO
Belleğe en eski giren sayfayı çıkarır.
Basit fakat erişim örüntüsünü dikkate almaz.
Belady anomalisi oluşabilir: bazı erişim dizilerinde daha fazla frame daha fazla page fault üretebilir.
LRU
En uzun süredir kullanılmayan sayfayı çıkarır.
Temporal locality fikrine uygundur.
Tam LRU uygulaması pahalıdır. Gerçek sistemler çoğu zaman yaklaşık yöntemler kullanır.
MMU
Memory Management Unit:
- adres çevirme,
- sayfa izinleri,
- ayrıcalık denetimi
işlerini yürütür.
Page table entry'lerde:
- present/valid,
- read/write,
- execute,
- user/supervisor,
- accessed,
- dirty
gibi bitler bulunabilir.
Bellek koruması
Sayfa izinleri:
R = read
W = write
X = executeşeklinde tanımlanabilir.
Kod sayfalarının yazılamaması veya veri sayfalarının çalıştırılamaması güvenlik açısından önemlidir.
Ünite 6: Çoklu İşlemci Yapıları
Çoklu işlemcilerin amacı
Tek çekirdeğin saat frekansını sürekli artırmak:
- güç tüketimi,
- ısı,
- memory wall,
- instruction-level parallelism sınırları
nedeniyle giderek zorlaşmıştır.
Performans artışı büyük ölçüde çok çekirdek ve paralel işlemeye yönelmiştir.
Çok işlemci ve çok bilgisayar
Klasik ayrım:
Multiprocessor: İşlemciler ortak sistem içinde kaynak paylaşır.
Multicomputer: Bağımsız bilgisayarlar ağ üzerinden haberleşir.
Modern dünyada sınır daha esnektir.
Tek sunucu:
- onlarca veya yüzlerce CPU çekirdeği,
- birden fazla NUMA düğümü,
- GPU'lar
içerebilir.
Bir küme ise çok sayıda sunucuyu hızlı ağla birleştirir.
Çoklu işleme
Birden fazla işlemci veya çekirdeğin aynı sistemde farklı instruction stream'leri çalıştırması MIMD modeline karşılık gelir.
İşlemciler:
- farklı süreçleri,
- farklı thread'leri,
- aynı paralel uygulamanın farklı bölümlerini
çalıştırabilir.
Paralel hesaplama
Bir program P işlemciye bölündüğünde teorik hızlanma sınırsız değildir.
Amdahl yasası:
Speedup =
1
------------------------
(1 - f) + f / PBurada:
f: paralelleştirilebilir oran,P: işlemci sayısıdır.
Programın yüzde 95'i paralel ise sonsuz işlemcide bile ideal üst sınır:
1 / 0.05 = 20kat olur.
Bu nedenle seri bölüm kritik önemdedir.
Paylaşımlı bellek
İşlemciler ortak fiziksel adres uzayına erişir.
İletişim:
shared variablesüzerinden sağlanabilir.
Avantaj:
- programlama modeli doğaldır.
Zorluk:
- synchronization,
- coherence,
- memory consistency,
- contention.
Dağıtık bellek
Her işlemci veya düğüm kendi yerel belleğine sahiptir.
Uzak veri mesajlaşmayla alınır.
Node A <-- network --> Node BMPI tabanlı yüksek performanslı hesaplama bunun temel örneğidir.
UMA
Uniform Memory Access sisteminde tüm işlemciler için ana bellek erişim maliyeti yaklaşık aynıdır.
Küçük SMP sistemlerinde klasik modeldir.
NUMA
Non-Uniform Memory Access sisteminde bellek fiziksel olarak düğümlere dağılmıştır.
CPU kendi yerel belleğine daha hızlı erişir.
CPU0 -- local memory 0
|
interconnect
|
CPU1 -- local memory 1İki CPU aynı global adres uzayını görebilir ancak uzak düğüm erişimi daha pahalıdır.
Bu nedenle thread ve memory placement performansı etkiler.
Bağlantı yapıları
İşlemci, bellek ve aygıtlar arasında çeşitli interconnect topolojileri kullanılabilir:
- shared bus,
- multiport memory,
- crossbar,
- multistage network,
- mesh,
- ring,
- torus,
- hypercube.
Modern işlemci paketlerinde Network-on-Chip yaklaşımı önemli hale gelmiştir.
Ortak bus
Bütün işlemciler tek shared bus kullanır.
Avantaj:
- basit,
- snooping kolay.
Dezavantaj:
- işlemci sayısı arttıkça bant genişliği darboğazı oluşur.
Bu nedenle küçük sistemlerde uygundur.
Multiport memory
Bellek aynı anda birden fazla erişim portu sağlar.
Avantaj:
- paralel erişim.
Dezavantaj:
- donanım maliyeti hızla büyür.
Crossbar
P işlemci ile M bellek modülü arasında çok sayıda bağımsız bağlantı yolu sağlayabilir.
Farklı işlemciler farklı memory bank'lere aynı anda erişebilir.
Bağlantı sayısı büyük sistemlerde pahalı hale gelir.
Multistage interconnection network
Crossbar maliyetini azaltmak için birden fazla küçük switch katmanı kullanılır.
Örnek:
- Omega network,
- butterfly benzeri ağlar.
Tam crossbar kadar bağlantı sunmaz fakat daha düşük donanım maliyetine sahiptir.
Hypercube
2^n düğümlü hypercube'da her düğüm n komşuya bağlanır.
Düğümlerin binary adresleri yalnız bir bit farklıysa doğrudan komşudur.
Örneğin 3 boyutlu hypercube:
000
001
010
011
100
101
110
111sekiz düğüm içerir.
Hypercube tarihsel olarak önemli paralel bilgisayar topolojilerindendir.
Güncel on-chip interconnect
Modern çok çekirdekli işlemciler:
- ring,
- mesh,
- fabric
tabanlı bağlantılar kullanabilir.
Amaç:
- core,
- LLC slice,
- memory controller,
- I/O
arasında ölçeklenebilir bağlantı sağlamaktır.
Bus arbitration
Bir shared bus aynı anda tek master tarafından kullanılabiliyorsa erişim sıralanmalıdır.
Arbitration hedefleri:
- karşılıklı dışlama,
- adalet,
- düşük gecikme,
- starvation önleme.
Sabit öncelik
En yüksek öncelikli istek her zaman önce seçilir.
Basittir ancak düşük öncelikli master starvation yaşayabilir.
Round-robin
Öncelik her grant sonrasında döndürülür.
Uzun vadede daha adil paylaşım sağlar.
Dinamik öncelik
Öncelik:
- bekleme süresi,
- trafik sınıfı,
- gerçek zamanlı gereksinim
gibi ölçütlere göre değişebilir.
İşlemciler arası haberleşme
Paylaşımlı bellek sisteminde iletişim ortak bellek üzerinden yapılabilir.
Örnek:
P1:
data = 42
flag = 1
P2:
flag'i bekle
data'yı okuAncak modern işlemciler memory operation'ları yeniden sıralayabildiği için yalnız bu kodun yazılması her mimaride yeterli olmayabilir.
Atomik işlemler
Synchronization için donanım atomik işlemler sağlar.
Örnekler:
- compare-and-swap,
- swap/exchange,
- fetch-and-add,
- load-linked/store-conditional,
- atomic memory operations.
Bu işlemler lock ve lock-free algoritmaların temelini oluşturur.
Kritik bölge
Paylaşılan durumun tutarlılığını korumak için aynı anda yalnız bir thread'in girmesi gereken kod parçası kritik bölgedir.
Temel koşul:
aynı kritik bölgede aynı anda en fazla bir yürütücüSemafor
Semafor bir synchronization soyutlamasıdır.
İkili semafor:
0 veya 1değeriyle mutual exclusion amacıyla kullanılabilir.
Saymalı semafor birden fazla eş kaynak sayısını temsil edebilir.
Semaforu yalnız normal load/store ile kontrol etmek yeterli değildir. Kontrol ve güncellemenin atomik olması gerekir.
Test-and-set
Klasik atomik ilkel işlemdir.
Kavramsal:
old = lock
lock = 1
return oldişlemi bölünemez biçimde yapılır.
Spinlock:
while test_and_set(lock):
beklebiçiminde kurulabilir.
Spinlock
Thread lock açılana kadar aktif olarak döner.
Avantaj:
- çok kısa beklemelerde sleep/wakeup maliyetini önler.
Dezavantaj:
- uzun beklemede CPU tüketir.
Bu nedenle lock seçimi kritik bölgenin süresine ve contention düzeyine göre yapılmalıdır.
Cache coherence
Her çekirdeğin özel cache'i varsa aynı bellek bloğunun birden fazla kopyası bulunabilir.
Örnek:
Core 0 L1: X = 5
Core 1 L1: X = 5
Memory : X = 5Core 0:
X = 10yazdığında Core 1 eski 5 değerini kullanmamalıdır.
Bu problem cache coherence problemidir.
Coherence gereksinimleri
Basitleştirilmiş olarak:
- bir çekirdeğin yaptığı write sonunda diğer çekirdeklerce görünür olmalıdır,
- aynı adrese yapılan write'lar bütün çekirdeklerce tutarlı sırada görülmelidir,
- aynı cache line'ın sahiplik durumu protokol tarafından yönetilmelidir.
Snooping
Küçük shared-bus sistemlerinde cache controller'lar bus işlemlerini gözler.
Bir cache line başka çekirdek tarafından yazıldığında:
- invalidate,
- update
yaklaşımı uygulanabilir.
Directory tabanlı coherence
İşlemci sayısı arttığında her cache'in bütün trafiği snoop etmesi ölçeklenmez.
Directory yapısı belirli line'ın hangi cache'lerde bulunduğunu takip edebilir.
Bu yöntem büyük NUMA ve many-core sistemlerde daha ölçeklenebilirdir.
MESI
Yaygın bir coherence protokolü dört durum kullanır:
- M - Modified
- E - Exclusive
- S - Shared
- I - Invalid
Modified line:
- yalnız bu cache'te geçerlidir,
- ana bellekten daha yeni veri içerir.
Shared line:
- birden fazla cache'te bulunabilir,
- temizdir.
Invalid line kullanılamaz.
MOESI
Bazı sistemler Owned durumu ekleyerek MOESI benzeri protokoller kullanır.
Ayrıntılar işlemci ailesine göre değişebilir.
Coherence ve consistency farkı
Cache coherence:
Tek bir bellek konumunun kopyaları nasıl tutarlı tutulur?
Memory consistency:
Farklı bellek konumlarına yapılan load/store işlemleri diğer işlemciler tarafından hangi sıralarda görülebilir?
sorusunu yanıtlar.
Bu iki kavram aynı değildir.
Memory ordering
Modern işlemciler performans için memory operation'ları yeniden sıralayabilir.
Aşağıdaki program sırası:
A = 1
B = 1başka işlemci tarafından her mimaride aynı gözlem sırasıyla görülmek zorunda değildir.
Bu nedenle synchronization kodunda:
- acquire,
- release,
- memory fence/barrier,
- atomic operation
semantiği önemlidir.
RISC-V bellek modeli
RISC-V genel amaçlı zayıf sıralamalı bellek modeli olarak RVWMO tanımlar.
Gerekli ordering FENCE ve atomik komutların acquire/release özellikleriyle oluşturulabilir.
Bu, modern çok çekirdekli mimarilerde doğru paralel program yazmanın yalnız cache coherence bilmekten daha fazlasını gerektirdiğini gösterir.
DMA ve coherence
DMA yapan aygıt da bellek üzerinde başka bir agent'tır.
CPU ile aygıtın cache/bellek görünümü tutarlı olmalıdır.
Platform:
- hardware coherent DMA,
- software managed non-coherent DMA
kullanabilir.
Bu nedenle driver doğru DMA API ve memory barrier kurallarını izlemelidir.
Genel Çerçeve
Bilgisayar mimarisi konuları tek bir performans ve doğruluk zinciri oluşturur.
Bir komutun çalışması:
Komut ISA'da tanımlanır
↓
Fetch
↓
Decode
↓
Operand erişimi
↓
Execute
↓
Cache / Memory
↓
Write-back
↓
Retireadımlarından geçebilir.
Bu sırada:
- branch prediction,
- pipeline,
- cache,
- TLB,
- memory ordering,
- interrupt,
- privilege control
aynı anda devrededir.
Bir veri G/Ç aygıtından belleğe gelirken:
Aygıt
↓
DMA
↓
Ana bellek
↓
Cache coherence
↓
CPUzinciri oluşabilir.
Çok çekirdekli sistemde aynı veri:
Core 0
↕
Cache 0
↕
Coherence fabric
↕
Cache 1
↕
Core 1üzerinden paylaşılır.
Bu nedenle bilgisayar mimarisi yalnız ALU veya komut kümesi değildir. Performans:
işlemci
+ bellek
+ veri yolu
+ G/Ç
+ paralellik
+ yazılımetkileşiminin sonucudur.