Dalam mengimplementasi
pipelining, terdapat 3 kondisi yang menyebabkan pipelining kehilangan sebagian
total kinerja yang bisa diraih. 3 kondisi ini dikenal dengan hazard.
1.
Structural
Hazard
Structural hazard
terjadi karena adanya konflik dalam penggunaan resource oleh masing-masing
instruksi yang sedang berada dalam pipeline.
Pipelining pada
dasarnya memungkinkan beberapa instruksi dikerjakan dalam waktu yang bersamaan.
Ketika masing-masing instruksi tersebut dieksekusi, mesin harus mampu memenuhi
resource yang dibutuhkan. Ada kalanya mesin tidak mampu melakukan hal tersebut,
yang menyebabkan sebuah resource mengalami konflik dalam penggunaannya oleh
instruksi-instruksi yang kebetulan akan mengakses resource yang sama.
Kondisi umum yang
dapat menyebabkan structural hazard adalah sebagai berikut :
- • Ada functional unit yang belum siap untuk digunakan. Functional unit adalah komponen yang dimiliki processor yang mampu melakukan komputasi sesuai dengan perintah yang dibawa sebuah instruksi. Ada kalanya functional unit yang dimiliki processor belum siap untuk di-pipeline. Hal ini berakibat instruksi yang sudah di-pipeline harus di-stall untuk beberapa clock cycle sampai functional unit siap untuk di-pipeline
- • Resource belum seluruhnya diduplikasi. Duplikasi resource memungkinkan resource yang sama diakses oleh beberapa instruksi yang berbeda. Contoh umum resource yang dapat diduplikasi adalah memory.
Cara mengatasi
structural hazard adalah dengan melakukan stall terhadap pipeline selama 1
clock atau lebih sesuai dengan prediksi control logic. Stall selama 1 cycle
atau lebih ini menyebabkan adanya delay terhadap salah satu instruksi yang
terlibat, yang pada akhirnya menghilangkan terjadinya konflik pada resource
yang akan diakses.
2.
Data
Hazard
Data hazard disebabkan
oleh terjadinya perbedaan urutan eksekusi insruksi baca dan tulis dibanding
sebelum instruksi tersebut belum dipecah secara paralel. Urutan instruksi
menjadi penting karena ada kalanya sebuah instruksi membutuhkan input dari
hasil operasi instruksi sebelumnya.
Data hazard dibagi 3,
yaitu :
- • Read after Write (true data dependency)
Operasi baca dilakukan setelah operasi tulis selesai, di mana nilai
hasil pembacaan dibutuhkan oleh operasi tulis tersebut.
- • Write after Write (Output dependency)
Operasi tulis dilakukan tepat setelah sebuah operasi tulis lainnya
dilakukan. Dapat terjadi pada pipeline yang membolehkan operasi tulis dilakukan
di lebih dari 1 stage. Pada kasus ini sebuah register digunakan oleh dua
operasi tulis.
- • Write after Read (Anti data dependency)
Operasi tulis dilakukan setelah operasi baca, di mana operasi baca
seharusnya membaca nilai yang dihasilkan oleh operasi tulis tersebut.
Secara umum,
penanganan ketika akan terjadi sebuah data hazard (terutama true data
dependency) adalah dengan melakukan stall terhadap instruksi yang membutuhkan
nilai dari instruksi lainnya. Hal ini menyebabkan adanya penalty terhadap
kinerja dari pipeline tersebut. Untuk mengurangi penalty yang harus dihadapi,
maka sebuah teknik yang dikenal dengan forwarding diimplementasi.
Forwarding
memungkinkan nilai hasil instruksi yang dihasilkan pada tahapan lanjut pipeline
langsung disimpan pada memory tanpa harus dipipeline terlebih dahulu. Ketika
ada sebuah instruksi yang membutuhkan nilai yang dihasilkan oleh instruksi di
tahapan lanjut pipeline, instruksi tersebut memiliki 2 pilihan input : nilai
yang dihasilkan oleh instruksi sebelumnya secara normal, atau nilai yang
di-forward oleh instruksi di tahapan pipeline setelah instruksi tersebut.
3.
Control
Hazard
Hazard yang terjadi
karena adanya instruksi yang dieksekusi sebelum seluruh branch pada jalur
eksekusi selesai dievaluasi. Control hazard dapat menyebabkan terjadinya
perubahan nilai PC (Program Counter).
Perubahan ini mengharuskan adanya program
baru yang harus dieksekusi, menyebabkan seluruh instruksi yang sudah masuk
pipeline menjadi tidak berguna untuk dieksekusi.
Cara mengatasi control
hazard adalah dengan melakukan branch handling dan branch prediction.
No comments:
Post a Comment