İşlemci Tasarımı ve Aşamaları Yazar: Erman Üret (ermanuret@gmail.com) Çalışmamıza işlemcilerin sınıflandırılması ile başlayacağız. Daha sonraki aşamalarda, bu kısımda anlatılan yapılar kullanılarak işlemci tasarımının nasıl yapılacağı anlatılacaktır. İşlemcilerin sınıflandırılması için birçok sınıflandırma kriteri dikkate alınabilir, ancak bizim buradaki amacımız giriş seviyesindeki tasarımcıları biligilendirmek olduğundan fazla detaya girmeden ana hatları ile bir sınıflandırma yapacağız. Bazı gerçeklenmesi kolay türler hakkında detaylı bilgi verilirken, bazı gelişmiş yapılar hakkında yüzeysel bilgi verilerek giriş seviyesi kullanıcıların bilgilenmesi hedeflenmiştir. Bu kısımda anlatılacak olan işlemci türleri yarışma için bağlayıcı değildir, yalnızca eğitim amaçlıdır. Giriş Bölüm-1: İşlemcilerin Sınıflandırılması Günümüzde tasarlanan ve üretilen işlemciler PC lerde, cep telefonlarında, gömülü sistem uygulamaları gibi hayatımızın pek çok alanında kullandığımız elektronik aletlerde kullanılmaktadırlar. Alanların çeşitliliği, uygulamada elde edilmek istenen sonuçların farklılık göstermesi ve uygulamaların en etkili şekilde gerçeklenmesi amacı ile pek çok farklı türde işlemci tasarlanmıştır. Tarihsel işlemci tasarım sürecinde teknolojinin hızla gelişmesiyle bazı tasarımlar güncelliğini kaybetmiştir, bununla birlikte bazı tasarımların kullanımına ise günümüzde de devam edilmektedir. Bu kadar çeşitli alan için tasarlanan işlemciler elbette tek bir kriter göz önüne alınarak sınıflandırılamaz. İşlemci tasarımını anlatırken, çalışmalarımıza işlemcilerin sınıflandırılması ile başlayarak, tasarımcının işlemci tasarlarken kullanacağı mimari hakkında bir öngörü edinmesi ve kullanacağı mimariyi belirlemesinde bilgi sahibi olması amaçlanmıştır. İlerideki aşamalarda, bu bölümde anlatılmış bazı güncel sınıflar kullanılacaktır. İşlemcileri sınıflandırırken 4 ana kriteri seçmemiz şu an bizim için gerekli olan mimariyi tanıyabilmemiz için yeterli olacaktır. Bunun dışında birçok sınıflandırma da yapılabilir, ancak bizim asıl amacımız mimariyi yeterince tanımak ve tasarım yaparken kullanmak üzere, kullanılabilir yapılar hakkında fikir edinmektir. Bu çerçevede işlemcileri sınıflandırırsak;
(1) Paralelliğe göre a) Paralel olmayan i. Single Cycle ii. Multi Cycle b) Paralel i. Pipeline ii. Superscalar (2) Mimariye göre a) Accumulator b) Stack c) Register Register d) Register Memory e) Memory Memory (3) Instruction set e göre a) RISC ( Reduced instruction Set Computer) b) CISC ( Complex instruction Set Computer) (4) Memory mimarisine göre a) Harvard mimarisi b) Von Neuman mimarisi Bu 4 kritere göre sınıflandırmamızı yaptıktan sonra isterseniz bu yapıları yakından tanıyalım. Paralelliğee göre sınıflandırma Single-Cycle işlemciler Adından da anlaşılabileceği gibi bu gruba dahil olan işlemcilerde komutlar eşit cycle sayısında işlenir. Örneğin, tüm komutların 1 ya da 2 saat çevriminde bitirilmesi gibi. İşlemcide kullanılacak saat hızı seçiminde en yavaş komut (critical path) dikkate alınarak seçim yapılmalıdır. Tasarımı diğer yapılara göre kolay olmasına rağmen paralellik içermemesinden dolayı donanım verimli kullanılmamış olur.
Single cycle işlemci tasarımı yaparken kullanılacak komutlar belirlendikten sonra her bir komutun ne kadar sürede tamamlanacağı kestirilir ve saat sinyali en yavaş işlenen komuta göre belirlenir. İşlemci bütün komutarı en yavaş komut süresinde işlediğinden hızlı işlenebilecek komutlarda da bir verimlilik kaybı olur. Örneğin en uzun komutun LOAD komutu olduğunu düşünürsek (50ns de gerçeklenebildiğini varayalım) daha hızlı gerçekleşebilicek JUMP komutu da (10ns de gerçeklenebildiğini varsayalım) LOAD komutu kadar sürmektedir. + Tasarımı kolay, işlemci tasarlamaya başlamak için güzel bir başlangıç - Kaynaklar etkin kullanılmamış oluyor - En uzun komut saat sinyalini belirliyor. Multi-Cycle işlemciler Single-cycle işlemcilerden farklı olarak farklı komut gurupları farklı saat çevrim miktarı ile gerçeklenebilir. Tasarımı single cycle tasarıma göre daha zordur. Tasarım yapılırken komutlar daha küçük kısımlara ayrılırlar. Bu küçük kısımlar daha hızlı bir saat çevrimi ile işlenirler. Örneğin bir komut 5 küçük kısma ayrılıp 5 cycle da işlenirken başka bir komut 2 cycle da tamamlanabilir. Performans olarak kısa komutların çokça kullanıldığı bir programda single-cycle işlrmcilerden hızlıdır. Tasarım yapılırken daha fazla componente ihtiyaç duyulur. + Single cycle işlemcilere göre daha verimli (performans olarak) - Kaynaklar her komut işleme sürecinde 1 kez kullanılıyor. Pipeline Komutlar işlenirken sıra ile işlemcinin belirli bölgelerini kullanırlar. Örneğin bir komut işenmeye başlanmadan önce komutun okunarak (fetch ve decode) nasıl bir işlem yapılacağı anlaşılmalıdır. Bu kısımlar geçildikten sonra komut ile belirtilen asıl iş işlemci tarafından,işlemcinin belirli kısımları kullanılarak gerçekleştirilir. Eğer işlemciyi belirli kısımlara ayırabilirsek (örneğin komutun anlaşılması(fetch), gerekli register(yazmaç) ve memory nin okunması(decode), komutun işlenmesi (execution) gibi) bu ayırdığımız kısımların aynı anda farklı komutlar tarafından kullanılmasını sağlayabiliriz. İşlemciyi kısımlara ayırdıktan sonra komutları da bu ayrıma uygun olarak küçük kısımlara böleriz. Komutlar sıra ile işlenirken birinci komutun fetch işlemi bittiğinde 2. komut fetch işlemine başlanabilir. Böylece işlemcinin bütün kısımlarını aynı anda kullanabiliriz. Alttaki şekilde de görülebileceği gibi pipeline bir işemci ile 3 komutun işlenmesi 7cycle sürerken, bu işlem single cycle bir işlemci ile yapılmak istenirse 3*5 = 15 cycle
da bitecekti. Pipeline da programın tamamlanma süresini hesaplamak istersek: Bir komutun N cycle da işlenebilir şekilde tasarlanmış M adet komut içeren program N+( M-1) formülü ile bulunur. 5+( 3-1) = 7 Bir işlemciyi pipeline olarak tasarladığımız zaman, tasarladığımız kontrol ünitesinin ürettiği sinyalleri işlemcinin tüm bölmelerine saat sinyali ile değişecek şekildee taşımalıyız. Yani bir komut için üretilen sinyaller, komut işlemci içerisinde ilerledikçe komutla birlikte ilerlemelidir. Bunu sağlamak için bölümlediğimiz kısımlara buffer ekleyerek yol boyunca kontrol sinyallerini taşırız. Bu bufferlar aynı zamanda verileri saklamakk için de kullanılmalıdırlar. Aşağıdaki şekilde [1] 5 aşamadan oluşan yeşil bloklar pipeline bufferlarını temsil etmektedir. Birçok komutu ardı arda alarak işleyen bu yapınınn çalışmasında 3 çeşit hata riski bulunmaktadır. Bu riskler yapısal risller, kontrol riskleri ve data riskleridir. Yapısal riskler, aynı kaynağın farklı komutlar tarafından aynıı anda kullanılmasından kaynaklanmaktadırlar. Bu tür hatalar genellikle fonksiyonel ünitelerin (ALU, hafıza, yazmaçlar) tamamen pipeline olmamasındann kaynaklanır. Kontrol riskleri ise branch komutları geldiğinde ortaya çıkar. İşlemci branch komutunun branch işlemi yapacağını anlamadan sıralamadaki diğer komutu da işleme almıştır. Branch komutunun işilenmesi halinde bir sonraki komutun işlenmesi
anlamsız olacağından sonraki komut beklemeye alınarak bu riskten kurtulabiliriz. Kontrol risklerinden daha etkili şekilde kurtulmak istiyorsak buna ek olarak işlemciye bir branch prediction unit te eklenebilir. Data riskleri, program akışında birbirinin sonuçlarına bağlıı komutların arka arkaya gelmesi durumunda ortaya çıkmaktadır. Örneğin bir memory alanınaa ya da register a yazan bir komuttan hemen sonra o alanı okuyan bir komutun gelmesi ile yazma işlemi gerçekleşmeden yanlışş değer okunmuş olabilir. Bu tür risklere read after write denir. Bunun tam tersi olan ve üstteki komut, memory ya da register ı okuyamadan alttaki komutun ilgili yere yazması ile oluşur. Bu risklere de write after read denilmektedir. Bunun dışında aynı alana arka arkaya gelen iki komut da yazmaya çalışabilir ve bu write after write denen hatayaa neden olur. Bu hatalardan write after write ve write after read hataları renaming (yeniden adlandırma) metodu ile hardware ya da software ile çözülebilir. Hardware çözümlerde bir forwarding unit tasarlanarak eldee edilen sonuç bir sonraki komutun ilgili pipline kısmına forwardlanır. Forwarding yapılması da her zaman için riski ortadan kaldırmaz. Bu yüzden pipelinee işlemci tasarlarken risk tespit ünitesi (hazard detection unit) tasarlamak da gerekmektedir. Bu ünite, riskler oluştuğunda ilgili control bufferlarını sıfırlayarak işlemcinin gerekli beklemeyi yapmasını sağlar. Böylecee riskler ortadan kaldırılmış olur. Yukarıdaki şekilde [1] örnek pipeline MIPS bir işlemcinin data yolu bulunmaktadır.
+ Kaynaklar paralel olmayan yapılara göre etkin bir şekilde kullanılıyor - Tasarımı zor - Önceki tasarımlara göre daha fazla eleman ve yapı içeriyor - Hata riskleri önlenmeli Superscalar Superscalar işlemciler, her saat sinyalinde birçok komutu okuyarak kendi komut sıralamasına koyar [2]. Aynı anda aynı fonksiyonel üniteler birden fazla komut tarafından kullanılamayacağından superscalar işlemcilerde fonksiyonel üniteler birden fazladır. Bunun dışında komutların program sırası dışında (out of order execution) işlenmesine olanak sağlayan yapılar ile paralellik arttırılabilir. Bu işlem reorder buffer ya da genişletilmiş register file ile sağlanabilir[3]. Mimariye göre sınıflandırma Bu yapılardan en eski olanı accumulator ya da multiple accumulator kullanımıdır. Accumulator tabanlı bu yapıda işlenen veri ve sonuç accumulator denen yapıda tutulur. Bu mimari instruction set in tek bir operand ile kodlanabilmesine olanak tanır. Bu sayede kod alanından tasarruf edilmiş olunur. Bu yapıda bir operand accumulator den, diğer operand ise tasarıma göre değişmekle birlikte adresleme moduna göre register, memory yada immediate olarak komuttan okunur. Sonuç ise accumulator de saklanır. Accumulator yaklaşımından daha ekonomik bir sınıf ise bir diğer eski sınıf olan stack üzerinden işlem yapan işlemci sınıfıdır[2]. Bu yapıda işlemler her zaman stack adı verilen yapının en üst kısmında bulunan iki operand üzerinde gerçekleştirilir ve sonuç stack in en üst kısmına kaydedilir. Ancak stack üzerinde istenen operandlar yoksa bu operandların PUSH komutu ile stack e alınması ya da POP komutu ile stackten alınması gerekir. Genel amaçlı register mimarisi yaygın olarak kullanılan güncel bir mimaridir. Bu yapı ile tasarım yaparken, instruction set 2 yada 3 adet operand alır ( aynı operand sonucun kaydı içinde kullanılıyorsa 2 yeterlidir ). Bu mimari Load-store mimarisi olarak da bilinir. Bu yapı aynı zamanda RISC yapısına da uygundur. Aritmetik işlemler registerlar üzerinden gerçeklenir[2]. Diğer sınıflar da, örneğin register-memory ve memory-memory, registerregister yapısı gibi operandların nereden alıcağını gösterir. Bilindiği gibi memory register yapısına göre yavaştır. Bu yüzden operatörlerin bir ya da ikisininde
memory den okunması hesaplama süresine memory işlem gecikmesi eklenmesine yol açar. Aşşağıdaki şekillerde [2] ilgili sınıfların nasıl çalıştığı grafiksel olarak gösterilmiştir. a) Stack yapısı b) Accumulator yapısı c) 2 operand lı register-register yapısı d) 3 operand lı register-register yapısı e) Register Memory yapısı f) Memory Memory yapısı
RISC & CISC Instruction set e göre sınıflandırma Reduced instruction set yapısı adından da anlaşılabileceği gibi herşeyi basit tutmaya çalışan bir yapıdır[2]. RISC yapısının özelliklerini sıralarsak Instruction lar komple bir çözüm için bir kod içermek yerine çözüme giden yolda kullanlıcak daha küçük ve basit kodları içerirler. Böylece instruction sette kullanılan komut sayısı azaltılmış olur. Komutlarda ortagonallik ve düzen olabildiğince fazladır. Komutlar genellikle tek cycle da işlenir. Pipline da gerçeklenmesi kolaydır. Genel kulanımlı register lar gerektirir Aritmetik ve logic işlemler registerlar yada immediate değerler üzerinden yapılır.[2] RISC yapısının güzelliği, basit yapılar içermesinden dolayı bu yapıların kullanılarak çok farklı şekilde kompleks yapıların çözülmesindedir. Kompleks yapılar ise basitlikten uzak ve sorunların çözümünde esnek değildirler. CISC yapısının en çok kullanıldığı alan sinyal işlemede kullanılan DSP işlemcileridir[2]. Bazı kompleks işlemleri kullanıcının tek komut ile gerçelemesi sağlanmıştır. Böylece hem kullanıcının komplex bir sistemi kodlaması kolaylaşmış olur hem de kod yazımından kaynaklanan kompleks işlemin çözüm süresi sabitlenmiş olur. Bunun gibi bazı sınırlı alanlarda CISC yapısının kullanılması daha avantajlıdır[2]. Memory mimarisine göre sınıflandırma Von Neumann ve Harvard Mimarisi hakkında aşşağıdaki adresten gerekli bilgiye ulaşabilirsiniz. http://elearning.cizgi.com.tr/architect.aspx?path=005
Sonuç Bu aşamada işlemci sınıfları hakkında giriş düzeyinde bilgi verilmeye çalışıldı. Bu yapılırken ileride kullanılabilecek sınıflandırma kriterleri ve sınıfların üzerinde detaylı bir şekilde durduk. Superscaler gibi sınıflar, tasarımlarının kısa sürelerde yapılması zor olduğundan okuyucuya sadece genel kültür kazandırmak amacını taşımaktadır. Bundan sonraki kısımlarda değişik mimariler kullanılarak tasarımlar yapılacaktır. Kaynaklar [1] http://en.wikipedia.org/wiki/cpu_design [2] Processor design 2007 (System-on-Chip Computing for ASICs and FPGAs) Jari Nurmi [3] Modern processor design 2003 (John P. Shen) [4] Computer Architecture: A Quantitative Approach by John L. Hennessy, David A. Patterson (Authors)