LOADA mem – bellek adresini A yazmacına yükle
LOADB mem - bellek adresini B yazmacına yükle
CONB con – B yazmacına sabit bir değer ata
SAVEB mem – B yazmacını bellek adresine kaydet
SAVEC mem - C yazmacını bellek adresine kaydet
ADD – A ile B’yi toplayıp sonucu C’ye kaydet
SUB – A’dan B’yi çıkartıp sonucu C’ye kaydet
MUL – A ile B’yi çarpıp sonucu C’ye kaydet
DIV – A’yı B’ye bölüp sonucu C’ye kaydet
COM – A ile B’yi karşılaşıtırıp sonucu teste kaydet
JUMP addr – adrese atla
JEQ addr – eşitse adrese atla
JNEQ addr – eşit değilse adrese atla
JG addr – büyükse adrese atla
JGE addr – büyük veya eşitse adrese atla
JL addr – küçükse adrese atla
JLE addr – küçük veya eşitse adrese atla
STOP – işlemi durdur
Şimdi aşağıdaki C kodlarının assembly diline derlendikten sonra neye benzediklerine bakalım.
a=1;
f=1;
while (a <= 5)
{
f = f * a;
a = a + 1;
}
C bilmeyenler için kısaca anlatmakta fayda var: a değişkeni 5 olana kadar her seferinde bir arttırılarak f değişkeninin değeriyle çarpılıyor ve f değişkeninin değeri 5 faktöryel oluyor. Küme parantezleri içindeki while döngüsü bittikten sonra parantez içindeki koşul tekrar kontrol ediliyor ve doğru olduğu sürece döngü tekrar tekrar işleme konuyor.
Bir C derleyicisi bu kodları assembly diline çevirir. RAM’in 128, assembly programını barındıran ROM’un da 0 numaralı hafıza adresinden başladığını varsayarsak işemcimiz için yukarıdaki C kodları aşağıdaki şekilde görünür:
// adres 128’deki a’yı al
// adres 129’daki f’i al
0 CONB 1 // a=1;
1 SAVEB 128
2 CONB 1 // f=1;
3 SAVEB 129
4 LOADA 128 // a>5 ise 17’ye atla
5 CONB 5
6 COM
7 JG 17
8 LOADA 129 // f=f*a;
9 LOADB 128
10 MUL
11 SAVEC 129
12 LOADA 128 // a=a+1;
13 CONB 1
14 ADD
15 SAVEC 128
16 JUMP 4 // 4. satırdaki if koşuluna geri dön
17 STOP
Şimdi bu komutların hafızada nasıl göründüğüne bakalım. Bütün komutlar ikili sistemdeki sayılarla gösterilmeli. Bunun için her komuta opcode denen bir numara verilir:
LOADA - 1
LOADB - 2
CONB - 3
SAVEB - 4
SAVEC mem - 5
ADD - 6
SUB - 7
MUL - 8
DIV - 9
COM - 10
JUMP addr - 11
JEQ addr - 12
JNEQ addr - 13
JG addr - 14
JGE addr - 15
JL addr - 16
JLE addr - 17
STOP - 18 Programımız ROM’da şöyle gözükür:
// adres 128’deki a’yı al
// adres 129’daki f’i al
Addr opcode/value
0 3 // CONB 1
1 1
2 4 // SAVEB 128
3 128
4 3 // CONB 1
5 1
6 4 // SAVEB 129
7 129
8 1 // LOADA 128
9 128
10 3 // CONB 5
11 5
12 10 // COM
13 14 // JG 17
14 31
15 1 // LOADA 129
16 129
17 2 // LOADB 128
18 128
19 8 // MUL
20 5 // SAVEC 129
21 129
22 1 // LOADA 128
23 128
24 3 // CONB 1
25 1
26 6 // ADD
27 5 // SAVEC 128
28 128
29 11 // JUMP 4
30 8
31 18 // STOP
Gördüğünüz gibi C’de 7 satır tutan kod assemblyde 17 satıra çıktı ve ROM’da 31 byte kapladı. Instruction Decoder (komut çözücü, bir önceki başlıkta bahsettiğimiz Decode ünitesi), opcedeları alarak işlemcinin içindeki değişik bileşenleri harekte geçirecek elektriksel sinyallere dönüştürür.
Üretim İlk işlemciler valflar, ayrık transistörler ve çok kısıtlı bir şekilde entegre edilebilmiş devrelerden oluşuyordu fakat günümüz işlemcileri tek bir silikon yonga üzerine sığabiliyorlar. Çip üretiminde temel madde bir yarıiletken olan silikondur. Üretim sırasında çeşitli işlemler yapılır. Önce silicon ignot denen ilindirik bir yapı üretilir. Bunun hammaddesi saflaştırılmış silikondan elde edilen bir çeşit kristaldir. Daha sonra bu silindirik yapı ince ince dilimlenerek wafer denen dairesel tabakalar oluşturulur. Wafer tabakaları yüzeyleri ayna gibi olana kadar cilalanır. Çipler bu wafer tabakaları üzerinde oluşturulur.
Çipler üst üste katmanlardan oluşur ve bu katmanlar için değişik hammaddeler vardır. Örneğin yalıtkan yüzey olarak silikon dioksit kullanılırken iletken yollar ploisilikonla oluşturulabilir. Silikona iyon bombardımanı yapılarak silikondan transistörler üretilir ve bu işleme doping denir.
Bir katman photoresist (ışığa duyarlı) bir maddeyle kaplanır ve bu katmana istenen şeklin görüntüsü projeksiyonla yansıtılır. Bu işlemden sonra ışığa maruz kalan yüzey maskelenir ve kalan madde bir çözücü yardımıyla temizlenir. Maskelenen bölümde transistörler ve yollar oluşturulduktan sonra etching denen kimyasal bir işlemle istenmeyen maddeler katmandan uzaklaştırılarak katmana son şekli verilir. Bu işlem bütün çip hazır olana kadar her katman için ayrı ayrı yapılır. Katmanlardaki yapılar bir metrenin milyonda birinden daha küçük olduğu için bir toz tanesi bile (toz tanelerinin boyutları 100 mikronluk ölçülere kadar çıkabilir ki bu da işlemcideki yapıların 300 katından daha büyüktür) çok büyük problemler çıkarabilir. Bunun için koruyucu giysilerle girilebilen tozsuz odalarda üretim yapılır. Başlarda yarı-iletken üretiminde hata payı %50 civarındaydı ve çoğu zaman üretilen çiplerin ancak yarıya yakını sağlam çıkıyordu. Bu oran %100 olamasa da geliştirilen üretim teknikleriyle günümüzde oldukça yükselmiştir. Wafera eklenen her katmandan sonra testler yapılır ve hatalar tesbit edilir. Die denen wafer üzerindeki ”çıplak” çipler birbirinden ayrılır ve yapılan testlerden sonra sağlam olanlar kullanıma uygun şekilde paketlenir. Günümüzde işlemciler PGA(Pin Grid Arrays) formunda paketlenir. Bu paketlerde seramik bir dörtgenin altına dizilmiş pin denen bağlantı noktaları vardır. İşlemci çekirdekleri paketlendikten sonra aşağıdaki gibi görünür.
Intel’in entegre çip tasarımıyla üretilen ilk işlemcisi olan 4004 10 mikronluk bir üretim tekniğiyle üretiliyordu. İşlemci içindeki en küçük yapı bir metrenin on milyonda biri kadardı. Günümüzdeyse 0,13 mikronluk üretim teknikleri kullanılıyor ve çok yakında 0,1 mikronun da altına inilecek.Moore Yasası 1965 yılında Intel’in kurucularından Gordon Moore’un ortaya attığı Moore Yasası’na göre işlemcilerdeki transistör sayısı 18 ayda bir ikiye katlanır. Moore, bu yasanın sonraki on yıl boyunca geçerliliğini koruyacağını tahmin etmişti ama Intel bu yasayı günümüze kadar çiğnemeden devam ettirmeyi aşağıdaki grafikte de görebileceğiniz gibi başardı.
Fizik yasaları, mühendislerin saat hızlarını sonsuza kadar arttırabilmelerini engeller. Silikonun sınırlarına neredeyse ulaşılmak üzereyken saat hızlarının hala arttığını görüyoruz. Saat hızı her zaman performans anlamına gelmiyor, bu yüzden mühendisler işlemcilerin her saat vuruşunda daha fazla komutu işleyebilmeleri için de uğraşıyorlar aynı zamanda. 4 bitlik bir işlemci bile iki tane 32 bitlik sayıyı toplayabilir ama bunun için pek çok komutu işlemesi gerekir. 32 bitlik bir işlemci bu toplamayı tek bir komutla yapabilir.
İşlemcilerin saat vuruşlarında işlem yaptıklarını söylemiştik. Normal yöntemlerle bir komutu yüklemek, çözmek, kullanacağı veriyi almak, çalıştırmak ve son olarak da sonucu yazmak için beş saat vuruşu gerekir. Bu sorunu çözmek için günümüz işlemcileri pipelining denen teknolojiyi kullanılır. Bu teknolojide bir işlemi yapmak için değişik aşamalar ard arda dizilir ve bir işlemin bir aşaması yapılırken boştaki kaynaklarla da başka bir işlemin herhangi bir aşaması yapılabilir. Bu teknolojiyle bir komutu tek bir saat vuruşunda bitirebilmek mümkün olur. Superscalar denen bir mamariyle paralel pipellinelar kullanılarak performans daha da arttırılabilir. Bu konudaki son gelişme Intel’in Hyperthreading teknolojisidir. Komutları paralel olarak çalıştırmak için çift işlemciye ihtiyaç duyulur. Bu teknolojideyse olaya şu şeklide yaklaşılır: Komutlar thread denen parçalardan oluşur ve çift işlemciyle komut seviyesinde paralellik yerine tek işlemciyle thread seviyeinde paralellik sağlanır. Komutlar threadlere ayrılır ve bu threadler paralel olarak işlenip çıkışta tekrar birleştirirler. Tek bir işlemci tam anlamıyla olmasa da belirli bir seviyede çift işlemci gibi çalışır. Bu yöntem sadece tek bir işlemcinin kaynakları kullanıldığı için çift işlemcinin yerini tutamasa da bazı uygulumalarda belirli bir performans artışı sağlar. En büyük dezavantajı komutların parçalanıp tekrar birleştirilmesi sırasında kaybedilen zaman yüzünden aynı anda birden çok komutun işlenmesine ihtiyaç duymayan programlarda az da olsa performans düşüşü yaşanmasıdır.
Bir İşlemcinin Performansı
Bir işlemcinin performansını belirleyenler arasında kullanıcıların en çok tartıştıkları aşağıdakilerdir:
- İşlemci Mimarisi: Burayı çoğu kimse atlasa da en önemli etken budur. Bir işlemcinin bir saat döngüsünde ne kadar uzunlukta kaç tane komutu aynı anda işleyebildiğini saat hızı ya da önbelleği değil sadece mimarisi belirler.
- Saat Hızı: İşlemcinin çalışma frekansıdır ve günümüzde GHz mertebesine kadar ulaşmıştır. Saat hızı ne kadar yüksek olursa saniyedeki saat vuruşu (ve işlemci çevrimi) sayısı da o kadar yüksek olacağından saat hızının performansa etkisi oldukça yüksektir. Yalnız burada yapılabilecek çok büyük bir hata farklı mimarideki işlemcileri saat hızlarına göre karşılaştırmaktır. Saat hızı kullanılarak ancak aynı işlemci ailesi içinde gerçekçi karşılaştırmalar yapılabilir. Bir işlemcinin saat hızını sistem hızıyla (FSB, Front Side Bus) işlemcinin çarpanının çarpımı belirler. Sistem hızı fazla yüksek olmasa da işlemci kendi içinde çarpanlarını kullanarak çok daha yüksek hızlara çıkabilir. Örneğin oldukça popüler olan 1.8 GHz hızında çalışan bir Pentium 4 işlemci 18x100 MHz’te çalışır.
- L1/L2 Cache: Önemli veriler işlemcinin ihtiyaç anında onlara daha hızlı ulaşabilmesi için önbellekte tutulur. 1. seviye önbellek daha önceliklidir ve buradaki verileri işlemci daha çok kullanır. Önbellek miktarlarını karşılaştırırken işlemci mimarisi yine çok önemlidir. Mesela 16 KB L1 cache bir Pentium 4 için yeterliyken aynı performansta çalışan bir AMD Athlon işlemcide 128 KB L1 cache bulunur. Önemli olan önbelleğin ne şekilde kullanıldığıdır.
Ham işlemci performansını ifade etmek için MIPS (Million Instructions Per Second, saniyede işlenebilen komut sayısı) ve MFLOPS (Million Floating Point Operations Per Second, saniyede yapılabilen kayar nokta hesabı) birimleri kullanılır ve performans konusunda evrensel geçerliliği olan tek kavramlar bunlardır.
Yazılım Uyumluluğu
Bilgisayarların ilk günlerinde herkes kendi yazılımını yazdığı için işlemci mimarisi biraz daha arkaplandaydı. Geçen zamanla birlikte yazılımlar da oldukça gelişti ve bugünse yazılım başlı başına bir sektör. Günümüzde her ihtiyacımız için oturup kendi yazılımlarımızı hazırlmamamız imkansız, bir o kadar da gereksiz. Belirli bir standartlaşmayla beraber işlemcilerin önemi de arttı.
Günümüz PC’leri Intel 80x86 mimarisini kullanır. Bu mimari 70’li yıllardan bugüne kadar gelmiştir, güncel CISC işlemciler hala bu mimariyi kullanır. Bu standartlaşmanın sonucu olarak programlar işlemcilere göre değil komut setlerine göre yazılır ve 80x86 mimarisine göre yazılmış bir programın bir Intel işlemcide çalışıp da bir AMD işlemcide çalışmaması (ya da bunun tersi) mümkün değildir. İşlemcilere özel bazı ek komut setleri olsa da (SSE, 3D Now! gibi) bunlar sadece işlemciye yönelik optimizasyonlardır ve programlar temelde aynıdır. 80x86 miamarisine göre yazılmış 32 bitlik bir program aynı mimarideki 32 bitlik bütün işlemciler tarafından sorunsuzca çalıştırılabilir.
Yazımızı Bitirirken Mimari olarak fazla bir değişikliğe uğramasa da hızı en çabuk artan parçaların başında işlemcilerin geldiğini rahatlıkla söyleyebiliriz. 0,09 mikronluk üretim tekniklerinin de kullanılabilmesiyle silikonlara daha fazla transistör sığdırmak mümkün olacak ve çok yakında piyasaya çıkması beklenen 64 bitlik Hammer serisi AMD işlemciler Intel’in IA64 mimarisini kullanan işlemcilerinin aksine 32 bitlik komutları da çalıştırabilecekler. Intel’se Hyperthreading teknolojisini yeni komut setleriyle geliştirerek biz son kullanıcıları kendine çekmeye çalışacak. Yani işlemci pazarı her zamanki gibi hareketli olacak ve gittikçe hızlanan işlemciler için biz son kullanıcılar yine ceplerimizi boşaltmaya devam edeceğiz.