Bilgisayar Mimarisi: Komut Kümesi, Boru Hattı ve Bellek Sistemi

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], R3

Burada 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 + 2C

Fiziksel 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:

  1. veri transfer komutları,
  2. veri işleme komutları,
  3. program kontrol komutları.

Veri transfer komutları

Veri transfer komutları veriyi bir konumdan diğerine taşır.

Örnekler:

LOAD
STORE
MOVE
PUSH
POP

Kaynak 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, 10

Burada 10 immediate değerdir.

LOAD R1, 16(R2)

Burada efektif adres:

EA = R2 + 16

biç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
COMPARE

Modern 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_adres

iş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, R7

Bellek 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üresi

veya:

CPU time = IC x CPI / Clock Rate

Burada:

  • 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,
  • N veya S: negative/sign,
  • C: carry,
  • V: signed overflow.

Örneğin 8 bit işaretsiz toplamada:

250 + 20 = 270

sonuç 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 + 1

matematiksel olarak 128'dir ancak 8 bit signed aralık:

-128 ... +127

olduğ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:

  1. dönüş adresi saklanır,
  2. parametreler aktarılır,
  3. kontrol alt rutine geçer,
  4. sonuç üretilir,
  5. dönüş adresi geri alınır,
  6. ç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:

  1. mevcut komutu tamamlar veya mimarinin tanımladığı noktada durur,
  2. gerekli yürütme durumunu korur,
  3. kesinti vektöründen servis adresini bulur,
  4. ayrıcalıklı moda geçebilir,
  5. servis rutinini çalıştırır,
  6. ö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 -> WB

Burada:

  • 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_p

Pipeline kullanılmadan her iş k t_p sürüyorsa:

T_serial = n k t_p

İdeal hızlanma:

S =
n k
-------
k+n-1

n çok büyüdüğünde:

S -> k

olur.

Bu sonuç yalnız aşamalar dengeli ve stall bulunmayan ideal durum içindir.

Pipeline verimi

İdeal verim:

E = S / k

olarak 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_register

Bu 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:

  1. üsleri karşılaştır,
  2. küçük mantissayı hizala,
  3. toplama veya çıkarma yap,
  4. sonucu normalize et,
  5. 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şi

Bu 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
I4

olsa 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ç:

R1

farklı 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 * C

ilk 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:

  1. eleman bazında çarpım,
  2. 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/s

FLOPS 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 - 1

8 bit için:

0 ... 255

İşaretli-genlik

En anlamlı bit işareti gösterir:

0 -> pozitif
1 -> negatif

Kalan bitler büyüklüğü gösterir.

8 bit signed magnitude:

+127 ... -127

aralığını temsil eder.

İki ayrı sıfır vardır:

00000000 = +0
10000000 = -0

Bu 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 + 1

ile elde edilir.

n bit aralık:

-2^(n-1) ... 2^(n-1)-1

8 bit:

-128 ... +127

Tek 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:

11110000

16 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 = 10000000

8 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
----------
    100001

Yani:

11 x 3 = 33

Her multiplier biti için:

  • bit 1 ise multiplicand eklenir,
  • bit 0 ise 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:

00111100

gibi ardışık bir grup:

01000000 - 00000100

biç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ükle

Non-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^exponent

biç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  fraction

Normal 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  fraction

Bias:

1023

olarak 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:

  1. özel durumları kontrol et,
  2. üsleri karşılaştır,
  3. küçük significand'ı kaydır,
  4. significand'ları topla veya çıkar,
  5. normalize et,
  6. yuvarla,
  7. 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 significandB

temeline 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 / significandB

temeline 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 + c

iş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 register

Adres 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ır

Bu 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 Out

prensibiyle ç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 et

Bu 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
   ↓
ISR

Polling 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:

  1. buffer adresini,
  2. veri uzunluğunu,
  3. yönü,
  4. 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:

  1. işlemci ve donanımı ilkler,
  2. bellek ve aygıtları hazırlar,
  3. boot sürecini başlatır,
  4. 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 time

bileş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 -> veri

CAM:

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:

  1. ilgili cache set'i bulunur,
  2. tag karşılaştırılır,
  3. 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şim

Miss rate:

1 - hit rate

Ortalama 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 ns

ise:

AMAT = 1 + 0.05 x 60
     = 4 ns

olur.

Direct-mapped cache

Her ana bellek bloğu yalnız bir cache satırına gidebilir.

cache index =
block number mod number of lines

Avantaj:

  • 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 offset

alanları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 address

MMU tarafından:

physical address

değ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 + offset

Page table:

VPN -> PFN

eş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 frame

dö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 / P

Burada:

  • 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 = 20

kat 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 B

MPI 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
111

sekiz 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ı oku

Ancak 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 1

değ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 old

işlemi bölünemez biçimde yapılır.

Spinlock:

while test_and_set(lock):
    bekle

biç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 = 5

Core 0:

X = 10

yazdığında Core 1 eski 5 değerini kullanmamalıdır.

Bu problem cache coherence problemidir.

Coherence gereksinimleri

Basitleştirilmiş olarak:

  1. bir çekirdeğin yaptığı write sonunda diğer çekirdeklerce görünür olmalıdır,
  2. aynı adrese yapılan write'lar bütün çekirdeklerce tutarlı sırada görülmelidir,
  3. 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 = 1

baş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
       ↓
Retire

adı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
  ↓
CPU

zinciri 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ım

etkileşiminin sonucudur.

Bu sayfanın QR kodu