You are on page 1of 19

PIPELINE

8.1.1 PERANAN MEMORI CACHE Tiap stage dalam pipeline diharapkan menyelesaikan operasinya dalam satu clock cycle. Karenanya, periode clock harus cukup lama untuk menyelesaikan tugas yang sedang dilakukan pada tiap stage. Jika unit yang berbeda memerlukan jumlah waktu yang berbeda, maka periode clock harus memungkinkan tugas terlama dapat diselesaikan. Suatu unit yang menyelesaikan tugasnya lebih awal akan idle selama sisa periode clock. Karenanya, pipelining paling efektif dalam meningkatkan performa jika tugas yang sedang dilakukan dalam stage yang berbeda memerlukan jumlah waktu yang sama. Pertimbangan ini terutama penting untuk langkah pengambilan instruksi (instruct c!" fetch#, yang menetapkan sate periode clock pada $ambar %.&a. 'lock cycle harus setara a.( lebih besar daripada waktu yang diperlukan untuk menyelesaikan operasi pengambilan. )h. *., tetapi, waktu akses memori utama mungkin sepuluh kali lebih besar daripada waktu yang dipt* lukan untuk menjalankan operasi pipeline stage dasar dalam prosesor, misalnya penambar&m dua bilangan. Jadi, jika tiap pengambilan instruksi memerlukan akses ke memori utama, rr.a.+a pipelining tidak akan begitu berguna. Penggunaan memori cache menyelesaikan persoalan akses memori. Secara khusus, p saat cache disertakan pada chip yang sama dengan prosesor, maka waktu akses ke cache bias ya sama dengan waktu yang diperlukan untuk menjalankan operasi dasar lain di dalam pro . sor. ,al ini memungkinkan membagi pengambilan dan pengolahan instruksi ke dalam langk langkah dengan durasi yang lebih kurang setara. Tiap langkah dilakukan dengan pipeline s .(..- yang berbeda, dan periode clock dipilih untuk disesuaikan dengan yang paling panjang. 8.1.2 PERFORMA PIPELINE Prosesor pipelined pada $ambar %.& menyelesaikan pengolahan satu instruksi pada tiap c , cycle, yang berarti kecepatan pengolahan instruksi tersebut empat kali lebih besar dari op e. berurutan. Peningkatan potensial dalam performa yang dihasilkan dari pipelining proporj,./ dengan jumlah pipeline stage. )kan tetapi, peningkatan ini hanya akan dicapai jika ope pipelined seperti yang digambarkan pada $ambar %.&a dapat dipertahankan tanpa inter melalui eksekusi program. Sayangnya,

ini bukanlah masalahnya. 0ntuk berbagai alasan, salah satu pipeline stage mungkin tidak dapat menyelesaikan pengolahan instruksinya dalam waktu yang ditentukan. /isalnya, stage 1 dalam four*- pipeline pada $ambar %.&b bertanggung jawab untuk operasi aritmatika dan logika, dan clock cycle ditetapkan untuk tugas ini. Sekalipun ini mungkin cukup untuk sebagian besar rasi, beberapa operasi, misalnya pembagian, mungkin memerlukan waktu penyelesaian lebih banyak. $ambar %.2 menunjukkan contoh dimana penyelesaian operasi yang ditendalam instruksi 34 memerlukan tiga cycle, dari cycle 5 hingga cycle 6. Jadi, pada cycle 6, 7rite stage tidak boleh melakukan apapun, karena tidak memiliki data untuk dikes Sementara itu, informasi dalam buffer 8, harus tetap lengkap hingga 19ecute stage telah / lesaiakan operasinya. 3ni berarti stage & dan, selanjutnya, stage : diblok agar tidak men instruksi baru karena informasi dalam 8 , tidak dapat di*o;erwrite. Jadi, langkah <5 dan => ditunda seperti yang ditunjukkan. ?perasi pipelined pada $ambar %.2 dikatakan stalled selama dua clock cycle. pipelined normal dimulai lagi pada cycle @. Tiap kondisi yang menyebabkan pipeline stall but haAard. Kita baru saja memperhatikan contoh data haAard. <ata haAard adalah tiap k dimana source atau destination operand suatu instruksi tidak tersedia pada waktu diperl dalam pipeline. )kibatnya beberapa operasi harus di tunda dan pipeline mengalami stab. Pipeline juga dapat di*stall karena jeda dalam ketersediaan instruksi. /isalnya, hal ini dapat merupakan akibat dari suatu miss dalam cache, yang meminta instruksi diambil dari memori utama. ,aAard tersebut sering disebut control haAard atau instruction haAard. 1fek cache miss pada operasi pipelined diilustrasikan pada $ambar %.5. 3nstruksi 33 diambil dari cache pada cycle :, dan eksekusinya berjalan secara normal. )kan tetapi, operasi fetch untuk instruksi :&B yang dimulai pada cycle &, menghasilkan cache miss. 0nit pengambilan instruksi sekarang harus menangguhkan tiap reCuest pengambilan berikutnya dan menunggu 34 tiba. Kita

%.5b. $ambar ini menunjukkan fungsi yang dijalankan oleh tiap pipeline stage dalam tiap clock cycle. Perhatikanlah bahwa unit <ecode idle pada cycle 2 hingga D, unit 19ecute idle pada cycle 5 hingga 6, dan unit 7rite idle pada cycle D hingga @. Periode idle tersebut disebut stall. Sering disebut juga sebagai bubble dalam pipeline. Setelah terbentuk akibat jeda pada salah satu pipeline stage, maka bubble bergerak menurun hingga mencapai unit terakhir. Tipe haAard ketiga yang mungkin ditemui dalam operasi pipelined dikenal sebagai structural haAard. 3ni adalah situasi pada saat dua instruksi

perlu menggunakan resource hardware tertentu pada waktu yang sama. Kasus paling umum dimana haAard ini muncul adalah pada akses ke memori. Satu instruksi mungkin perlu mengakses memori sebagai bagian dari 19ecute atau 7rite stage pada saat instruksi lain sedang diambil. Jika instruksi dan data berada pada unit cache yang sama, maka hanya satu instruksi yang dapat dilakukan dan instruksi lain ditunda. 8anyak prosesor menggunakan cache instruksi dan data terpisah untuk menghindari jeda ini. 'ontoh structural haAard ditunjukkan pada $ambar %.D. $ambar ini menunjukkan bagaimana instruksi load Eoad F(G:#,G& dapat diakomodasi dalam contoh 5*stage pipeline kita. )lamat memori, FH IG:J, dihitun pada langkah 14 pada cycle 5, kemudian akses memoriberlangsung pada cycle S. ?peKandyan dibaca dari memori dituliskan ke dalam register G& pada cycle 6. 3ni berarti langkah ekseku- instruksi ini memerlukan dua clock cycle (cycle 5 dan D#. ,al ini menyebabkan pipeline star( selama satu cycle, karena instruksi 3 4 dan : 2 memerlukan akses ke register file pada cycle 6 Sekalipun instruksi dan datanya tersedia, pipeline di* stall karena satu resource hardware, yaiLw register file, tidak dapat menangani dua operasi sekaligus. Jika register file memiliki dua poinput, yaitu, j ika memungkinkan dua operasi tulis simultan, maka pipeline tidak akan di*star Secara umum, structural haAard dicegah dengan menyediakan resource hardware yang cukldalam chip prosesor.

Sangat penting untuk memahami bahwa pipelining tidak menyebabkan instruksi indi;.,aa. dieksekusi lebih cepat> sebaliknya, pipelining meningkatkan throughput, dimana through diukur dari kecepatan penyelesaian eksekusi instruksi. Setiap kali salah satu dari stage pipeline tidak dapat menyelesaikan operasinya dalam satu clock cycle, maka pipeline stall. terjadi beberapa degradasi dalam performa. Jadi, le;el performa penyelesaian satu ins pada tiap clock cycle sebenarnya adalah 8atas atas untuk throughput yang dapat dicapai da . prosesor pipelined yang diatur seperti pada $ambar %.&b. Tujuan penting dalam mendesain prosesor adalah untuk mengidentifikasi semua h yang dapat menyebabkan pipeline stall dan menmukan cara meminimalisasi pengaruhn>.8. Pada bagian selanjutnya kita membahas berbagai haAard, mulai dari data haAard, dilanjuM-dengan control haAard. Pada tiap kasus kits menampilkan beberapa teknik yang digunakan

untuk mengurangi pengaruh negatifnya pada performa. Kita kembali ke persoalan penilaian performa pada 8agian %.%. 8.2 DATA HAZARD <ata haAard adalah situasi dimana pipeline di*stall karena data yang akan dikenai operasi ditunda dengan beberapa alasan, seperti yang diilustrasikan pada $ambar %.2. Kita sekarang akan menganalisa persoalan ketersediaan data dalam beberapa detil. Perhatikan suatu program yang berisi dua instruksi, 3, diikuti oleh 3&. Pada saat program ini dieksekusi dalam pipeline, eksekusi 34 dapat mulai sebelum eksekusi 3, diselesaikan. ,al ini berarti hasil 3, mungkin tidak tersedia untuk digunakan oleh 3&. Kita harus memastikan bahwa hasil yang diperoleh pada saat istruksi dieksekusi dalam prosesor pipelined identik dengan yang diperoleh pada saat instruksi yang sama dieksekusi secara berurutan. Potensi mendapatkan hasil yang tidak tepat pada saat operasi dilakukan secara konkuren dapat ditunjukkan de* ngan contoh sederhana berikut. )sumsikan ) (D, dan perhatikan dua operasi berikut )=**2H) 8=*59) Pada saat operasi tersebut dilakukan dalam urutan tersebut, maka hasilnya adalah 8(2&. Tetapi keduanya dilakukan secara konkuren, nilai ) yang digunakan dalam menghitung 8 adalah nilai awal, D, sehingga memberikan hasil yang tidak tepat. Jika dua operasi ini dilakukan oleh instruksi dalam suatu program, maka instruksi tersebut harus dieksekusi satu demi satu, karena data yang digunakan pada instruksi kedua tergantung pada hasil instruksi pertama. Sebaliknya, dua operasi )te* D 9 ' 8N* 20 H ' dapat dilakukan secara konkuren, karena operasi tersebut 8aling bebas. Time 'lock cycle : Instru s! :: (/ul# :& ()dd# 2 3 4 5 6 7 8 9

2 :5 "#$%#r 8.6 ( -c*eilne di*stall oleh ata dependency irara <& dan 7:.

'ontoh ini mengilustrasikan batasan dasar yang harus dilakukan untuk menjamin hasil yang tepat. Pada saat dua operasi saling tergantung satu sama lain, maka keduanya harus dilakukan secara berurutan dalam urutan yang benar. Kondisi ini jelas memiliki konsekuensi yang mendalam. /emahami implikasinya adalah kunci untuk memahami berbagai alternatif desain dan pertukaran yang dihadapi dalam komputer pipelined. Perhatikan pipeline pada $ambar %.&. <ata dependency yang barn saja dideskripsikan muncul pada saat destinasi satu instruksi digunakan sebagai source pada instruksi berikutnya. /isalnya, dua instruksi /ul G&,G2,G5 )dd GD,G5,G6 menghasilkan data dependency. ,asil dari instruksi perkalian ditempatkan dalam register G5, yang kemudian merupakan salah satu dari dua source operand pada instruksi Add. Dengan mengasumsikan bahwa operasi perkalian memerlukan satu clock cycle untuk selesai, maka eksekusi akan dilakukan seperti yang ditunjukkan pada Gambar 8.6. Pada scat unit Decode men-decode instruksi Add pada cycle , unit tersebut mengetahui bahwa !" digunakan sebagai source operand. #arenanya, langkah D pada instruksi tersebut tidak dapat diselesaikan hingga langkah $ pada instruksi multiply telah diselesaikan. Penyelesaian langkah D% harus ditunda hingga clock cycle &, dan ditunjukkan sebagai langkah D'A pada gambar tersebut. (nstruksi ) diambil pada cycle , tetapi decoding-nya harus ditunda karena langkah D tidak dapat mendahului D%. #arenanya, eksekusi pipelined di-stall selama dua cycle. 8.2.1 OPERAND FORWARDING Data ha*ard yang baru saja dideskripsikan muncul karena satu instruksi, instruksi (% pada Gambar 8.6, menunggu data dituliskan dalam register +ile. Akan tetapi, data tersebut tersedia pada output A,- pada saat ./ecute stage menyelesaikan langkah .,. #arenanya, jeda dapat dikurangi, atau mungkin dihilangkan, jika kita mengatur agar basil instruksi (l di-+orward langsung untuk digunakan pada langkah .'.

ter file. Pengaturan ini mirip dengan struktur tiga*bus pada $ambar @.%, kecuali bahwa telah ditambahkan register SG':, SG'&, dan GSET. Gegister tersebut merupakan interstage buffer yang diperlukan untuk operasi pipelined, seperti yang diilustrasikan pada $ambar %.@b. <engan mengacu ke $ambar %.&b, register SG' : dan SG'& adalah bagian dari buffer 8& dan GSET adalah bagian 82. /ekanisme data forwarding disediakan oleh jalur koneksi berwarna biru. <ua multiple9er yang dihubungkan pada input ke )E0 memungkinkan data pada bus destinasi lebih dipilih daripada isi register SG' : atau SG'&. Pada saat instruksi pada $ambar %.6 dieksekusi dalam datapath pada $ambar %.@, maka operasi yang dilakukan pada tiap clock cycle adalah sebagai berikut. Setelah decoding instruksi 34 dan mendeteksi data dependency, maka dibuat suatu keputusan untuk menggunakan data forwarding. ?perand tidak terlibat dalam dependency tersebut, register G&, dibaca dan di*load ke dalam register SG' : pada clock cycle 2. Pada clock cycle berikutnya, hash dari instruksi 33 tersedia dalam register GSET, dan karena koneksi forwarding, maka hash tersebut dapat digunakan pada langkah 1&. Karenanya, eksekusi 34 dilakukan tanpa interupsi. 8.2.2 MENAN"ANI DATA HAZARD DALAM &OFT'ARE Pada $ambar %.6, kita mengasumsikan data dependency ditemukan oleh hardware pada scat instruksi di*decode. ,ardware kontrol menunda pembacaan register G5 hingga cycle D, sehingga memunculkan &*cycle stall kecuali jika digunakan operand forwarding. Suatu pendekatan alternatif adalah dengan menyerahkan tugas pendeteksian data dependency dan penanganannya pada software. <alam hal ini, compiler dapat menyatakan jeda dua*cycle yang diperlukan antara instruksi 3, dan 34 dengan menyesipkan instruksi O?P (Oo*operation# , sebagai berikut ii /u : G&, G2, G5 O?P O?P : 2: )dd GD, G5, G6 Jika tanggung jawab untuk mendeteksi dependency tersebut sepenuhnya diserahkan pada software, maka kompiler harus menyisipkan instruksi O?P untuk mendapatkan hash yang te* pat. Kemungkinan ini mengilustrasikan link tertutp antara kompiler dan hardware. Suatu fitur khusus dapat diimplementasikan dalam hardware atau diserahkan pada

kompiler. Penyerahan tugas seperti penyisipan instruksi O?P ke kompiler menghasilkan hardware yang lebih sederhana. <engan menyadari kebutuhan terhadap jeda, maka kompiler dapat mencoba menyusun ulang instruksi untuk melakukan tugas yang berguna dalam slot O?P, dan dengan demikian mencapai performa yang lebih baik. Sebaliknya, penyisipan instruksi O?P menghasilkan ukuran kode yang lebih besar. Juga, sering terjadi arsitektur suatu prosesor memiliki beberapa implementasi hardware, yang menawarkan fitur berbeda. 3nstruksi O?P yang disisipkan untuk memenuhi persyaratan satu implementasi mungkin tidak diperlukan dan, karenanya, akan menggurangi performa implementasi yang berbeda. (.2.3 EFE) &AMPIN" <ata dependency yang ada pada contoh sebelumnya eksplisit dan mudah dideteksi karena register yang terlibat dinamai sebagai destinasi dalam instruksi 3, dan source dalam 34. Kadang* kadang suatu instruksi mengubah isi register selain yang disebut sebagai destinasi. contohnya adalah instruksi yang menggunakan mode pengalamatan autoincrement atau autodecrement. Selain untuk menyimpan data barn dalam lokasi destinasinya, instruksi tersebut mengubah isi source register yang digunakan untuk mengakses salah satu operand* nya. Semua tindakan pencegahan untuk menangani data dependency yang melibatkan lokasi destinasi harus juga diterapkan pada register yang dipengaruhi oleh operasi autoincrement atau autodecrement. Pada saat lokasi selain yang secara eksplisit disebut dalam satu instruksi sebagai operand destinasi dipengaruhi, maka instruksi tersebut dikatakan memiliki efek samping (side effect#. /isalnya, instruksi stack, seperti push dan pop, menghasilkan efek samping yang serupa karena instruksi tersebut secara implisit menggunakan mode pengalamatan autoincrement dan autodecrement. 1fek samping lain yang melibatkan condition code flag, adalah yang digunakan oleh instruksi seperti conditional branch dan add*with*carry. /isalkan register G: dan G& menyimpan bilangan integer double*precision yang akan kita tambahkan ke bilangan double*precision yang lain dalam register G2 dan G5. ,al ini dapat dicapai sebagai berikut )dd G:, G2 )dd7ith'arry G&,G5 <ependency implisit ada diantara dua instruksi ini melalui carry flag. =lag ini diset oleh instruksi pertama dan digunakan pada instruksi kedua, yang menjalankan operasi

G5 =** IG&J H IG5J H carry 3nstruksi yang memiliki efek samping meningkatkan banyaknya data dependency, yang menghasilkan peningkatan substantial kompleksitas hardware atau software yang diperlukan untuk menyelesaikannya. 0ntuk alasan ini, desain instruksi untuk eksekusi pada pipelined hardware sebaiknya memiliki beberapa efek samping. 3dealnya, hanya isi lokasi destinasi, lokasi register atau memori, yang dipengaruhi oleh tiap instruksi. 1fek samping, seperti setting condition code flag atau updating isi address pointer, dijaga pada minimum. )kan tetapi, 8ab & menunjukkan bahwa mode pengalamatan autoincrement dan autodecrement secara potensial berguna. 'ondition code flag juga diperlukan untuk mencatat informasi penghasil carry atau penyebab o;erflow dalam operasi aritmatika. Pada 8agian %.5 kita menunjukkan bagaimana fungsi tersebut dapat disediakan oleh sarana lain yang konsisten dengan organisasi pipelined dan dengan persyaratan optimiAing compiler. 8.3 IN&TR*CTION HAZARD Tujuan unit pengambilan instruksi fetch adalah untuk menyediakan arus instruksi tetap bagi unit eksekusi. Kapanpun arus ini diinterupsi, maka pipeline stall, seperti pada $ambar %.5 yang mengilustrasikan kasus cache miss. 3nstruksi branch dapat pula menyebabkan pipeline menjadi stall. Sekarang kita akan menganalisa efek instruksi branch dan teknik yang dapat digunakan untuk mengurangi pengaruhnya. Kita mulai dengan unconditional branch. 8.3.1 *NCONDITIONAL +RANCH $ambar %.% menunjukkan rangkaian instruksi yang dieksekusi dalam two*stage pipeline. 3nstruksi :: hingga : 2 disimpan pada alamat memori yang berurutan, dan 3 4 adalah instruks branch. /isalkan branch target adalah instruksi 3P Pada clock cycle 2, operasi pengambilan untuk instruksi : 2 berjalan pada scat yang sama dengan instruksi branch yang sedang di*decode dan alamat target yang dihitung. Pada clock cycle 5, prosesor harus membuang 32, yang telah diambil secara tidak tepat, dan mengambil instruksi 3k. Sementara itu, unit hardware yang bertanggung jawab untuk langkah 19ecute (1# harus diberitahu untuk tidak melakukan apapun selama periode clock tersebut. Jadi, pipeline di*stall selama satu clock cycle. 7aktu yang hilang karena instruksi branch sering disebut branch penalty. Pada $amb- %.%, branch penalty adalah satu clock cycle. 0ntuk pipeline yang lebih panjang, branch penal*Q bisa lebih tinggi. /isalnya, $ambar %.Ba menunjukkan efek instruksi branch pada four*staff. pipeline. Kita telah mengasumsikan bahwa alamat branch dihitung pada langkah 1&. 3nstrul 32 dan : 5 harus

dibuang, dan instruksi target, 3k , diambil pada clock cycle D. Jadi, branch penal*.L adalah dua clock cycle. Pengurangan branch penalty dilakukan dengan menghitung alamat branch lebih awal dalam pipeline. 8iasanya, unit pengambilan instruksi memiliki dedicated hardware untuk mengide tifikasi instruksi branch dan menghitung alamat branch target secepat mungkin setelah siu !*/ instruksi diambil. <engan hardware tambahan ini, kedua tugas tersebut dapat dilakukan p langkah <&, menghasilkan rangkaian kejadian yang ditunjukkan pada $ambar %.Bb. <alam ini, branch penalty hanya satu clock cycle. ,u-u- .#n Pr-/-t01!n2 Instru s! 'ache miss atau instruksi branch men*stall pipeline selama satu clock cycle atau lebih. 0ntuk mengurangi efek interupsi tersebut, banyak prosesor menggunakan unit pengambilan yang canggih yang dapat mengambil instruksi sebelum diperlukan dan meletakkannya dalam Cueue. 8iasanya, Cueue instruksi dapat menyimpan beberapa instruksi. Suatu unit terpisah, yang kite sebut unit dispatch, mengambil instruksi dari bagian depan Cueue den mengirimkannya ke un!eksekusi. ,al ini menghasilkan organisasi seperti yang ditunjukkan pada $ambar %.:R. 0Edispatch juga melakukan fungsi decoding. )gar efektif, unit pengambilan harus memiliki kemampuan decoding den pengola yang cukup untuk mengenali dan mengeksekusi instruksi branch. 0nit tersebut menjaga CE je instruksi tetap terisi sepanjang waktu untuk mengurangi pengaruh jeda occasional pada mengambil instruksi. Pada seat pipeline stall karena data haAard, misalnya, unit dispatch - dapat mengeluarkan instruksi dari Cueue instruksi. )kan tetapi, unit pengambilan terus rt * ambil instruksi den menambahkannya ke Cueue. Sebaliknya, jika terdapat jeda dalam pen.( bilan instruksi karena branch atau cache miss, make unit dispatch terus mengeluarkan instr dari Cueue instruksi. $ambar %.:: mengilustrasikan bagaimana panjang Cueue berubah den bagaimana pe*. ruhnya terhadap hubungan antara pipeline stage yang berbeda. Kite telah mengasurn>bahwa Cueue pada awalnya berisi satu instruksi. Setiap operasi pengambilan menam * satu instruksi ke Cueue den setiap operasi dispatch mengurangi panjang Cueue sebesar Karenanya, panjang Cueue tetap same dalam empat clock cycle pertama. (Terdapat lar*. = den < dalam tiap cycle tersebut.# /isalkan instruksi 3, memunculkan &* cycle stall. h.i.a tersedia ruang dalam Cueue tersebut, make unit pengambilan terus mengambil instruk*s. panjang Cueue meningkat menjadi 2 pada clock cycle 6. 3nstruksi 3S adalah instruksi branch. 3nstruksi targetnya, 3 k , diambil pada cycle @. ,>a struksi : 6 dibuang. 3nstruksi branch biasanya akan menyebabkan stall pada cycle @ akiba .. buangan instruksi 36. Sebaliknya,

instruksi : 5 di*dispatch dari Cueue ke decoding stage. -"*. discarding 36, panjang Cueue menurun hingga : pada cycle %. Panjang Cueue akan berad. nilai ini hingga menemui stall lain. Sekarang amati rangkaian penyelesaian instruksi pada $ambar %.::. 3nstruksi 3 .. . 3.. >S den 3k menyelesaikan eksekusi dalam dock cycle yang berurutan. Karenanya, instruksi - . tidak meningkatkan waktu eksekusi secara keseluruhan. ,al ini karena unit pengmab. .(struksi mengeksekusi instruksi branch (dengan menghitung alamat branch# secara kodengan eksekusi instruksi lain. Teknik ini disebut sebagai branch folding.

Perhatikanlah branch folding hanya terjadi jika pada saat memasuki instruksi branch, setidaknya tersedia satu instruksi dalam Cueue selain instruksi branch. Jika hanya instruksi branch yang terdapat dalam Cueue, maka eksekusi akan dilakukan seperti pada $ambar %.Bb. ?leh karena itu, diinginkan untuk mengatur Cueue agar selalau penuh sepanjang waktu, untuk menjamin suplai instruksi yang cukup untuk pengolahan. ,al ini dapat dicapai dengan meningkatkan kecepatan unit pengambilan membaca instruksi dari cache. Pada banyak prosesor, lebar koneksi antara unit pengambilan dan cache instruksi memungkinkan pembacaan lebih dari satu instruksi pada tiap clock cycle. Jika unit pengambilan mengisi Cueue instruksi segera setelah terjaadi branch, maka probabilitas terjadinya branch folding akan meningkat. )danya Cueue instruksi juga bermanfaat dalam menangani cache miss. Pada saat terjadi cache miss, unit dispatch terus mengirim instruksi untuk eksekusi sepanjang Cueue instruksi tidak kosong. Sementara itu, blok cache yang dimaksud dibaca dari memori utama atau dari cache sekunder. Pada scat operasi pengambilan dilanjutkan, Cueue instruksi diisi ulang. Jika Cueue tidak kosong, maka cache miss tidak akan berpengaruh pada kecepatan eksekusi instruksi. Secara ringkas, Cueue instruksi mengurangi pengaruh instruksi branch pada performa melalui prows branch folding. <an juga memiliki efek yang sama pada stall yang disebabkan oleh cache miss. Keefektifan teknik ini ditingkatkan pada saat unit pengambilan instruksi dapat membaca lebih dari satu instruksi pada satu waktu dari cache instruksi. 13.2 CONDITIONAL +RANCH DAN +RANCH PREDICTION 3nstruksi conditional branch menimbulkan haAard tambahan yang disebabkan oleh ketergantungan kondisi branch pada hash instruksi sebelumnya. Keputusan untuk branch tidak dapat dibuat hingga eksekusi instruksi tersebut telah selesai.

3nstruksi branch sering terjadi. Sebenarnya, instruksi tersebut menggambarkan sekitar &R persen count instruksi dinamik pada kebanyakan program. ('ount dinamik adalah jumlah eksekusi instruksi, yang memperhitungkan fakta bahwa beberapa instruksi program dieksekusi berulang kali karena loop.# Karena branch penalty, persentase yang besar ini akan mengurangi perolehan performa yang diharapkan dari pipelining. 0ntungnya, instruksi branch dapat ditangani dengan beberapa cara untuk mengurangi pengaruh negatifnya pada kecepatan eksekusi instruksi. D-3#4-. +r#n01 Pada $ambar %.%, prosesor mengambil instruksi : 2 sebelum menentukan apakah instruksi tersebut, :&, adalah instruksi branch. Pada scat eksekusi 34 diselesaikan dan dibuat suatu branch, maka prosesor harus membuang 32 dan mengambil instruksi pada branch target. Eokasi setelah instruksi branch disebut branch delay slot. /ungkin terdapat lebih dari satu branch delay slot, tergantung pada waktu yang diperlukan untuk mengeksekusi instruksi branch. /isalnya, terdapat dua branch delay slot pada $ambar %.Ba dan satu delay slot pada $ambar %.Bb. 3nstruksi pada delay slot selalu diambil dan setidaknya telah dieksekusi sebagian sebelum keputusan branch dibuat dan alamat target branch dihitung. Suatu teknik yang disebut delayed branching dapat meminimalisasi penalty yang terjadi sebagai akibat instruksi conditional branch. 3de tersebut sederhana. 3nstruksi dalam delay slot selalu diambil. ?leh karena itu, kita akan mengaturnya agar dieksekusi sepenuhnya baik dilakukan branch atau tidak. Tujuannya adalah untuk dapat menempatkan instruksi yang berguna dalam slot tersebut. Jika tidak ada instruksi berguna yang bisa ditempatkan dalam delay slot, maka slot ini harus diisi dengan instruksi O?P Situasi ini tepat sama dengan kasus data dependency yang dibahas pada 8agian %.&. Perhatikan rangkaian instruksi yang dinyatakan pada $ambar %.:&a. Gegister G& digunakan sebagai counter untuk menentukan berapa kali isi register G: digeser ke kiri. 0ntuk prosesor dengan satu delay slot, instruksi tersebut dapat disusun ulang seperti yang ditunjukkan pada $ambar %.:&b. 3nstruksi shift diambil pada saat instruksi branch dieksekusi. Setelah men* ge;aluasi branch condition, prosesor mengambil instruksi pada E??P atau pada O1FT, tergantung pada apakah masing*masing branch condition benar atau salah. Pada kasus lain, prosesor menyelesaikan eksekusi instruksi shift. Gangkaian kejadian selama dua lewatan terakhir dalam loop diilustrasikan pada $ambar %.:2. ?perasi pipelined tidak diinterupsi kapanpun, dan tidak ada idle cycle. Secara logika, program tersebut dieksekusi seakan instruksi branch berada setelah instruksi shift. 8ranching terjadi satu instruksi lebih awal daripada yang ditampilkan dalam rangkaian instruksi dalam memori, sehingga bernama +delayed branch.+ 5#6 L778 8r72r#$ #9#3 E?? <ecremen G& 8ranch(? E?

G: Shift left G O1F )dd l (b# 3nstruksi yang disusun ulang

Keefektifan pendekatan delayed branch tergantung pada seberapa 8ering pengaturan ulang instruksi dimungkinkan seperti dalam $ambar %.:&. <ata eksperimen yang dikumpulkan dari banyak program mengindikasikan bahwa teknik kompilasi yang rumit dapat menggunakan satu branch delay slot pada maksimal %D persen kasus. 0ntuk prosesor dengan dua branch delay slot, kompiler mencoba menemukan dua instruksi sebelum instruksi branch yang dapat dipindahkannya ke delay slot tanpa menimbulkan error logika. Kesempatan untuk menemukan dua instruksi semacam itu lebih sedikit dari kemungkinan untuk menemukan satu. Jadi, jika peningkatan jumlah pipeline stage melibatkan peningkatan jumlah branch delay slot, maka peningkatan potensial dalam performa tidak akan sepenuhnya tampak. Pr-.! s! +r#n01 Teknik lain untuk mengurangi branch penalty yang berhubungan dengan conditional branch adalah dengan mencoba memprediksikan apakah suatu branch akan dilakukan atau tidak. 8entuk paling sederhana dari prediksi branch adalah dengan mengasumsikan bahwa branch tersebut tidak akan terjadi dan terus mengambil instruksi dengan susunan alamat yang berurutan. ,ingga branch condition die;aluasi, eksekusi instruksi disepanjang jalur yang diprediksikan harus dilakukan pada basis spekulatif. 1ksekusi speculatif berarti instruksi tersebut dieksekusi sebelum prosesor yakin bahwa dia berada dalam rangkaian eksekusi yang tepat. Karenanya, harus diperhatikan bahwa tidak ada register prosesor atau lokais memori yang di*update hingga ada konfirmasi bahwa instruksi tersebut sebaiknya dieksekusi. Jika keputusan branch mengindikasikan sebaliknya, instruksi tersebut dan semua data yang berhubungan dengannya dalam unit eksekusi harus disingkirkan, dan instruksi yang tepat diambil dan dieksekusi.

8ranch terprediksi yang tidak tepat diilustrasikan pada $ambar %.:5 untuk four*stag pipeline. $ambar tersebut menunjukkan instruksi 'ompare diikuti oleh instruksi 8ranch Prediksi branch terjadi di cycle 2, pada saat instruksi : 3 sedang diambil. 0nit pengambila - memprediksikan bahwa branch tersebut tidak akan dilakukan, dan kemudian melanjutkan u**tuk mengambil instruksi : 4 pada saat 13 memasuki <ecode stage. ,asil dari operasi compare tersedia pada akhir cycle 2. <engan mengasumsikan bahwa hasil tersebut diteruskan dengue segera ke unit pengambilan instruksi,

maka branch condition die;aluasi pada cycle 5. Pada ti*.-3 ini, unit pengambilan instruksi mengetahui bahwa prediksi tersebut tidak tepat, dan dua ir struksi dalam e9ecution pipe disingkirkan. 3nstruksi barn, 3k , diambil dari alamat branch tang(. pada clock cycle D. Jika keluaran branch random, maka setengah branch akan dilakukan. Jadi pendekat. sederhana dengan mengasumsikan bahwa branch tidak akan dilakukan akan menghemat -5: persen waktu yang dibuang untuk melakukan conditional branch. )kan tetapi, performa leltbaik dapat dicapai jika kita mengatur beberapa instruksi branch yang diprediksikan untuk -.lakukan dan yang lain untuk tidak dilakukan, tergantung pada kelakuan program yang diharAkan. /isalnya, instruksi branch pada akhir loop menyebabkan branch ke awal loop untuk set lewatan melalui loop kecuali yang terakhir. Karenanya, sangat menguntungkan untuk mengasumsikan bahwa branch akan dilakukan dan unit pengambilan instruksi mulai mengambil ***struksi pada alamat traget branch. Sebaliknya, untuk instruksi branch pada awal loop progra.*.. h lebih menguntungkan untuk mengasumsikan bahwa branch tidak akan dilakukan. Keputusan tentang cara mana yang digunakan untuk memprediksi hasil branch day dibuat pada hardware dengan mengamati apakah alamat target branch lebih rendah atau let+, tinggi daripada alamat instruksi branch. Pendekatan yang lebih fleksibel adalah menggunak >mkompiler untuk memutuskan apakah suatu instruksi branch sebaiknya diprediksi untuk dilak. kan atau tidak. 3nstruksi branch pada beberapa prosesor, seperti SP)G', menyertakan bran., prediction bit, yang diset ke R atau : oleh kompiler untuk mengindikasikan kelakuan ;diharapkan. 0nit pengambilan instruksi mameriksa bit ini untuk memprediksi apakah bran.*i tersebut akan dilakukan atau tidak. <engan salah satu skema tersebut, keputusan prediksi branch selalu sama setiap kali sly instruksi dieksekusi. Tiap pendekatan yang memiliki karakteristik ini disebut prediksi brae statik (static branch prediction#. Pendekatan lain dimana keputusan prediksi (prediction de sion# dapat berubah tergantung pada sejarah eksekusinya disebut prediksi branch dinamik i namic branch prediction#.

8.4 PEN"AR*H PADA &ET IN&TR*)&I

Kita telah melihat bahwa beberapa instruksi lebih sesuai untuk eksekusi pipelined daripa S yang lain. /isalnya, efek samping instruksi dapat menyebabkan data dependency yang c > diinginkan. <alam bagian ini, kita menganalisa hubungan antara fitur eksekusi pipelined 3 instruksi mesin. Kita membahas dua aspek utama instruksi mesin*mode pengalamatan condition code flag. 8.4.1 MODE PEN"ALAMATAN /ode pengalamatan sebaiknya menyediakan sarana untuk mengakses berbagai struktur data secara mudah dan efisien. /ode penggalamatan yang baik antara lain inde9, indirect, autoin* crement, dan autodecrement. 8anyak prosesor menyediakan berbagai kombinasi mode tersebut untuk meningkatkan fleksibilitas set instruksinya. /ode pengalamatan comple9, misalnya yang melibatkan double inde9ing, sering sekali ditemui. <alam memilih mode pengalamatan untuk diimplementasikan dalam prosesor pipelined, kita harus memperhatikan efek tiap mode pengalamatan pads aliran instruksi dalam pipeline. <ua pertimbangan penting yang berkaitan dengan hal ini adalah efek samping mode seperti autoincrement dan autodecrement dan tingkat dimana mode pengalamatan comple9 menyebabkan pipeline menjadi stall. =aktor penting lain adalah apakah suatu mode akan lebih dipilih oleh suatu kompiler. 0ntuk membandingkan berbagai pendekatan, kita mengasumsikan model sederhana untuk mengakses operand di dalam memori. 3nstruksi Eoad F(G:#,G& memerlukan lima cycle untuk menyelesaikan eksekusi, seperti yang diindikasikan pada $ambar %.D. )kan tetapi, instruksi Eoad (G:#,G& dapat diatur untuk sesuai dengan four*stage pipeline karena tidak diperlukan perhitungan alamat. )kses ke memori dapat berlangsung pada stage 1. /ode pengalamatan yang lebih kompleks mungkin memerlukan beberapa akses ke memori untuk mencapai operand yang dimaksud. /isalnya, instruksi Eoad (F(G:##,G& mungkin dieksekusi seperti pada $ambar %.:6a, dengan mengasumsikan bahwa inde9 offset, F, dinyatakan dalam word instruksi. Setelah menghitung alamat pada cycle 2, prosesor perlu mengakses memori dua kali*pertama untuk membaca lokasi F HIG:J pada clock cycle 5 dan kemudian untuk membaca lokasi IF HIG:JJ pada cycle D. Jika G& adalah source operand pada instruksi berikutnya, maka instruksi tersebut akan di*stall selama tiga cycle, yang dapat direduksi hingga dua cycle dengan operand forwarding, seperti yang ditunjukkan.

0ntuk menerapkan operasi Eoad yang sama hanya menggunakan mode pengalamatan sederhana memerlukan beberapa instruksi. /isalnya, pada komputer yang memungkinkan tiga alamat operand, kita dapat menggunakan )dd TF, G:, G& Eoad (G&#,G& Eoad (G&#,G& 3nstruksi )dd menjalankankan operasi G& H* F HIG:J. <ua instruksi Eoad tersebut mengambil alamat dan kemudian operand dari memori. Gangkaian instruksi ini memerlukan sejur *lah clock cycle yang tepat sama dengan aslinya, instruksi Eoad tunggal, seperti pada $amy %.:6b. 'ontoh ini mengindikasikan bahwa, dalam prosesor pipelined, mode pengalamatan kornpleks yang melibatkan beberapa akses ke memori tidak selalu menghasilkan eksekusi yaE( lebih cepat. Keuntungan utama mode tersebut adalah mengurangi jumlah instruksi yang dipA*lukan untuk melakukan togas tertentu dan dengan demikian mengurangi ruang program yaAA diperlukan dalam memori utama. Kerugian utamanya adalah waktu eksekusinya yang laT*.t menyebabkan pipeline stall, sehingga mengurangi keefektifannya. /ode tersebut memerluk hardware yang lebih kompleks untuk men*decode dan mengeksekusinya. Juga, tidak cots untuk bekerja dengan kompiler. Set instruksi prosesor modern didesain untuk memanfaatkan semaksimal mungkin ha ware pipelined. Karena mode pengalamatan kompleks tidak cocok untuk eksekusi pipelines aka harus dihindari. /ode pengalamatan yang digunakan dalam prosesor modern serg memiliki fitur berikut

)kses ke operand tidak memerlukan lebih dari satu akses ke memori. ,anya instruksi load dan store yang mengakses memory operand. /ode pengalamatan yang digunakan tidak memiliki efek samping. Tiga mode pengalamatan dasar yang memiliki fitur tersebut adalah register, register rect, dan inde9. <ua yang pertama tidak memerlukan perhitungan alamat. Pada mode i alamat tersebut dapat dihitung dalam satu cycle, baik nilai inde9 dinyatakan dalam inset atau dalam register. /emori diakses pada cycle berikut. Tidak satupun dari mode ini mers,*!efek samping, dengan kemungkinan satu pengecualian. 8eberapa arsitekstur, misalnya. memungkinkan alamat dihitung dalam mode inde9 untuk dituliskan kembali ke inde9 regA... 3ni adalah efek samping yang tidak akan diijinkan sesuai petunjuk diatas. Perhatikanlah bahwa pengalamatan relati;e dapat

digunakan> ini adalah kasus khusus pengalamatan ind dimana program counter digunakan sebagai inde9 register. Tiga fitur yang baru dirinci di atas pada awalnya dinyatakan sebagai bagian dari ko prosesor G3S'. )rsitektur prosesor SP)G', yang sesuai dengan petunjuk tersebut, ditampi+ pada 8agian %.@.

8.6 OPERA&I &*PER&)ALAR Pipelining memungkinkan eksekusi instruksi secara konkuren. 8eberapa instruksi terdapat dalam pipeline pada waktu yang sama, tetapi berada dalam stage eksekusi yang berbeda. Pada saat satu instruksi melakukan operasi )E0, instruksi lain di*decode dan yang lain lagi diambil dari memori. 3nstruksi memasuki pipeline dalam urutan program yang ketat. Tanpa haAard, satu instruksi memasuki pipeline dan satu instruksi menyelesaikan ekskeusi pada tiap clock cycle. 3ni berarti throughput maksimum prosesor pipelined adalah satu instruksi per clock cycle. Pendekatan yang lebih agresif adalah dengan mernperlengkapi prosesor dengan banyak unit pengolahan untuk menangani beberapa instruksi secara paralel pada tiap stage pengolahan. <engan pengaturan ini, beberapa instruksi memulai eksekusi pada clock cycle yang sama, dan prosesor disebut menggunakan multiple*issue. Prosesor tersebut mampu mencapai throughput eksekusi instruksi lebih dari satu instruksi per cycle. <ikenal sebagai prosesor superskalar. 8anyak prosesor performa*tinggi menggunakan pendekatan ini. Kita memperkenalkan ide Cueue instruksi pada 8agian %.2. Kita menekankan agar Cueue instruksi tetap terisi, maka prosesor harus dapat mengambil lebih dari satu instruksi pada satu waktu dari cache. 0ntuk operasi superskalar, pengaturan ini sangat penting. ?perasi multipleissue memerlukan jalur yang lebih lebar ke cache dan unit multiple e9ecution. 0nit eksekusi terpisah disediakan untuk instruksi integer dan floating*point. $ambar %.:B menunjukkan contoh prosesor dengan dua unit eksekusi, sate untuk integer dan satu untuk operasi floating*point. 0nit Pengambilan instruksi mampu membaca dua instruksi pada satu waktu dan menyimpannya dalam Cueue instruksi. Pada tiap clock cycle, unit <ispatch mengambil dan me*decode sampai dengan dua instruksi dari bagian depan Cueue. Jika terdapat satu instruksi integer, satu instruksi floating*point, dan tidak ada haAard, maka kedua instruksi tersebut dikirim pada clock cycle yang sama.

Pada prosesor superskalar, efek yang merusak pada performa dari berbagai haAard menjadi semakin nyata. Kompiler dapat menghindari banyak haAard melalui pemilihan yang bijaksana dan penyusunan instruksi. /isalnya, untuk prosesor pada $ambar %.:B, kompiler harus berusaha untuk meng*interlea;e instruksi floating*point dan integer. ,al ini akan meng*enable unit dispatch untuk mempertahankan agar unit integer dan floating*point sibuk sepanjang waktu. Secara umum, performa tinggi dicapai jika kompiler dapat mengatur instruksi program untuk memanfaatkan secara maksimum unit hardware yang tersedia.

Pipeline timing ditunjukkan pada $ambar %.&R. !8ayangan biru tersebut mengindik operasi dalam unit floating*point. 0nit floating* point memerlukan tiga clock cycle untuk lesaikan operasi floating* point yang ditetapkan dalam 33. 0nit integer menyelesaikan eksei . dalam satu clock cycle. Kita juga telah mengasumsikan bahwa unit floating*point diatur Ue internal sebagai tiga*stage pipeline. Jadi, masih dapat menerima instruksi barn pada tiap eli cycle. Karenanya, instruksi : 2 dan :5 memasuki unit dispatch pada cycle 2, dan keduanya dikirms pada cycle 5. 0nit integer dapat menerima instruksi baru karena isntruksi 3 A telah mend 7rite stage. 3nstruksi 3, masih dalam fase eksekusi, tetapi telah pindah ke stage kedua p pipeline internal dalam unit floating*point. ?leh karena itu, instruksi : 2 dapat memasuki std pertama. <engan mengasumsikan tidak ada haAard yang ditemui, maka instruksi menVel saikan eksekusi seperti yang ditunjukkan. 8.6.1 E)&E)*&I O*T:OF:ORDER Pada $ambar %.&R, instruksi dikirim pada urutan yang sama seperti dalam program. )kaE tetapi eksekusinya diselesaikan tidak sesuai dengan urutan tersebut. )pakah hal ini menimbulkan persoalanW Kita telah membahas persoalan yang muncul dari ketergantungan antar instruksi. /isalnya, jika instruksi 34 tergantung pada hasil dari 3p maka eksekusi 34 akan ditunda. Sepanjang ketergantungan tersebut ditangani dengan tepat, maka tidak ada alasan untuk menunda eksekusi suatu instruksi. )kan tetapi, komplikasi baru muncul pada saat kita mempertimbangkan kemungkinan suatu instruksi yang menyebabkan e9ception. 19ception dapat disebabkan oleh error bus selama pengambilan operand atau operasi ilegal, misalnya usaha

membagi dengan nol. ,asil 34 ditulis kembali ke dalam register file pada cycle 5. Jika instruksi 3, menyebabkan e9ception, maka eksekusi program berada dalam keadaan tidak konsisten (inconsistent state#. Program counter menunjuk ke instruksi dimana terjadi e9ception. )kan tetapi, satu atau lebih

instruksi yang berurutan telah dieksekusi hingga selesai. Jika situasi tersebut diijinkan, maka prosesor disebut memiliki imprecise e9ception. 0ntuk menjamin keadaan konsisten (consistent state# pada saat terjadi e9ception, maka hash eksekusi instruksi harus dituliskan ke dalam lokasi destinasi sesuai dengan urutan program. 3ni berarti kita harus menunda langkah 7& pada $ambar %.&R hingga cycle 6. Selanjutnya, unit eksekusi integer harus menyimpan hash instruksi :&B dan karenanya tidak dapat menerima instruksi : 5 hingga cycle 6, seperti pada $ambar %.&:a. Jika terjadi e9ception dalam suatu instruksi, maka semua instruksi berikutnya yang telah dieksekusi sebagian dibuang. 3ni disebut precise e9ception.

Eebih mudah untuk menyediakan precise e9ception dalam hal interrupt eksternal. Pada saat interrupt eksternal diterima, unit <ispatch berhenti membaca instruksi baru dari Cueue instruksi, dan instruksi yang berada dalam Cueue dibuang. Semua prosesor yang eksekusinya ditunda dilanjutkan hingga selesai. Pada titik ini, prosesor tersebut dan semua registernya berada dalam keadaan konsisten, dan pengolahan interrupt dapat dimulai. 8.6.2 PEN;ELE&AIAN E)&E)*&I <engan menggunakan eksekusi out*of*order, unit eksekusi bebas untuk mengeksekusi instruksi lain dengan segera. Pada saat yang sama, instruksi harus diselesaikan sesuai dengan urutan program untuk memungkinkan precise e9ception. Persyaratan yang tampaknya bertentangan ini dapat diselesaikan jika eksekusi dapat dilakukan seperti pada $ambar %.&R, tetapi hasilnya ditulis ke register temporer. 3si register tersebut selanjutnya ditransfer ke register permanen dalam urutan program yang tepat. Pendekatan ini diilustrasikan pada $ambar %.&:b. Eangkah T7 adalah penulisan ke register temporer. Eangkah 7 adalah langkah terakhir dimana isi register temporer ditransfer ke dalam register permanen yang sesuai. Eangkah ini sering disebut langkah komitmen (commitment# karena efek instruksi tidak dapat dibalik setelah titik tersebut. Jika suatu instruksi menyebabkan e9ception, maka hasil tiap instruksi selanjutnya yang telah dieksekusi akan tetap berada dalam register temporer dan dapat dengan aman dibuang. Gegister temporer mengasumsikan peranan register permanen yang datanya disimpan dan diberi nama sama. /isalnya, jika register destinasi 3 4 adalah GD, maka register temporer yang digunakan dalam langkah T7& diperlakukan sebagai GD selama clock cycle 6 dan @. 3sinya akan di*forward ke tiap instruksi berikutnya yang mengacu ke GD selama periode tersebut. Karena fitur ini, maka teknik ini disebut register renaming. Perhatikanlah bahwa register temporer hanya digunakan untuk

instruksi setelah 34 dalarn urutan program. Jika suatu instruksi yang mendahului 3l perlu membaca GD pada cycle 6 atau @, maka instruksi tersebut akan mengakses register aktual GD, yang masih berisi data yang belum dimodifikasi oleh instruksi 3&. Pada scat eksekusi out*of*order diijinkan, diperlukan suatu unit kontrol khusus untuk menjamin komitmen in*order. 3ni disebut unit komitmen. 0nit tersebut menggunakan Cueue yang disebut reorder buffer untuk menentukan instruksi mana yang sebaiknya ditetapkan berikutnya. 3nstruksi dimasukkan ke dalam Cueue sesuai dengan urutan program pada saat instruksi tersebut dikirim untuk eksekusi. Pada saat instruksi mencapai puncak Cueue dan eksekusi instruksi tersebut telah selesai maka basil yang tepat ditransfer dari register temporer ke register permanen dan instruksi tersebut dihapus dari Cueue. Semua resource yang ditetapkan untuk instruksi tersebut, termasuk register temporer, dibebaskan. 3nstruksi itu dinyatakan telah diberhentikan (retired# pada titik ini. Karena suatu instruksi hanya diberhentikan pada saat berada pada puncak Cueue, maka semua instruksi yang dikirim sebelumnya juga telah diberhentikan. Karenanya, instruksi dapat menyelesaikan eksekusi out of order, tetapi instruksi tersebut diber* hentikan sesuai urutan program.

You might also like