HAZARD IN PIPELINE
Pipeline adalah suatu cara yang digunakan untuk melakukan sejumlah kerja secara bersama tetapi dalam tahap yang berbeda yang dialirkan secara kontinu pada unit pemrosesor. Dengan cara ini, maka unit pemrosesan selalu bekerja.
Masalah-masalah pada Pipeline :
Dengan adanya persyaratan bahwa setiap instuksi yang
berdekatan harus tidak saling bergantung, maka ada kemungkinan terjadinya
situasi dimana pipeline gagal dilaksanakan (instuksi berikutnya tidak bisa
dilaksanakan). Situasi ini disebut Hazards. Hazards mengurangi performansi dari
CPU dimana percepatan ideal tidak dapat dicapai. Ada 3 kelompok Hazards :
1. Structural Hazards
muncul dari konflik resource sistem yaitu ketika hardware tidak dapat
mensuport
semua kemungkinan kombinasi pelaksanaan instruksi
2. Data Hazards muncul ketika data untuk suatu instruksi
tergantung pada hasil instruksi sebelumnya
3. Control Hazards muncul pada pelaksanaan instruksi yang
mengubah PC (contoh : branch)
Adanya Hazards menyebabkan pipeline terhambat (stalled).
Tidak ada instruksi baru yang dijemput sampai hambatan itu selesai. Ini berarti
instruksi-instruksi selanjutnya akan ditunda pula penjemputannya
- Structural Hazards
Ketika suatu mesin di-pipeline, eksekusi dari instruksi yang
bertumpukan tersebut membutuhkan pemasangan pipeline pada unit-unit fungsional
dan duplikasi resource untuk memperbolehkan semua kemungkinan kombinasi
pelaksanaan instruksi di pipeline. Jika beberapa kombinasi dari instruksi tidak
dapat diakomodasikan karena konflik resource, CPU tersebut dikatakan memliki
structural hazards.
Sebagai contoh, sebuah mesin yang memiliki sistem memori
dengan hanya 1 port (1 set address bus dan 1 set data bus) untuk membaca dan
menulis, akan menghasilkan stall setiap kali tahapan EX dan IF terjadi
bersamaan dimana suatu instruksi pada tahap EX ingin menulis memori dan pada
saat yang bersamaan instruksi lainnya ada pada tahap IF yang berarti pembacaan
memori.
Pada t3 terjadi dua buah akses ke memori. Yang pertama untuk
mengirim isi register AX ke stack dan yg kedua untuk menjemput instruksi ketiga
(ADD). Jika memori tidak mendukung 2 pembacaan sekaligus seperti ini, maka akan
terjadi Structural Hazard dimana penjemputan instruksi ketiga (ADD) akan
ditunda sampai detik keempat.
Untuk menghilangkan terjadinya Structural Hazard, maka
setiap resource harus diduplikasi sebanyak jumlah stage dalam pipeline (jumlah tahapan pengerjaan instruksi). Seperti misalnya instruksi kedua dan
ketiga dieksekusi pada saat yg bersamaan, maka ini berarti komponen-komponen yg
terlibat dalam eksekusi harus diduplikasi. Salah satu untuk mengeksekusi
instruksi pertama, dan satunya lagi untuk mengeksekusi instruksi kedua.
- Data Hazards
Data hazards terjadi ketika pipeline merubah urutan
baca/tulis ke operand sehingga urutannya menjadi berbeda dengan urutan yang
dilihat dengan menjalankan instruksiinstruksi tersebut pada mesin yang tidak
di-pipeline. Data Hazards dapat diklasifikasikan menjadi 3 tipe dilihat dari
urutan operasi baca-tulis oleh instruksi yang berdekatan. Jika ada 2 instruksi
X dan Y dimana instruksi X dikerjakan lebih dahulu dari instruksi Y :
RAW (Read After Write) Y mencoba untuk membaca suatu cell
memori sebelum X menulisnya sehingga Y mendapatkan harga lama dari memori
tersebut.
Jika ketiga instruksi tersebut dikerjakan pada uP tanpa
pipeline, maka data yang di-Push ke stack adalah FFFF. Namun ternyata jika
dikerjakan pada uP dengan pipeline, yang di-Push ke stack adalah 0000. Hal ini
disebabkan karena register AX akan diisi harga 0000 oleh instruksi pertama pada
t5, dan kemudian akan ditumpuk oleh instruksi kedua dengan data FFFF pada t6.
Instruksi ketiga akan membaca AX pada t5 sehingga yang dibaca adalah 0000 bukan
FFFF. RAW adalah type yang paling sering terjadi diantara tipe yg lain.
WAW (Write After Write) : Y mencoba untuk menulis suatu cell
memori sebelum ditulis oleh X. Urutan penulisan menjadi terbalik sehingga isi
dari memori adalah hasil proses instruksi X padahal yang diinginkan adalah
hasil proses dari instruksi Y (tertumpuk oleh hasil instruksi X)
Jika kedua instruksi tersebut dikerjakan pada uP tanpa
pipeline, maka data yang ada di AX adalah dari stack. Namun ternyata jika
dikerjakan pada uP dengan pipeline, data yang ada di AX adalah 0000. Hal ini
disebabkan karena register AX akan diisi data dari stack oleh instruksi kedua
pada t4 sedangkan instruksi pertama akan menumpuknya dengan data 0000 karena
instruksi kedua baru selesai pada t5.
WAR (Write After Read) : Y mencoba untuk menulis suatu cell
memori sebelum dibaca oleh X.
Jika ketiga instruksi tersebut dikerjakan pada uP tanpa
pipeline, maka data yang ada di BX adalah FFFF. Namun ternyata jika dikerjakan
pada uP dengan pipeline, data yang ada di BX berasal dari stack. Hal ini
disebabkan karena register AX akan diisi data dari stack oleh instruksi ketiga
pada t5, dan data ini akan menumpuk data FFFF yang diberikan oleh instruksi
pertama.