From Wikipedia, the free encyclopedia
هازارد یا مخاطره (به انگلیسی: Hazard) مشکلات مرتبط با خط لولههای دستورالعمل در ریزمعماری واحد پردازندهٔ مرکزی است و وقتی رخ میدهد که دستورالعمل بعدی در سیکل کلاک بعدی نمیتواند اجرا شود،[1] و ممکن است که باعث محاسبات اشتباه شود. بهطور معمول سه نوع مخاطره وجود دارد:[2]
برای تأییدپذیری کامل این مقاله به منابع بیشتری نیاز است. |
چندین روش برای مقابله با مخاطره که شامل تأخیر در خط لوله، جلو فرستادن ثبات و در شرایط اجرای خارج از نوبت روشهای اسکور بردینگ و الگوریتم توماسولو میباشد، موجود است.
دستورالعملها در یک پردازنده با خط لوله در چند مرحله اجرا میشوند، بنابراین در هر زمانی چندین دستورالعمل در حال پردازش شدن در مراحل مختلف خط لوله میباشند، مانند واکشی و اجرا. چندین میکرو معماری خط لولهٔ دستورالعمل وجود دارد و ممکن است دستوالعملها خارج از نوبت اجرا شوند. مخاطره زمانی رخ میدهد که دو یا تعداد بیشتری از این برخوردهای دستورالعملها بهطور همزمان رخ دهد.
هزارد داده زمانی رخ میدهد که دستورالعملهایی که وابسته به دادهها هستند در مراحل مختلف خط لوله دست به ویرایش دادهها بزنند. در نظر نگرفتن مخاطره(hazard) دادهها میتواند منجر به شرایط ریس شود. (گاهی به عنوان هزارد ریس نیز شناخته میشود). دیتا بیش از ۵۰٪ کارایی خط لوله را پایین می آورد. شرایط زیر شرایط احتمالی رخ دادن مخاطره دادهاست:
مخاطره خواندن بعد از نوشتن اشاره به موقعیتی میکند که یک دستورالعمل به نتیجهای اشاره دارد که یا هنوز محاسبه نشده یا هنوز دریافت نشده. این مشکل رخ میدهد چون یک دستورالعمل اجرا شده بعد از دستورالعمل قبلی در حالی که دستورالعمل قبلی بهطور کامل از طریق خط لوله پردازش نشده.
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
مخاطره ساختاری زمانی رخ میدهد که قسمتی از سختافزار پردازنده مورد نیاز دو یا بیشتر از دستورالعملها در یک زمان باشد. یک مثال استاندارد یک واحد تک حافظه است زمانی که مورد دسترسی همزمان هم در مرحلهٔ فچ کردن جایی که یک دستورالعمل بازیابی میشود از حافظه و مرحلهٔ حافظه جایی که داده نوشته شده ویا خوانده شده از حافظه است.[3] اغلب این مشکلات توسط جدا کردن مؤلفه به واحدهای متعامد (اورتوگنال) یا تأخیر در خط لوله حل میشوند.
مخاطره کنترلها به همراه برنچها (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 = ۳
این خطا زمانی رخ میدهد به این دلیل که دستورالعمل ۲ ثبات ۱ را میخواند قبل از اینکه دستورالعمل ۱ نتیجهٔ نوشتن عملیات را در ثبات ۱ ذخیره کند. پس زمانی که دستورالعمل ۲ در حال خواندن محتویات ثبات ۱ است، ثبات ۱ هنوز ۶ را در خود دارد به جای ۳.
پیشروی کمک به صحیح کردن چنین خطاهای میکند توسط وابستگی به این دلیل که خروجی دستورالعمل ۱ میتواند به عنوان دستورالعملهای بعدی استفاده شود قبل ازینکه مقدار ۳ در ثبات ۱ ذخیره شود. این به این معنیست که ما منتظر ذخیرهٔ خروجی دستورالعمل ۱ در ثبات ۱ نمیشویم، قبل از آنکه آن خروجی را قابل دستیابی دستورالعملهای بعدی کنیم. (ذخیره به صورت بلادرنگ انجام گرفت و نه به صورت خط لولهای) هنگام استفاده از پیشروی مرحلهٔ دیکد و اجرای خط لوله دو ورودی دارد:۱-مقدار خوانده شده از ثبات ۱ و مقدار جدید ثبات ۱ که از مرحلهٔ بعد فرستاده شدهاست یا از اجرای دستورالعمل /دسترسی به حافظه فرستاده شده.
برای جلوگیری از میکرو معماری مخاطره کنترل میتوان:
در حالتی که یک برنچ باعث تأخیر خط لوله شود بعد از آنکه دستورالعملهای نا صحیح وارد خط لوله شدند، باید مراقب بود که جلوگیری شود از هر دستورالعمل بارگذاری شدهٔ اشتباه که هر گونه تأثیری بر حالت پردازنده که مانع هدر روی انرژی که برای پردازش آنها قبل از اینکه کشف شود که اشتباه بارگذاری شدهاند.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.