مخاطره (معماری رایانه)

پیش‌زمینه

دستورالعمل‌ها در یک پردازنده با خط لوله در چند مرحله اجرا می‌شوند، بنابراین در هر زمانی چندین دستورالعمل در حال پردازش شدن در مراحل مختلف خط لوله می‌باشند، مانند واکشی و اجرا. چندین میکرو معماری خط لولهٔ دستورالعمل وجود دارد و ممکن است دستوالعمل‌ها خارج از نوبت اجرا شوند. مخاطره زمانی رخ می‌دهد که دو یا تعداد بیشتری از این برخوردهای دستورالعمل‌ها بطور هم‌زمان رخ دهد.

خواندن بعد از نوشتن R after w

مخاطره خواندن بعد از نوشتن اشاره به موقعیتی می‌کند که یک دستورالعمل به نتیجه‌ای اشاره دارد که یا هنوز محاسبه نشده یا هنوز دریافت نشده. این مشکل رخ می‌دهد چون یک دستورالعمل اجرا شده بعد از دستورالعمل قبلی در حالی که دستورالعمل قبلی بطور کامل از طریق خط لوله پردازش نشده.

مثال

i1. R2 <- R1 + R3

i2. R4 <- R2 + R3
دستورالعمل اول مقداری را محاسبه می‌کند که قرار است در ثبات ۲ ذخیره شود، و دومی قرار است این مقدار را برای محاسبه نتیجه‌ای که برای ذخیره در ثبات ۴ است استفاده کند. اگرچه، در یک خط لوله وقتی ما عملوندها را برای دومین عملیات فچ می‌کنیم نتایج از اولی هنوز ذخیره نشده‌اند به همین دلیل وابستگی داده‌ای داریم.
در اینصورت می‌گوییم وابستگی داده‌ای بین دستورالعمل ۲ موجود است به این خاطر که به تکمیل شدن دستورالعمل ۱ وابسته است.

نوشتن بعد از خواندن

مخاطره نوشتن بعد از خواندن مشکلی است که به خاطر اجرای هم‌زمان رخ می‌دهد.

مثال

i1. R4 <- R1 + R5

i2. R5 <- R1 + R2
اگر ما در شرایطی قرار داریم که ممکن است که دستورالعمل ۲ قبل از دستورالعمل ۱ کامل شود باید مطمئن شویم که نتیجهٔ ثبات ۵ را زخیره نکنیم قبل از آنکه دستورالعمل ۱ شانسی برای فچ کردن عملوندها داشته باشد.

نوشتن بعد از نوشتن

مخاطره نوشتن بعد از نوشتن ممکن است در محیطی رخ دهد که شرایط اجرای هم‌زمان را دارد.

مثال

i1. R2 <- R4 + R7

i2. R2 <- R1 + R3
باید رایت بک دستورالعمل ۲ را تا زمان اجرای دستورالعمل ۱ به تأخیر بیندازیم.
ویرایش شده توسط A.A

مخاطره‌های ساختاری

مخاطره ساختاری زمانی رخ می‌دهد که قسمتی از سخت‌افزار پردازنده مورد نیاز دو یا بیشتر از دستورالعمل‌ها در یک زمان باشد.
یک مثال استاندارد یک واحد تک حافظه است زمانی که مورد دسترسی هم‌زمان هم در مرحلهٔ فچ کردن جایی که یک دستورالعمل بازیابی می‌شود از حافظه و مرحلهٔ حافظه جایی که داده نوشته شده ویا خوانده شده از حافظه است.
اغلب این مشکلات توسط جدا کردن مؤلفه به واحدهای متعامد (اورتوگنال) یا تأخیر در خط لوله حل می‌شوند.

مخاطره کنترلی

مخاطره کنترل‌ها به همراه برنچ‌ها (Branch) رخ می‌دهند. روی بسیاری میکرو معماری دستورالعمل خط لوله، پردازنده خروجی برنچ را نمی‌داند زمانی که نیاز به وارد کردن دستورالعمل جدید به خط لوله دارد.

تأخیر خط لوله

تأخیر خط لوله یا وقفهٔ خط لوله روشی برای جلوگیری از انواع مختلف مخاطره می‌باشد. همان‌طور که دستورالعملها فچ می‌شوند.
کنترل منطق تشخیص می‌دهد که آیا مخاطره رخ می‌دهد یا خیر. اگر تشخیص دهد ان.او. پی‌ها را وارد خط لوله می‌کند. بنابراین دستورالعمل بعدی (که باعث مخاطره می‌شود) اجرا شده و قبلی زمان کافی برای تکمیل خود و جلوگیری از مخاطره را دارد.
اگر تعداد ان.او. پی‌ها برابر تعداد مراحل خط لوله باشند، پردازنده تمام دستورالعمل‌ها را پاک‌سازی کرده و می‌تواند بدون وجود مخاطره پیشروی کند. به این عمل فلاش کردن خط لوله گویند. تمام اشکال تأخیر، تأخیری قبل از ادامهٔ کار پردازنده دارند.

مثال

برای مثال می‌خواهیم مقدار ۳ را به ثبات ۱ دهیم و سپس ۷را به ثبات ۱ دهیم و نتیجه را در ثبات ۲ زخیره کنیم:

Instruction 0: Register 1 = ۶

Instruction 1: Register 1 = ۳

Instruction 2: Register 2 = Register 1 + 7 = ۱۰
در این اجرا ثبات ۲ باید مقدار ۱۰ را نگهداری کند. اگرچه، اگر دستورالعمل ۱ کاملاً قبل از اجرای دستورالعمل ۲ از خط لوله خارج نشود بدین معنیست که ثبات ۱ مقدار ۳ را ندارد زمانی که دستورالعمل ۲ اضافه کردن خود را انجام می‌دهد. در این مورد دستورالعمل ۲٬۷را به مقدار قدیمی ثبات ۱ اضافه می‌کند به همین دلیل ثبات ۲ ،۱۳را در خود دارد:

Instruction 0: Register 1 = ۶

Instruction 2: Register 2 = Register 1 + 7 = ۱۳

Instruction 1: Register 1 = ۳
این خطا زمانی رخ می‌دهد به این دلیل که دستورالعمل ۲ ثبات ۱ را می‌خواند قبل از اینکه دستورالعمل ۱ نتیجهٔ نوشتن عملیات را در ثبات ۱ ذخیره کند. پس زمانی که دستورالعمل ۲ در حال خواندن محتویات ثبات ۱ است، ثبات ۱ هنوز ۶ را در خود دارد به جای ۳.
پیشروی کمک به صحیح کردن چنین خطاهای می‌کند توسط وابستگی به این دلیل که خروجی دستورالعمل ۱ می‌تواند به عنوان دستورالعمل‌های بعدی استفاده شود قبل ازینکه مقدار ۳ در ثبات ۱ ذخیره شود.
این به این معنیست که ما منتظر ذخیرهٔ خروجی دستورالعمل ۱ در ثبات ۱ نمی‌شویم، قبل از آنکه آن خروجی را قابل دستیابی دستورالعمل‌های بعدی کنیم. (ذخیره به صورت بلادرنگ انجام گرفت و نه به صورت خط لوله‌ای)
هنگام استفاده از پیشروی مرحلهٔ دیکد و اجرای خط لوله دو ورودی دارد:۱-مقدار خوانده شده از ثبات ۱ و مقدار جدید ثبات ۱ که از مرحلهٔ بعد فرستاده شده‌است یا از اجرای دستورالعمل /دسترسی به حافظه فرستاده شده.