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

هازارد یا مخاطره مشکلات مرتبط با خط لوله‌های دستورالعمل در ریزمعماری واحد پردازنده مرکزی است و وقتی رخ می‌دهد که دستورالعمل بعدی در سیکل کلاک بعدی نمی‌تواند اجرا شود، و ممکن است که باعث محاسبات اشتباه شود. به‌طور معمول سه نوع مخاطره وجود دارد:
مخاطره داده
مخاطره ساختاری
مخاطره کنترل
چندین روش برای مقابله با مخاطره که شامل تاخیر در خط لوله، جلو فرستادن ثبات و در شرایط اجرای خارج از نوبت روش‌های اسکور بردینگ و الگوریتم توماسولو می‌باشد، موجود است.
پیش‌زمینه
دستورالعمل‌ها در یک پردازنده با خط لوله در چند مرحله اجرا می‌شوند، بنابراین در هر زمانی چندین دستورالعمل در حال پردازش شدن در مراحل مختلف خط لوله می‌باشند، مانند واکشی و اجرا. چندین میکرو معماری خط لوله دستورالعمل وجود دارد و ممکن است دستوالعمل‌ها خارج از نوبت اجرا شوند. مخاطره زمانی رخ می‌دهد که دو یا تعداد بیشتری از این برخوردهای دستورالعمل‌ها بطور هم‌زمان رخ دهد.
انواع
مخاطره داده
مخاطره داده زمانی رخ می‌دهد که دستورالعمل‌هایی که وابسته به داده‌ها هستند در مراحل مختلف خط لوله دست به ویرایش داده‌ها بزنند. در نظر نگرفتن مخاطره داده‌ها می‌تواند منجر به شرایط مسابقه شود (گاهی به عنوان هزارد ریس نبز شناخته می‌شود).
شرایط زیر شرایط احتمالی رخ دادن مخاطره داده است:
خواندن بعد از نوشتن، وابستگی واقعی
نوشتن بعد از خواندن، ضد وابستگی
نوشتن بعد از نوشتن، وابستگی خروجی
خواندن بعد از نوشتن
مخاطره خواندن بعد از نوشتن اشاره به موقعیتی می‌کند که یک دستورالعمل به نتیجه‌ای اشاره دارد که یا هنوز محاسبه نشده یا هنوز دریافت نشده. این مشکل رخ می‌دهد چون یک دستورالعمل اجرا شده بعد از دستورالعمل قبلی در حالی که دستورالعمل قبلی بطور کامل از طریق خط لوله پردازش نشده.
مثال
i1. R2 <- R1 + R3
i2. R4 <- R2 + R3
دستورالعمل اول مقداری را محاسبه می‌کند که قرار است در ثبات ۲ ذخیره شود، و دومی قرار است این مقدار را برای محاسبه نتیجه‌ای که برای ذخیره در ثبات ۴ است استفاده کند. اگرچه، در یک خط لوله وقتی ما عملوندها را برای دومین عملیات فچ می‌کنیم نتایج از اولی هنوز ذخیره نشده‌اند به همین دلیل وابستگی داده‌ای داریم.
در اینصورت می‌گوییم وابستگی داده‌ای بین دستورالعمل ۲ موجود است به این خاطر که به تکمیل شدن دستورالعمل ۱ وابسته است.
نوشتن بعد از خواندن
مخاطره نوشتن بعد از خواندن مشکلی است که به خاطر اجرای هم‌زمان رخ می‌دهد.
مثال
i1. R4 <- R1 + R5
i2. R5 <- R1 + R2
اگر ما در شرایطی قرار داریم که ممکن است که دستورالعمل ۲ قبل از دستورالعمل ۱ کامل شود باید مطمئن شویم که نتیجه ثبات ۵ را زخیره نکنیم قبل از آنکه دستورالعمل ۱ شانسی برای فچ کردن عملوندها داشته باشد.
نوشتن بعد از نوشتن
مخاطره نوشتن بعد از نوشتن ممکن است در محیطی رخ دهد که شرایط اجرای هم‌زمان را دارد.
مثال
i1. R2 <- R4 + R7
i2. R2 <- R1 + R3
باید رایت بک دستورالعمل ۲ را تا زمان اجرای دستورالعمل ۱ به تاخیر بیندازیم.
مخاطره‌های ساختاری
مخاطره ساختاری زمانی رخ می‌دهد که قسمتی از سخت‌افزار پردازنده مورد نیاز دو یا بیشتر از دستورالعمل‌ها در یک زمان باشد.
یک مثال استاندارد یک واحد تک حافظه است زمانی که مورد دسترسی هم‌زمان هم در مرحله فچ کردن جایی که یک دستورالعمل بازیابی می‌شود از حافظه و مرحله حافظه جایی که داده نوشته شده ویا خوانده شده از حافظه است.
اغلب این مشکلات توسط جدا کردن مولفه به واحدهای متعامد (اورتوگنال) یا تاخیر در خط لوله حل می‌شوند.
مخاطره کنترلی
مخاطره کنترل‌ها به همراه برنچ‌ها (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 = ۳
این خطا زمانی رخ می‌دهد به این دلیل که دستورالعمل ۲ ثبات ۱ را می‌خواند قبل از اینکه دستورالعمل ۱ نتیجه نوشتن عملیات را در ثبات ۱ ذخیره کند. پس زمانی که دستورالعمل ۲ در حال خواندن محتویات ثبات ۱ است، ثبات ۱ هنوز ۶ را در خود دارد به جای ۳.
پیشروی کمک به صحیح کردن چنین خطاهای می‌کند توسط وابستگی به این دلیل که خروجی دستورالعمل ۱ می‌تواند به عنوان دستورالعمل‌های بعدی استفاده شود قبل ازینکه مقدار ۳ در ثبات ۱ ذخیره شود.
این به این معنیست که ما منتظر ذخیره خروجی دستورالعمل ۱ در ثبات ۱ نمی‌شویم، قبل از آنکه آن خروجی را قابل دستیابی دستورالعمل‌های بعدی کنیم. (ذخیره به صورت بلادرنگ انجام گرفت و نه به صورت خط لوله‌ای)
هنگام استفاده از پیشروی مرحله دیکد و اجرای خط لوله دو ورودی دارد:۱-مقدار خوانده شده از ثبات ۱ و مقدار جدید ثبات ۱ که از مرحله بعد فرستاده شده‌است یا از اجرای دستورالعمل /دسترسی به حافظه فرستاده شده.
مخاطره کنترلی
برای جلوگیری از میکرو معماری مخاطره کنترل می‌توان:
وارد کردن یک تاخیر خط لوله، که مطمئنا تاخیر را زیاد می‌کند، یا
از پیش‌بینی برنچ استفاده کرد و از حدس‌های حساب شده‌استفاده کرد که کدام دستورالعمل‌ها باید وارد شوند، که در این صورت تاخیر فقط برای پیش‌بینی نادرست بکار می‌رود.
در حالتی که یک برنچ باعث تاخیر خط لوله شود بعد از آنکه دستورالعمل‌های نا صحیح وارد خط لوله شدند، باید مراقب بود که جلوگیری شود از هر دستورالعمل بارگذاری شده اشتباه که هر گونه تاثیری بر حالت پردازنده که مانع هدر روی انرژی که برای پردازش آن‌ها قبل از اینکه کشف شود که اشتباه بارگذاری شده‌اند.