Merhaba arkadaşlar! Bu ayki yazımda sizlere günümüz bilgisayarlarının tasarımında kullanılan bir teknik olan pipelinening'i anlatacağım. Pipelining'de en önemli nokta, bir yönergenin(instruction) işletilmesini evrelere bölmekte saklı. Bu sayede işlemci farklı yönergelerin farklı evreleri üzerinde aynı anda çalışabiliyor ve az zamanda daha çok iş yapılabiliyor.

Pipelining'in ne olduğunu daha iyi anlatmak için çamaşırhane örneğini vererek başlayabiliriz. Diyelim ki çamaşırhanede tek bir çamaşır makinesi, tek bir kurutma makinesi ve katlama yapılabilecek tek bir yer var ve yıkama işlemi 30 dk., kurutma 40 dk, katlama da 20 dk. sürüyor. Sırada 4 kişi bekliyor ve birinin işi tamamen bitmeden diğeri işlerini yapmaya başlamıyor. Öğleden sonra 6'da başladığımızı ve bir müşteriden diğerine geçerken süre kaybetmediğimizi farz edersek ancak gece yarısında 4 müşterinin de işi bitmiş olacaktı ve tabiki bu pipelined bir sistem olmuyor(Şekil 1-A).

Ancak birinci müşterinin çamaşır makinesiyle işi bittip kurutma makinesini kullanmaya başladığında, 2. müşterinin daha fazla beklemesine ihtiyaç yok ve çamaşır makinesini kullanmaya artık başlayabilir çünkü yıkama, kurulama ve katlama işlemleri de birbirinden bağımsız işlemler. Bu şekilde 4 kişinin işi saat akşam 9.30 civarı bitecektir(Yaşasın?!?). Bu şekilde bir sistem ise pipelined bir sistem oluyor.

Yönerge Boru Hatları

Verdiğimiz örnekteki müşteriler yönergeleri, yıkama evreleri de bir yönergenin geçtiği evreleri temsil ediyordu;) Tahmin edeceğiniz üzere işlemci pipelineları da benzer şekilde çalışıyor ve evreleri aşağıdaki gibi adlandırılıyor:

Fetch: Bu evrede yönerge(instruction) hafızadan program sayacı(PC) kullanılarak okunur.Yönergeden yönerge kodu(icode) ve yönerge fonksiyonu çekilir(ifun).

Decode: Register dosyasından hesaplanacak değerler çekilir.

Execute:Hesaplama işlemi yapılır(icode ve ifun'a göre).

Memory:Bu evrede hafızadan veri okunabilir ya da hafızaya veri yazılabilir.

Write back:Sonuç değeri register dosyasına geri yazılır.

Avantajları

  • İşlemcinin işlem hacmi(throughput) artar.
  • Aritmetik Logic Unit tasarımı daha hızlı fakat daha karmaşık olur.
  • Pipeline kullanılan CPU'lar genelde RAM clock frekansından daha yüksek frekansta çalışırlar. Bu da bilgisayarın toplam performansının artmasını sağlar.

Dezavantajları

  • Pipelinesız çalışan bir işlemci tek döngüde sadece bir instruction işletir.Bu da kol gecikmelerinin(branch delay) olmamasını sağlar. Bu yüzden pipelined olmayan bir sistemin tasarımı daha kolay ve maliyeti az olur.
  • Pipelined bir sistemin yönerge gecikmesi(latency), pipelined olmayana göre biraz daha fazladır. Bu da sisteme ekstra flip-floplar eklenmesinden kaynaklanır.
  • Pipelined bir sistemin işlemci performansını ölçmek daha zordur ve performans daha değişkendir.

Şekil-2 birbirini izleyen birkaç assembly yönergesinin pipeline bir sistemden nasıl işletildiğini gösteriyor. F,D,E,M,W sırasıyla Fetch,Decode,Execute,Memory ve Write back evrelerini temsil ediyor. Bu kod program registerları olan %edx ve %eax 'e sırasıyla 10 ve 3 yüklüyor. 3 tane nop(hiçbir şey yapmama komutu) yaptıktan sonra da %edx ve %eax'teki değerleri topluyor ve bulduğu değeri %eax'e geri yazıyor ve duruyor. Bu örnek sorunsuz çalışıyor, çünkü 2. movl yönergesiyle addl yönergesi arasında 3 tane nop işlemi var ve bu sayede addl yönergesi fetch evresine geçtiği anda 2. movl write back evresinde oluyor ve addl yönergesi de henüz geri yazılan değeri kullanmaya başlamamış oluyor. Eğer 3 yerine 2 ya da daha az nop yönergesi olsaydı addl ile hesaplanan değer hatalı olacaktı. Yani durumu daha açık bir şekilde ifade etmeye çalışırsak önceki yönergelere “bağımlı” olan bir yönergenin decode evresine geçtiğinde hata oluşmaması için, öncesinde çalışmaya başlayan yönergelerin bitirilmiş olması gerekiyor. Aksi halde hesaplanan değerlerde hata oluşuyor.Bu duruma da veri tehlikeleri(Data hazards) ismi veriliyor. Ayrıca bir yönergenin diğer yönergenin yerini belirlediği jump,call veya return gibi yönergelerde de kontrol tehlikeleri(control hazards) denen durum oluşabiliyor. Daha sonraki yazımda da sizlere veri ve kontrol bağımlılıklarından kurtulmak için kullanılan forwarding ve stalling isimli yöntemlerden bahsedeceğim.Görüşmek üzere... :)

Kaynaklar: