next up previous contents index
Next: Branch Hazard Up: การเพิ่มประสิทธิภาพโดยเทคนิคไพพ์ลายน์ Previous: การตรวจจับ Dependence   Contents   Index

การเกิด Data Hazards และ Stalls

ในหลายกรณีเช่นการทำ load หรือ branch การ Forward ไม่สามารถที่จะแก้ไขปัญหา Hazard ได้ในรูป 6.41 แสดงลักษณะการเกิดปัญหาดังกล่าว ที่ข้อมูลถูกอ่านจากหน่วยความจำในวงรอบที่ 4 ในขณะที่ ALU กำลังทำการคำนวณสำหรับคำสั่งที่ตามมา เราจำเป็นต้อง Stall ไพพ์ลายน์เพื่อให้โปรแกรมทำงานได้ถูกต้อง

Figure 6.32: ลักษณะการเกิดปัญหาที่การ Forward ไม่สามารถที่จะแก้ไขปัญหา Hazard ได้
\includegraphics[width=6.5in]{fig/Chapter_6/Figure_6.34.eps}

ดังนั้นนอกเหนือจากส่วนควบคุมการ Forward เราจำเป็นต้องมีส่วน Hazard Detection ที่จะทำการในส่วนของสเตท ID และแทรกการ Stall หลังการ load ที่มี Dependency การตรวจสอบมีเงื่อนไขดังนี้

   if (ID/EX.MemRead and
      ((ID/EX.RegisterRt = IF/ID.RegisterRs) or
        (ID/EX.RegisterRt = IF/ID.RegisterRt)))
         stall the pipeline

ในบรรทัดแรกเป็นการตรวจสอบ การ load ค่าจากหน่วยความจำที่สเตท EX ว่ามีค่ารีจีสเตอร์ Destination ตรงกับค่า Rs หรือ Rt ในสเตท ID/EX ถ้าเป็นจริงจะทำการ Stall หนึ่งวงรอบการทำงาน และจากนั้นให้ส่วนการทำงาน Forward ดำเนินการต่อไป

เมื่อทำการ Stall ในสเตท ID เราจะต้องทำการหยุดสเตท IF ด้วย มิฉะนั้นคำสั่งที่กำลัง Fetch อยู่ในสเตท IF จะหายไป ซึ่งสามารถทำได้โดยให้ค่า PC มีค่าเดิม ซึ่งการทำงานใน IF ก็จะอ่านค่าเดิมขึ้นมา ซึ่งในการหยุดดังกล่าว ชุดควบคุมจะใส่คำสั่งที่ไม่มีการประมวลผลใดๆ ที่เรียกว่า ``nop'' รูป 6.33 แสดงการทำงานที่ Stall ไพพ์ลายน์ คำสั่ง and จะถูกชะลอไว้หนึ่งวงรอบการทำงาน

Figure 6.33: การ Stall ไพพ์ลายน์
\includegraphics[width=6.5in]{fig/Chapter_6/Figure_6.35.eps}

Figure 6.34: ชุดควบคุมโปรเซสเซอร์แบบไพพ์ลายน์ที่มีส่วน Forward และ Hazard Detection
\includegraphics[width=6.5in]{fig/Chapter_6/Figure_6.36.eps}


next up previous contents index
Next: Branch Hazard Up: การเพิ่มประสิทธิภาพโดยเทคนิคไพพ์ลายน์ Previous: การตรวจจับ Dependence   Contents   Index
Vara Varavithya 2006-11-06