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

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

هازارد یا مخاطره (به انگلیسی: Hazard) مشکلات مرتبط با خط لوله‌های دستورالعمل در ریزمعماری واحد پردازندهٔ مرکزی است و وقتی رخ می‌دهد که دستورالعمل بعدی در سیکل کلاک بعدی نمی‌تواند اجرا شود،[۱] و ممکن است که باعث محاسبات اشتباه شود. به‌طور معمول سه نوع مخاطره وجود دارد[۲]:

  1. مخاطره داده
  2. مخاطره ساختاری
  3. مخاطره کنترل

چندین روش برای مقابله با مخاطره که شامل تاخیر در خط لوله، جلو فرستادن ثبات و در شرایط اجرای خارج از نوبت روش‌های اسکور بردینگ و الگوریتم توماسولو می‌باشد، موجود است.

پیش‌زمینه[ویرایش]

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

انواع[ویرایش]

مخاطره داده[ویرایش]

مخاطره داده زمانی رخ می‌دهد که دستورالعمل‌هایی که وابسته به داده‌ها هستند در مراحل مختلف خط لوله دست به ویرایش داده‌ها بزنند. در نظر نگرفتن مخاطره داده‌ها می‌تواند منجر به شرایط مسابقه شود (گاهی به عنوان هزارد ریس نبز شناخته می‌شود). شرایط زیر شرایط احتمالی رخ دادن مخاطره داده است:

  1. خواندن بعد از نوشتن، وابستگی واقعی
  2. نوشتن بعد از خواندن، ضد وابستگی
  3. نوشتن بعد از نوشتن، وابستگی خروجی

خواندن بعد از نوشتن[ویرایش]

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

مثال[ویرایش]

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) رخ می‌دهند. روی بسیاری میکرو معماری دستورالعمل خط لوله، پردازنده خروجی برنچ را نمی‌داند زمانی که نیاز به وارد کردن دستورالعمل جدید به خط لوله دارد.

حذف مخاطره[ویرایش]

عمومی[ویرایش]

تاخیر خط لوله[ویرایش]

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

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

مخاطره داده[ویرایش]

چندین روش و الگوریتم اصلی برای حل مخاطره داده وجود دارد:

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

در مورد اجرای خارج از نوبت الگوریتم مورد استفاده دو الگوریتم زیر است:

  1. اسکوربردینگ، که در آن تاخیر خط لوله تنها زمانی مورد نیاز خواهد بود که هیچ واحد در حال کاری موجود نباشد
  2. الگوریتم توماسولو که از نامگذاری دوبارهٔ ثبات استفاده می‌کند که اجازه به خروج مداوم دستورالعمل‌ها می‌دهد

می‌توان وظیفهٔ حذف وابستگی‌های داده‌ای را به کامپایلر سپرد، که می‌تواند تعداد مناسبی از دستورالعمل‌های ان. او. پی را پر کند بین دستورالعمل‌های وابسته تا اطمینان حاصل کند از عملیات صحیح، یا جایی که ممکن است دستورالعمل‌ها را دوباره مرتب کند.

مثال[ویرایش]

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

Instruction 0: Register 1 = 6
Instruction 1: Register 1 = 3
Instruction 2: Register 2 = Register 1 + 7 = 10

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

Instruction 0: Register 1 = 6
Instruction 2: Register 2 = Register 1 + 7 = 13
Instruction 1: Register 1 = 3

این خطا زمانی رخ می‌دهد به این دلیل که دستورالعمل ۲ ثبات ۱ را می‌خواند قبل از اینکه دستورالعمل ۱ نتیجهٔ نوشتن عملیات را در ثبات ۱ ذخیره کند. پس زمانی که دستورالعمل ۲ در حال خواندن محتویات ثبات ۱ است، ثبات ۱ هنوز ۶ را در خود دارد بجای ۳.

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

مخاطره کنترلی[ویرایش]

برای جلو گیری از میکرو معماری مخاطره کنترل می‌توان:

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

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

منابع[ویرایش]

  1. Patterson & Hennessy 2009, p. 335.
  2. Patterson & Hennessy 2009, pp. 335-343.
  3. Patterson & Hennessy 2009, p. 336.