BİL 361 BİLGİSAYAR MİMARİSİ VE ORGANİZASYONU 2015-2016 Güz Dönemi ÖDEV 1 Son Teslim Tarihi/Saati : 07.10.2015/18:00 Teslim Yeri : Teknoloji Merkezi, 217 Uyarı: Bu ödevdeki soruları öğrenciler kişisel çabalarıyla cevaplamalıdır. Grup halinde ödev hazırlanması, çözümlerin tamamen veya kısmi olarak dersi alan veya almayan başka herhangi biri tarafından yapılması durumunda, bu öğrenciler ödevde kopya çekmiş sayılacak ve gerekli işlemler yapılacaktır. Soru 1 (2 + 8 = 10 puan) Küçüğü Başta (Little Endian) ve Büyüğü Başta (Big Endian) cesitli mimarilerde kullanılan iki veri adresleme formatıdır. Bu soruda sizden istenen, bu iki formata göre verilen sayının bellekte hangi adreslerde saklanacağını göstermenizdir. a) 10 tabanındaki 1007708173 sayısını 16'lık tabana dönüştürün. (1007708173) 10 = (3C10680D) 16 b) 16'lık tabandaki sayı üzerinde her byte'ın karşılık geleceği adresi Küçüğü Başta ve Büyüğü Başta gösterimlerine uygun olarak ayrı ayrı 0-3 arasında numaralandırın. Küçüğü Başta Büyüğü Başta 3C 10 68 0D 3 2 1 0 0 1 2 3 Soru 2 (15 + 25 = 40 puan) 2GHz minimum saat vuruş sıklığına (frekans) sahip fakat işlemcide bulunan 2 çekirdekten sadece biri işlem yaparken vuruş sıklığını 3GHz'ye kadar çıkaran bir işlemciniz vardır. Çekirdekler üzerinde çalıştırılan yazılımın 4 aşamada çalıştırdığı i) toplam buyruk sayısı, ii) buyruk tipleri ve iii) her bir buyruk tipinin o aşama için toplam buyruk sayısına oranı aşağıdaki şekilde verilmiştir. Ayrıca her buyruk tipi için işlemcinin buyruğu kaç çevrimde tamamladığı bilgisi aşağıdaki tabloda verilmiştir. 1
Buyruk Tipi Aritmetik 3 Kayan Nokta 10 Dallanma 3 Sakla-Yükle 20 Çevrim Sayısı Buna göre; a) Programın tamamının çalıştırılması durumunda toplam Buyruk Başına Çevrim (BBÇ) her bir çekirdek için kaç olur? (Çekirdek boştayken buyruk işlemiyor) Toplam çevrim sayısını işlenen toplam buyruk sayısına bölerek BBÇ'yi bulabiliriz. Dikkat edilmesi gereken nokta çekirdekler boştayken geçen çevrimlerin hesaba katılması gerektiğidir. Aşamalarda işlenen buyruk sayıları sırasıyla R 0, S 0, T 0, Q 0 olsun. Aynı şekilde Çekirdek 1 için aşamalardaki buyruk sayılarını R 1, S 1, T 1, Q 1 olarak adlandıralım. Bazı aşamalardaki buyruk sayıları zaten verilmiş. Bunlar şu şekildedir: R 0 = 1.5x10 9, S 0 = 1x10 9, T 0 = 0, Q 0 =? R 1 = 0, S 1 =?, T 1 = 0.5x10 9, Q 1 = 2x10 9? işareti ile belirtilen buyruk sayıları çözümün devamında hesaplanacaktır. Her bir aşamada geçen çevrim sayısını hesaplamak için buyruk türüne ait buyruk sayısını o buyruk türünün işlem süresiyle çarpmamız gerekir. Çekirdek 0 için; Aşama 1 Çevrim Sayısı = 3x0.4R 0 + 10x0.05R 0 + 3x0.1R 0 + 20x0.45xR 0 = 11R 0 Aşama 2 Çevrim Sayısı = 3x0.4S 0 + 10x0.45S 0 + 3x0.05S 0 + 20x0.1S 0 = 7.85S 0 Aşama 3 Çevrim Sayısı = Çekirdek 1 Aşama 3 Çevrim Sayısı 2
Aşama 4 Çevrim Sayısı = Çekirdek 1 Aşama 4 Çevrim Sayısı Çekirdek 1 için; Aşama 1 Çevrim Sayısı = Çekirdek 1 Aşama 1 Çevrim Sayısı Aşama 2 Çevrim Sayısı = Çekirdek 1 Aşama 2 Çevrim Sayısı Aşama 3 Çevrim Sayısı = 3x0.3T 1 + 10x0.3T 1 + 3x0.3T 1 + 20x0.1T 1 = 6.8T 1 Aşama 4 Çevrim Sayısı = 3x0.55Q 1 + 10x0.1Q 1 + 3x0.2Q 1 + 20x0.15Q 1 = 6.25Q 1 Çekirdek 0 Toplam BBÇ = Toplam Çevrim / Toplam Buyruk Sayısı = (11R 0 + 7.85S 0 + 6.8T 1 + 6.25Q 1) / (R 0 + S 0 + T 0 + Q 0) Çekirdek 1 Toplam BBÇ = Toplam Çevrim / Toplam Buyruk Sayısı = (11R 0 + 7.85S 0 + 6.8T 1 + 6.25Q 1) / (R 1 + S 1 + T 1 + Q 1) Bilinmeyen Q 0 ve R 1 buyruk sayılarını bulalım. Bu buyrukların çalıştırıldıkları aşamaların çevrim sayısı bakımından süreleri her iki çekirdek için de aynıdır. O halde, buyruk sayısı verilen çekirdekten yola çıkarak o aşamanın çevrim sayısını hesaplayıp, diğer çekirdeğin çalıştırdığı buyruk sayısını hesaplayabiliriz. 3x0.5Q 0 + 10x0.05Q 0 + 3x0.15Q 0 + 20x0.30Q 0 = 3x0.55Q 1 + 10x0.1Q 1 + 3x0.2Q 1 + 20x0.15Q 1 8.45Q 0 = 6.25Q 1 8.45Q 0 = 6.25x2x10 9 Q 0 = 1.48x10 9 3x0.4S 0 + 10x0.45S 0 + 3x0.05S 0 + 20x0.1S 0 = 3x0.3S 1 + 10x0.5S 1 + 3x0.1S 1 + 20x0.1S 1 7.85S 0 = 8.2S 1 S 1 = 0.96x10 9 O halde; Çekirdek 0 Toplam BBÇ = Toplam Çevrim / Toplam Buyruk Sayısı = (11R 0 + 7.85S 0 + 6.8T 1 + 6.25Q 1) / (R 0 + S 0 + T 0 + Q 0) = (11x1.5x10 9 + 7.85x10 9 + 6.8x0.5x10 9 + 6.25x2x10 9 )/(1.5x10 9 + 7.85x10 9 + 0 + 1.48x10 9 ) = 40.25/10.83 = 3.72 Çekirdek 1 Toplam BBÇ = Toplam Çevrim / Toplam Buyruk Sayısı = (11R 0 + 7.85S 0 + 6.8T 1 + 6.25Q 1) / (R 1 + S 1 + T 1 + Q 1) = 40.25 / (0 + 0.96 + 0.5 + 2) = 11.63 b) Her bir işlemci çekirdeğine kayan nokta işlemlerini hızlandıran birim eklenmesi planlanmaktadır. Bu birim, kayan nokta işlemlerini bir önceki sürüme göre %40 oranında daha az çevrimde tamamlamaktadır fakat çekirdeğin maksimum vuruş sıklığı 2.5GHz'de sınırlandırmaktadır. Kayan nokta işlemlerini hızlandıran böyle bir birim eklenmesi durumunda BBÇ ne olur? Önceki sürüme göre aynı programın çalıştırılmasında yüzde olarak ne kadar hızlanma/yavaşlama görülür? 3
Yapılan %40 oranında iyileştirme sayesinde kayan nokta buyruklarının çalıştığı çevrim sayısı 6'ya düşmüş oldu. Kayan nokta işlemlerindeki hızlanma nedeniyle aşamaların çalışma süresi kısalmış oldu. Dolayısıyla, A şıkkında? işareti yerine bulmuş olduğumuz buyruk sayıları her iki çekirdeğin de çalışmayı aynı anda bitirmemesine neden olabilir. Bu sorunu gidermek için çekirdeklerden hangisi çalışmayı en uzun sürede tamamlıyorsa onun çalışma süresini kullanıp, diğer çekirdeğe boşta çevrimler eklemeliyiz. Çekirdek 0 için; Aşama 1 Çevrim Sayısı = 3x0.4R 0 + 6x0.05R 0 + 3x0.1R 0 + 20x0.45xR 0 = 10.8R 0 Aşama 2 Çevrim Sayısı = 3x0.4S 0 + 6x0.45S 0 + 3x0.05S 0 + 20x0.1S 0 = 6.05S 0 Aşama 3 Çevrim Sayısı = Çekirdek 1 Aşama 3 Çevrim Sayısı Aşama 4 Çevrim Sayısı = 3x0.5Q 0 + 6x0.05Q 0 + 3x0.15Q 0 + 20x0.3Q 0 = 8.25Q 0 Çekirdek 1 için; Aşama 1 Çevrim Sayısı = Çekirdek 1 Aşama 1 Çevrim Sayısı Aşama 2 Çevrim Sayısı = 3x0.3S 1 + 6x0.5S 1 + 3x0.1S 1 + 20x0.1S 1 = 6.2S 1 Aşama 3 Çevrim Sayısı = 3x0.3T 1 + 6x0.3T 1 + 3x0.3T 1 + 20x0.1T 1 = 5.6T 1 Aşama 4 Çevrim Sayısı = 3x0.55Q 1 + 6x0.1Q 1 + 3x0.2Q 1 + 20x0.15Q 1 = 5.85Q 1 6.05S 0 > 6.2S 1 ve 8.25Q 0 > 6.25Q 1 'dir. O halde; Çekirdek 0 Toplam BBÇ = Toplam Çevrim / Toplam Buyruk Sayısı = (10.8R 0 + 6.05S 0 + 5.6T 1 + 8.25Q 0) / (R 0 + S 0 + T 0 + Q 0) = (10.8x1.5x10 9 + 6.05x10 9 + 5.6x0.5x10 9 + 8.25x1.48x10 9 )/(1.5x10 9 + 7.85x10 9 + 0 + 1.48x10 9 ) = 37.26/10.83 = 3.44 Çekirdek 1 Toplam BBÇ = Toplam Çevrim / Toplam Buyruk Sayısı = (10.8R 0 + 6.05S 0 + 5.6T 1 + 8.25Q 0) / (R 1 + S 1 + T 1 + Q 1) = 37.26 / (0 + 0.96 + 0.5 + 2) = 10.77 Yürütme zamanlarını bulmak için her aşamanın çevrim sayısını o aşamadaki saat periyodu ile çarpıp, tüm aşamaların çalışma sürelerini toplamamız gerekiyor. A şıkkı için yürütme zamanı; 11R 0/3x10 9 + 7.85S 0/2x10 9 + 6.8T 1/3x10 9 + 6.25Q 1/2x10 9 = 11x1.5/3 + 7.85x1/2 + 6.8x0.5/3 + 6.25x2/2 = 16.81 s (saniye) B şıkkı için yürütme zamanı; 10.8R 0/2.5x10 9 + 6.05S 0/2x10 9 + 5.6T 1/2.5x10 9 + 8.25Q 0/2x10 9 ) = 10.8x1.5/2.5 + 6.05x1/2 + 5.6x0.5/2.5 + 8.25x1.48/2 = 16.73 s O halde, b şıkkındaki iyileştirme sayesinde programın çalışma süresinde a şıkkına göre; 4
(16.81 16.76)/16.81 = %0.3 hızlanma sağlanmıştır. Soru 3 (15 + 35 (+ 15 bonus) = 50 (65 bonus)) 32-bit (4 byte) adresleme yapan bir buyruk kümesi tasarlamanız istenmektedir. Bu buyruk kümesinde 32- bitlik 8 adet genel amacli yazmaç (y0-y7) kullanılacaktır. Ayrıca bir adet 32-bitlik program sayacı (PS) bulunmaktadır. 16-bit sabit uzunlukta buyruklardan olusacak bu buyruk kümesi şu işlemleri içermelidir: Bellek: Yükle: yx Bellek[yY] Sakla: Bellek[yX] yy Taşıma: TaşıY: yx yy TaşıA: yx Anlık Aritmetik: Topla: yx yy + yz Çıkar: yx yy - yz Çarp: yx yy * yz Böl: yx yy / yz Mod: yx yy % yz Dallanma: Atla: PS PS + Anlık AtlaE: (yx = 0) ise PS PS + Anlık Diğer: Boşta: herhangi bir işlem yok NOT: 32-bitlik adresleme yapıldığından PS'in 1 artması programın iki buyruk ilerlemesine neden olacaktır. 16-bitlik buyrukların bellekten doğru bir şekilde çekildiğini varsayabilirsiniz. Yani dallanma olmayan durumlarda sıradaki buyruğun işlemciye doğru bir şekilde alındığını kabul edin. Arada kalan (yarım adreste) bir buyruğa atlanmak istenmesi durumundan kaçınmak için ise boşta buyruğunu kullanın. a) Yukarıda verilenlere göre tasarladığınız buyruk kümesinde bulunan buyruk türlerini ve komut, yazmaç, anlık değer gibi bit alanlarının uzunluklarını belirtip bu alanların 16-bitlik buyruklarda hangi bitlere karşılık geldiğini gösterin. 12 buyruk bulunduğu için 4 bit opcode kullanmamız yeterlidir. 8 adet yazmacı indexlemek için 3 bit gerekir. Bellek Buyrukları ve TaşıY: Opcode (4 bit) yx (3 bit) yy (3 bit) Taşı A, Atla ve AtlaE: Opcode (4 bit) yx (3 bit) Anlık (9 bit) 5
Aritmetik: Opcode (4 bit) yx (3 bit) yy (3 bit) yz (3 bit) b) Tasarladığınız buyruk kümesini kullanarak aşağıda C dilinde verilen kodu buyruk seviyesinde gerçekleyin. Bu kodda, short 16-bitlik, int ise 32-bitlik değişkenleri göstermektedir. A ve B short*, C ise int* olarak önceden tanımlanmış işaretçilerdir (pointer). Bu işaretçilerin başlangıç adresleri sırasıyla 0x00400000, 0x000000ab ve 0x00800000 olarak verilmiştir. (0x11 gösterimi sayının 16'lık tabanda olduğunu belirtir. Yani 0x11 = 17'dir) Yukarıda verilen işlemler dışında, kendi işlemlerinizi tanımlayarak buyruk kümesini genişletebilirsiniz. Eklediğiniz buyrukların nasıl kodlanacağını a) şıkkındaki gibi gösteriniz. Tek kısıtınız 4-byte'tan farklı adresleme çözünürlüğüne sahip bellek erişimi yapan buyruk ekleyememenizdir. Ayrıca, verilenler dışında bir dallanma buyruğu eklemeden buyruk seviyesinde doğru çalışan bir kod yazmanız durumunda ek olarak 15 puan alabilirsiniz. short i, j, k; short N = 1024; short P = 16; int tmp; for (k = 0; k < N; k++) { tmp = 0; for (i = 0; i < P; i++) { j = k - i; if (j >= 0) { tmp += A[k] * B[j]; //A and B are input arrays of type short with first elements starting at 0x00400000 and 0x000000ab, respectively } } C[i] = tmp; //C is an output array of type int with first element starting at 0x00800000 } 0 TaşıA y1, #10 TaşıA y0, #1 1 SolaKaydir y0, y0, y1 //N=1024 y0'da (shift left) 2 TaşıA y2, #0 //k Boşta TaşıA y1, #16 3: OUTER TaşıA y3, #0 //tmp TaşıA y4, #0 //i 6
LOOP 4: INNER_LO OP Çıkar y5, y2, y4 Brlz y5, BR (17) //branch if less than zero 5 TaşıA y6, #12 SolaKaydir y6, y0, y6 //loaded the base address of A 6 TaşıA y7, #1 SagaKaydir y7, y2, y7 //compute the offset (shift right) 7 Topla y6, y6, y2 Yukle y6, y6 //load A[k] 8 TaşıA y7, #2 Mod y7, y2, y7 9 Brz y7, NOSHIFT (2) //branch if zero TaşıA y7, #16 10 SagaKaydir y6, y6, y7 Boşta 11: NOSHIFT TaşıA y7, #16 12 SagaKaydir y6, y6, y7 //made all high 16 bits zero SolaKaydir y6, y6, y7 TaşıA y1, #0xab //load the base fo B 13 TaşıA y, #1 SagaKaydir y7, y5, y7 //compute the offset 14 Topla y1, y1, y7 Yukle y7, y1 //load B[j] 15 TaşıA y1, #2 Mod y1, y5, y1 16 Brz y1, NOSHIFT2 (2) TaşıA y5, #16 17 SagaKaydir y7, y7, y5 NOP 18: NOSHIFT2 TaşıA y5, #16 19 SagaKaydir y7, y7, y5 //makde all high 16 bits zero SolaKaydir y7, y7, y5 TaşıA y1, #16 //restore P 20 Çarp y5, y6, y7 Topla y3, y3, y5 //tmp += 21: BR TaşıA y6, #1 Topla y4, y4, y6 22 Çıkar y6, y1, y4 Boşta 23 Brnz y6, INNER_LOOP (-19) //branch if not zero TaşıA y5, #13 24 SolaKaydir y5, y0, y5 Topla y5, y5, y4 25 Sakla y5, y3 //store tmp to C[i] TaşıA y5, #1 26 Topla y2, y2, y5 Çıkar y5, y0, y2 27 Brnz Y5, OUTER_LOOP (-24) //branc if not zero 7