Pipeline (Boru hattı) Uygulaması - II BIL-304: Bilgisayar Mimarisi Dersi veren öğretim üyesi: Dr. Öğr. Üyesi Fatih Gökçe Ders kitabına ait sunum dosyalarından adapte edilmiştir: http://csapp.cs.cmu.edu/ Adapted from slides of the textbook: http://csapp.cs.cmu.edu/
Pipeline’ın çalışması R e g 100 ps 20 ps Comb. logic A B C Clock 300 R e g Clock Comb. logic A B C 100 ps 20 ps 359 R e g Clock Comb. logic A B C 100 ps 20 ps 241 R e g Clock Comb. logic A B C 100 ps 20 ps 239 Zaman OP1 OP2 OP3 A B C 120 240 360 480 600 Saat sinyali (Clock) * Comb. Logic Kombinasyonel lojik
Kısıtlamalar: Eşit bölünemeyen gecikmeler Saat sinyali Komb. lojik B C 50 ps 20 ps 150 ps 100 ps Gecikme= 510 ps Throughput = 5.88 GIPS A Zaman OP1 OP2 OP3 A B C Throughput en yavaş aşama tarafından sınırlandırılır Diğer aşamalar zamanlarının çoğunu bekleyerek geçirir Bir sistemi zaman açısından dengeli aşamalara bölebilmek oldukça zordur
Kısıtlamalar: Kaydedicilerle gelen zaman problemi Gecikme= 420 ps, Throughput = 14.29 GIPS Saat sinyali R e g Komb. lojik 50 ps 20 ps Pipeline’daki aşama sayılarını arttırdıkça, kaydedicilere kayıt için gereken sürelerin toplamı önem kazanır Kaydedicilere kayıt için harcanan saat palsi yüzdeleri: 1-aşama pipeline: 6.25% 3- aşama pipeline: 16.67% 6- aşama pipeline: 28.57% Modern işlemcilerin yüksek hızlarda çalışabilmesi, çok aşamalı pipeline ile sağlanır
Veri Bağımlılıkları Sistem Her komut bir öncekinin sonucuna bağlıdır R Saat sinyali Kombinasyonel lojik R e g Zaman OP1 OP2 OP3 Sistem Her komut bir öncekinin sonucuna bağlıdır
Veri Riskleri (Data Hazards) g Saat sinyali Komb. lojik A B C Zaman OP1 OP2 OP3 A B C OP4 Sonuçlar bir sonraki komut için zamanında geri beslenmez Pipeline sistemin davranışını değiştirir
İşlemcilerde Veri Bağımlılıkları 1 irmovq $50, %rax 2 addq %rax , %rbx 3 mrmovq 100( %rbx ), %rdx Bir komutun sonucu bir başkası için işlenecek veri olabilir Yazmadan-sonra-okuma (Read-after-write (RAW)) bağımlılığı Gerçek programlarda sık rastlanır Pipeline’ın bu durumları düzgün şekilde çözmesi gerekir Doğru sonuç alınmalı Performans üzerindeki olumsuz etkisi olabildiğince az olmalı
Kontrol akışı bağımlılığı (Control flow dependency) loop: subq %rdx, $rbx jne target irmovq $10, %rdx jmp loop target: halt
Örnek Saat Sinyali R e g 80 ps 30 ps 60 ps 50 ps 70 ps 20 ps A B C D E F 10 ps 3 aşama pipeline yapılması gerekiyor. Elde edilebilecek en yüksek ve en düşük throughput nedir?
SEQ Donanımı Aşamalar dizi halindedir Herhangi bir anda sadece bir iş yapılmaktadır
SEQ+ Donanımı PC Aşaması İşlemci Durumu Hala ardışıl bir uygulama PC aşaması başta olacak şekilde tekrar düzenlenmiştir PC Aşaması Görevi şimdiki komutun PC değerini seçmek Bir önceki komut tarafından hesaplanan sonuçlara bağlı olarak İşlemci Durumu PC artık kaydedicide tutulmamakta Fakat, diğer kaydedilmiş bilgiler kullanılarak PC belirlenebilmekte
Pipeline Kaydedicilerinin Eklenmesi Instruction memory PC increment CC ALU Data Fetch Decode Execute Memory Write back icode , ifun rA rB valC Register file A B M E valP srcA srcB dstA dstB valA valB aluA aluB Cnd valE Addr , Data valM newPC
Pipeline Aşamaları Fetch Decode Execute Memory Write Back Şimdiki PC’yi seç Komutu oku Arttırılmış PC’yi hesapla Decode Program kaydedicilerini oku Execute ALU’yu çalıştır Memory Veri hafızasından oku ya da veri hafızasına yaz Write Back Kaydedici dizisini güncelle
PIPE- Donanımı İleri (Yukarı) Yönlü Hatlar Pipeline kaydedicileri komutun yürütülmesinden oluşan ara değerleri tutar İleri (Yukarı) Yönlü Hatlar Değerler bir aşamadan bir sonrakine aktarılır Geçmiş aşamaları atlayamaz örnek, valC decode aşamasını doğrudan geçer
Sinyal İsimlendirme Kuralları S_Alan S aşamasındaki pipeline kaydedicilerinde tutulan alan değeri s_Alan S aşamasında hesaplanan alan değeri
Geribesleme Hatları Tahmin Edilen PC Dallanma Bilgisi Bir sonraki PC değeri tahmini Dallanma Bilgisi Dallanma oldu/olmadı Bir sonraki komutun adresi veya hedef adresi Geri dönüş noktası Hafızadan okunur Kaydedici güncellemeleri Kaydedici dizisi yazma portlarına
Pipeline Gösterimi Dosya: demo-basic.ys F D E M W I1 I2 I3 I4 I5 irmovq $1,%rax #I1 1 2 3 4 5 6 7 8 9 F D E M W irmovq $2,%rcx #I2 irmovq $3,%rdx #I3 irmovq $4,%rbx #I4 halt #I5 5. Saat palsi I1 I2 I3 I4 I5 Dosya: demo-basic.ys
Veri Bağımlılığı: 3 Nop durumu 0x000: irmovq $10,% rdx 1 2 3 4 5 6 7 8 9 F D E M W 0x00a: $3,% rax 0x014: nop 0x015: 0x016: 0x017: addq % ,% 10 R[ ] f valA = valB # demo-h3.ys 6. Saat palsi 11 0x019: halt 7. Saat palsi
Veri Bağımlılığı: 2 Nop durumu 0x000: irmovq $10,% rdx 1 2 3 4 5 6 7 8 9 F D E M W 0x00a: $3,% rax 0x014: nop 0x015: 0x016: addq % ,% 0x018: halt 10 # demo-h2.ys R[ ] f valA = valB • 6. Saat palsi Hata
Veri Bağımlılığı: 1 Nop durumu 0x000: irmovq $10,% rdx 1 2 3 4 5 6 7 8 9 F D E M W 0x00a: $3,% rax 0x014: nop 0x015: addq % ,% 0x017: halt # demo-h1.ys R[ ] f 10 valA = valB • 5. Saat palsi Hata M_ valE = 3 dstE
Veri Bağımlılığı: Nop olmaması durumu 0x000: irmovq $10,% rdx 1 2 3 4 5 6 7 8 F D E M W 0x00a: $3,% rax 0x014: addq % ,% 0x016: halt # demo-h0.ys valA f R[ ] = valB 4. Saat palsi Hata M_ valE = 10 dstE e_ 0 + 3 = 3 E_
Dallanma Hatalı Tahmini Örneği demo-j.ys 0x000: xorq %rax,%rax 0x002: jne t # Dallanma olmaz 0x00b: irmovq $1, %rax # Dallanma olmaması durumunda # işletilmesi gereken komut 0x015: nop 0x016: nop 0x017: nop 0x018: halt 0x019: t: irmovq $3, %rdx # Hedef (İşletilmemeli) 0x023: irmovq $4, %rcx # İşletilmemeli 0x02d: irmovq $5, %rdx # İşletilmemeli Sadece ilk 7 komutun işletilmesi gerekir
Dallanma Hatalı Tahmini İncelemesi 0x000: xorq % rax ,% 1 2 3 4 5 6 7 8 9 F D E M W 0x002: jne t # Dallanma yok 0x019: t: irmovq $3, % rdx # Hedef 0x023: $4, % rcx # Hedef+1 0x00b: $1, % # jne t’den hemen # sonraki komut # demo - j 5. Saat palsi valE f dstE = M_Cnd = M_ valA = 0x007 valC ecx rB Dallanma hedef noktasındaki iki komut işletilmemesi gerekirken işletiliyor
Return Örneği demo-ret.ys 0x000: irmovq Stack,%rsp # Yığın pointer’ını ayarla 0x00a: nop # %rsp ile ilgili riskten sakın 0x00b: nop 0x00c: nop 0x00d: call p # Altprogram çağrılması 0x016: irmovq $5,%rsi # Dönüş noktası 0x020: halt 0x020: .pos 0x20 0x020: p: nop # Altprogram 0x021: nop 0x022: nop 0x023: ret 0x024: irmovq $1,%rax # İşletilmemeli 0x02e: irmovq $2,%rcx # İşletilmemeli 0x038: irmovq $3,%rdx # İşletilmemeli 0x042: irmovq $4,%rbx # İşletilmemeli 0x100: .pos 0x100 0x100: Stack: # İlk yığın pointer’ı Risklerden sakınabilmek için fazla sayıda nop kullanmak gerekir
Hatalı Return Örneği ret’i takip eden 3 komut işletilmemesi gerekirken işletiliyor
Veri Bağımlılığı: 2 Nop Durumu 0x000: irmovq $10,% rdx 1 2 3 4 5 6 7 8 9 F D E M W 0x00a: $3,% rax 0x014: nop 0x015: 0x016: addq % ,% 0x018: halt 10 # demo-h2.ys R[ ] f valA = valB • 6. Saat palsi Hata
Veri Bağımlılığı: Nop Olmaması Durumu 0x000: irmovq $10,% rdx 1 2 3 4 5 6 7 8 F D E M W 0x00a: $3,% rax 0x014: addq % ,% 0x016: halt # demo-h0.ys valA f R[ ] = valB 4. Saat palsi Hata M_ valE = 10 dstE e_ 0 + 3 = 3 E_
Veri Bağımlılığı için Durdurma (Stalling) Çözümü 1 2 3 4 5 6 7 8 9 10 11 # demo-h2.ys 0x000: irmovq $10,%rdx F D E M W 0x00a: irmovq $3,%rax F D E M W 0x014: nop F D E M W 0x015: nop F D E M W kabarcık F E M W 0x016: addq %rdx,%rax D D E M W 0x018: halt F F D E M W Eğer bir komut, kaydediciye yazan bir diğer komutu çok yakından izliyorsa, yavaşlatılır Yukarıda, durdurulan addq komutu decode aşamasında tutulur 7. saat palsinde çalıştırılmak üzere execute aşamasına nop enjekte edilir kabarcık (bubble) eklenmesi işlemi
Durdurma Durumunun Tespit Edilmesi 1 2 3 4 5 6 7 8 9 10 11 # demo-h2.ys 0x000: irmovq $10,%rdx F D E M W 0x00a: irmovq $3,%rax F D E M W 0x014: nop F D E M W 0x015: nop F D E M W kabarcık F E M W 0x016: addq %rdx,%rax D D E M W 0x018: halt F F D E M W 6. Saat palsi W D • W_dstE = %rax W_valE = 3 srcA = %rdx srcB = %rax
Durdurma X3 F D E M W F D E M W E M W E M W E M W F D D D D E M W F F 1 2 3 4 5 6 7 8 9 10 11 # demo-h0.ys 0x000: irmovq $10,%rdx F D E M W 0x00a: irmovq $3,%rax F D E M W kabarcık E M W kabarcık E M W kabarcık E M W 0x014: addq %rdx,%rax F D D D D E M W 0x016: halt F F F F D E M W 6 . Saat palsi W W_dstE = %rax 5 . Saat palsi M M_dstE = %rax 4. Saat palsi • E e_dstE = %rax • D srcA = %rdx srcB = %rax D srcA = %rdx srcB = %rax D srcA = %rdx srcB = %rax
Durdurma Sırasında Neler Olur? 0x000: irmovq $10,%rdx 0x00a: irmovq $3,%rax 0x014: addq %rdx,%rax # demo-h0.ys 0x016: halt kabarcık 0x014: addq %rdx,%rax 7. Saat palsi 0x016: halt kabarcık 8. Saat palsi 0x014: addq %rdx,%rax 0x016: halt 0x00a: irmovq $3,%rax kabarcık 0x014: addq %rdx,%rax 6. Saat palsi 0x016: halt 0x000: irmovq $10,%rdx 0x00a: irmovq $3,%rax kabarcık 0x014: addq %rdx,%rax 5. Saat palsi 0x016: halt 0x000: irmovq $10,%rdx 0x00a: irmovq $3,%rax 0x014: addq %rdx,%rax 4. Saat palsi 0x016: halt Write Back Memory Execute Decode Fetch Durdurulan komut decode aşamasında tutulur Bir sonraki komut da fetch aşamasında durur Execute aşamasına kabarcık enjekte edilir Dinamik olarak oluşturulmuş nop Sonraki aşamalar boyunca ilerler
Pipeline Kaydedici Modları Yükselen Kenar _ Çıkış = y y Çıkış = x Giriş = y durdurma = 0 kabarcık x Normal Yükselen Kenar _ Çıkış = x x Çıkış = x Giriş = y durdurma = 1 kabarcık = 0 x Durdurma n o p Yükselen Kenar _ Çıkış = nop Çıkış = x Giriş = y durdurma = 0 kabarcık = 1 Kabarcık x x
Veri İletme (Forwarding) Basit (Naïve) Pipeline Write-back aşaması tamamlanana kadar kaydedicilere yazılmaz Kaynak veriler kaydedici dizisinden decode aşamasında okunur Veriler aşamanın başlangıcında kaydedici dizisinde kayıtlı bulunmalıdır Gözlem Değerler execute veya hafıza aşamasında elde edilir İşin sırrı Değeri oluşturan komutun, ilgili değeri decode aşamasına doğrudan aktarması Değerin decode aşamasının sonunda oluşturulmuş olması yeterli ve gereklidir
Veri İletme Örneği irmovq write-back aşamasında 0x000: irmovq $10,% rdx 1 2 3 4 5 6 7 8 9 F D E M W 0x00a: $3,% rax 0x014: nop 0x015: 0x016: addq % ,% 0x018: halt 10 # demo-h2.ys 6. Saat palsi R[ ] f valA = valB W_ valE • dstE = 3 srcA srcB irmovq write-back aşamasında Hedef değer W pipeline kaydedicisinde valB değeri olarak decode aşamasına iletilir
Veri İletme Örneği #2 Kaydedici %rdx Kaydedici %rax 0x000: irmovq $10,%rdx 1 2 3 4 5 6 7 8 F D E M W 0x00a: irmovq $3,%rax 0x014: addq %rdx,%rax 0x016: halt # demo-h0.ys 4. Saat palsi valA f M_valE = 10 valB f e_valE = 3 M_dstE = %rdx M_valE = 10 srcA = %rdx srcB = %rax E_dstE = %rax e_valE f 0 + 3 = 3 Kaydedici %rdx ALU tarafından bir önceki saat palsinde oluşturulmuştur Memory aşamasından valA değeri olarak iletilir Kaydedici %rax Değer ALU tarafından yeni oluşturulmuştur Execute aşamasından valB değeri olarak iletilir
İletme Önceliği Birden fazla iletme seçeneği bulunuyorsa 0x000: irmovq $1, %rax 1 2 3 4 5 6 7 8 9 F D E M W 0x00a: irmovq $2, %rax 0x014: irmovq $3, %rax 0x01e: rrmovq %rax, %rdx 0x020: halt 10 # demo-priority.ys W R[ % rax ] f 3 1 D valA rdx = 10 valB ? 5. Saat palsi M 2 E Birden fazla iletme seçeneği bulunuyorsa Öncelik hangisinde olmalı? Birbiri izleyen komutları incele En erken pipeline aşamasından eşleşen değeri kullan
İletmenin Kısıtlandığı Yer Yükle Kullan 7. Saat palsi 8. Saat palsi Yükle-kullan veri bağımlılığı 7. saat palsinde, decode aşamasının sonunda değere ihtiyaç duyulur Fakat bu değer hafızadan ancak 8. saat palsindeki hafıza aşamasında okunur Hata
Yükle-Kullan Riskinin Önlenmesi kabarcık Kullan 8. Saat palsi Veriyi kullanacak komutu 1 saat palsi boyunca durdur Ardından, yüklenen değer memory aşamasından iletme yoluyla kullanılacak yere aktarılabilir
Yükle-Kullan Riski için Kontrol 0x000: irmovq $128,% rdx 1 2 3 4 5 6 7 8 9 F D E M W 0x00a: $3,% rcx 0x014: rmmovq % , 0(% ) 0x01e: $10,% ebx 0x028: mrmovq 0(% ), rax # Yükle% # demo - luh . ys 0x032: addq , # Kullan % 0x034: halt 10 11 kabarcık 12 Komutlar fetch ve decode aşamalarında durdurulur Execute aşamasına kabarcık enjekte edilir Durum F D E M W Yükle/Kullan Riski durdur kabarcık normal
Dallanma Hatalı Tahmini Örneği demo-j.ys 0x000: xorq %rax,%rax 0x002: jne t # Dallanma olmaz 0x00b: irmovq $1, %rax # Dallanma olmaması durumunda # işletilmesi gereken komut 0x015: nop 0x016: nop 0x017: nop 0x018: halt 0x019: t: irmovq $3, %rdx # Hedef 0x023: irmovq $4, %rcx # İşletilmemeli 0x02d: irmovq $5, %rdx # İşletilmemeli Sadece ilk 7 komutun işletilmesi gerekir
Hatalı Tahminin Halledilmesi Dallanma olmaz Hedef kabarcık Hedef+1 kabarcık Dallanma gerçekleşmezse Dallanmayı gerçekleşmiş olarak tahmin et Hedeften 2 komut fetch edilir Hatalı tahmin durumunda 2 komutu iptal et Dallanmanın olmayacağı execute aşamasında anlaşılır Bir sonraki saat palsinde, execute ve decode aşamasındaki komutların yerine kabarcık enjekte edilir Herhangi bir yan etkisi olmaz
Hatalı Tahmin için Kontrol Dallanma olmaz Hedef kabarcık Hedef+1 kabarcık Dallanma gerçekleşmezse Durum F D E M W Hatalı tahmin edilmiş dallanma normal kabarcık
Return (Geri dönme) Örneği demo-retb.ys 0x000: irmovq Stack,%rsp # Yığın pointer’ını ayarla 0x00a: call p # Alt program çağırma 0x013: irmovq $5,%rsi # Geri dönüş noktası 0x01d: halt 0x020: .pos 0x20 0x020: p: irmovq $-1,%rdi # Alt program 0x02a: ret 0x02b: irmovq $1,%rax # İşletilmemeli 0x035: irmovq $2,%rcx # İşletilmemeli 0x03f: irmovq $3,%rdx # İşletilmemeli 0x049: irmovq $4,%rbx # İşletilmemeli 0x100: .pos 0x100 0x100: Stack: # Yığın: Yığın pointer’ı 3 komut ek olarak işletilir
Doğru Return Örneği Dikkat! Bu slayt, orijinal İngilizcesinden daha detaylı bilgiler içerecek şekilde genişletilmiştir. # demo - retb 0x026: ret F D E M W kabarcık F D E M W kabarcık F D E M W kabarcık F D E M W 0x013: irmovq $5,% rsi # Return F F D D E E M M W W ret komutu pipeline’dan geçerken, decode, execute ve memory aşamalarındayken, fetch aşamasına durdurma (stall) uygulanır. ret komutundan bir sonraki komut (0x02b:irmovq $1,%rax), 3 saat palsi boyunca hep fetch edilir ama decode aşamasına aktarılmaz. Decode aşamasına 3 saat palsi boyunca hep kabarcık enjekte edilir. Fetch aşamasına kabarcık enjekte edemediğimiz için durdurma uygulanmaktadır. Bu durum, efektif olarak yukarıdaki gibi 3 kez kabarcık uygulanacak şekilde basitleştirilmiş halde gösterilmektedir. Decode aşamasındaki durdurma, ret komutu write-back aşamasına ulaştığında kaldırılır. W valM = 0x0b 0x013 • F F valC valC f f 5 5 rB rB f f % % esi rsi
Return için Kontrol Durum F D E M W ret komutunun işletilmesi durdurma # demo - retb 0x026: ret F D E M W kabarcık F D E M W kabarcık F D E M W kabarcık F D E M W 0x013: irmovq $5,% rsi # Return F F D D E E M M W W Durum F D E M W ret komutunun işletilmesi durdurma kabarcık normal Fetch aşamasına kabarcık enjekte edemediğimiz için bu aşama durdurulur, bu durum 3 saat palsi boyunca devam eder
Özel Kontrol Durumları Tespit İşlem (bir sonraki saat palsinde) Durum Tetikleyici ret komutunun işletilmesi IRET in { D_icode, E_icode, M_icode } Yükle/Kullan Riski E_icode in { IMRMOVQ, IPOPQ } && E_dstM in { d_srcA, d_srcB } Hatalı tahmin edilmiş dallanma E_icode = IJXX & !e_Cnd Condition F D E M W ret komutunun işletilmesi durdurma kabarcık normal Yükle/Kullan Riski Hatalı tahmin edilmiş dallanma
Pipeline Özeti Veri Riskleri (Data Hazards) Kontrol Riskleri Çoğu risk iletme (forwarding) ile çözülür Performansa olumsuz etkisi bulunmaz Yükle/kullan riski 1 saat palsliğine durdurma gerektirir Kontrol Riskleri Hatalı tahmin edilmiş dallanma durumunda belli komutlar iptal edilir 2 saat palslik süre boşa gider ret komutu pipeline’dan geçerken, decode, execute ve memory aşamalarındayken, fetch aşamasına durdurma (stall) uygulanır. 3 saat palslik süre boşa gider Kontrol Kombinasyonları Çok dikkatli analiz edilmelidirler Finalde risklerin kombinasyonlarından sorumlu değilsiniz.