خطایابی در خط تولید: Hazardها کجای کار دست Processor رو می‌دن؟ ⚠️

تو پست قبل دیدیم که Pipeline چقدر می‌تونه سرعت پردازنده رو بالا ببره. اما واقعیت اینه که کدها همیشه مستقل نیستن. وقتی دستورات به هم وابسته می‌شن، خط تولید گیر می‌کنه و اینجا پای Hazardها (خطرات) به میون میاد. اگه اینها رو نشناسیم، پردازنده‌مون به جای کار، داره stall می‌زنه!

Hazard یعنی چی؟

به زبان ساده، Hazard یعنی یه شرایطی پیش بیاد که دستور بعدی نتونه تو کلاک بعدی وارد پایپ‌لاین بشه و پردازنده مجبور بشه یه چند کلاک صبر کنه (به این حالت Bubble یا Stall می‌گن). سه نوع Hazard اصلی داریم:

  • Structural Hazard: تداخل سخت‌افزاری. مثلاً دو دستور مختلف تو یه کلاک بخوان از یه مموری بخونن یا تو یه ALU بنویسن. تو پردازنده‌های مدرن با اضافه کردن منابع (مثل جدا کردن Instruction Cache و Data Cache) این مشکل رو حل می‌کنن.
  • Data Hazard: وابستگی داده‌ای. این بیشتر از بقیه پیش میاد. دستور فعلی به نتیجه دستور قبلی نیاز داره، ولی اون هنوز تو رجیستر ننوشته شده!
  • Control Hazard: وابستگی کنترلی. وقتی به یه دستور شرطی (Branch) می‌رسیم، پردازنده نمی‌دونه دستور بعدی چیه تا Fetch کنه. تا مسیر مشخص بشه، پایپ‌لاین باید متوقف بشه.

مثال عینی: Data Hazard

فرض کن این دو تا دستور پشت سر هم داریم اجرا می‌شه:

ADD R1, R2, R3   // R1 = R2 + R3 (Nresult dar phase EX hesab mishe)
SUB R4, R1, R5   // R4 = R1 - R5 (R1 ro mikhad, vali hanuz dar phase WB naneveshtim!)

اینجا دستور SUB تو مرحله ID (خوندن رجیسترها) می‌خواد R1 رو بخونه، ولی دستور ADD هنوز به مرحله WB (نوشتن تو رجیستر) نرسیده! اگه چیزی برایش نکنیم، SUB یه دیتای قدیمی و اشتباه رو می‌خونه. این می‌شه Read-After-Write (RAW) Hazard.

تنها راه حل اینه که پردازنده دستور SUB رو نگه داره (Stall) تا وقتی ADD کارش تموم شه. ولی این کار سرعت رو به شدت میاره پایین! performance > /dev/null

نکات کلیدی

  • Structural: کمبود سخت‌افزار. حلش: اضافه کردن منابع (مثل پورت‌های بیشتر رجیستر فایل).
  • Data: نیاز به دیتای در حال محاسبه. حلش فعلی: تزریق Stall (که بدترین حالته).
  • Control: ابهام در مسیر اجرای برنامه تو Branchها. حلش: حدس زدن مسیر (موضوع پستای بعدیه).

پس Hazardها قاتل بزرگ Throughput هستن. اما مهندس‌ها فقط دست به سینه نگاه نکردن! راه‌حل‌های هوشمندانه‌ای مثل Forwarding و Stalling رو پیدا کردن. تو پست بعدی می‌گیم چطور دیتای در حال محاسبه رو مستقیم به دست دستور بعدی بدیم تا کلاک هدر نره! 💡

فکر می‌کنید چطور می‌تونیم Data Hazard رو بدون توقف پایپ‌لاین حل کنیم؟

$ echo "happy hacking" | jtag --program