اسکوربوردینگ

**اسکوربوردینگ** (به انگلیسی: Scoreboarding) روشی متمرکز است که برای اولین بار در کامپیوتر سی‌دی‌سی ۶۶۰۰ (CDC 6600) به کار رفت و امکان زمان‌بندی پویای دستورها را فراهم می‌کند؛ به این صورت که وقتی هیچ تعارضی وجود نداشته باشد و سخت‌افزار آماده باشد، دستورها می‌توانند خارج از ترتیب اصلی برنامه اجرا شوند.

در اسکوربوردینگ، وابستگی‌های داده‌ای هر دستور در یک جدول مرکزی ثبت و به‌طور مداوم پیگیری می‌شود. دستورها فقط زمانی صادر می‌شوند که اسکوربورد تشخیص دهد هیچ تعارضی با دستورهای قبلی (که هنوز «در پرواز» هستند) وجود ندارد. اگر دستوری به دلیل ناامن بودن یا کمبود منبع متوقف شود، اسکوربورد جریان اجرای سایر دستورها را زیر نظر می‌گیرد تا همه وابستگی‌ها برطرف شود و سپس دستور متوقف‌شده را آزاد می‌کند. به زبان ساده: عملیات خواندن فقط در نبود خطر نوشتن (WAR و RAW) انجام می‌شود و عملیات نوشتن فقط در نبود خطر خواندن پیش از نوشتن انجام می‌شود.

اسکوربوردینگ در واقع پیاده‌سازی سخت‌افزاری همان الگوریتم پایه‌ای است که در زبان‌های برنامه‌نویسی داده‌جریان (dataflow) دیده می‌شود؛ یعنی ساخت یک گراف جهت‌دار بدون چرخه (DAG) که همان منطق در زمان اجرای برنامه اعمال می‌گردد.

## مراحل اسکوربوردینگ
دستورها به ترتیب رمزگشایی می‌شوند و چهار مرحله زیر را طی می‌کنند:

# **صدور (Issue)** — بررسی می‌شود که کدام رجیسترها خوانده/نوشته خواهند شد و خطرهای RAW، WAR و WAW شناسایی می‌شوند. اگر واحد تابعی مورد نیاز مشغول باشد یا خطر WAW وجود داشته باشد، دستور متوقف می‌شود تا خطر برطرف شود.
# **خواندن عملوندها (Read operands)** — تا وقتی همه عملوندهای منبع آماده نباشند (یعنی خطر RAW وجود نداشته باشد)، صبر می‌کند؛ سپس عملوندها خوانده می‌شوند و اجرا آغاز می‌گردد.
# **اجرا (Execution)** — واحد تابعی محاسبات را انجام می‌دهد و پس از اتمام، اسکوربورد را مطلع می‌کند.
# **نوشتن نتیجه (Write result)** — نتیجه آماده است اما هنوز نوشته نشده. نوشتن تا زمانی که خطر WAR وجود داشته باشد به تعویق می‌افتد (تا دستورهای بعدی فرصت خواندن مقدار قدیمی رجیستر را داشته باشند). پس از نوشتن، واحد آزاد می‌شود.

توجه کلیدی: «خواندن» فقط در نبود خطر نوشتن و «نوشتن» فقط در نبود خطر خواندن انجام می‌شود.

## ساختار داده
اسکوربورد سه جدول وضعیت نگهداری می‌کند:

* **وضعیت دستورها** — نشان می‌دهد هر دستور در کدام یک از چهار مرحله قرار دارد.
* **وضعیت واحدها تابعی** — وضعیت هر واحد تابعی را با ۹ فیلد نشان می‌دهد:

* **وضعیت رجیسترها** — نشان می‌دهد کدام واحد تابعی قرار است در هر رجیستر بنویسد.

## الگوریتم اصلی CDC 6600
الگوریتم دقیق (برگرفته از پتنت اصلی) به صورت شبه‌کد:
```
function issue(op, dst, src1, src2)
   wait until (!Busy[FU] AND !Result[dst]);
   Busy[FU] ← Yes;
   Op[FU] ← op;
   Fi[FU] ← dst;
   Fj[FU] ← src1;
   Fk[FU] ← src2;
   Qj[FU] ← Result[src1];
   Qk[FU] ← Result[src2];
   Rj[FU] ← Qj[FU] == 0;
   Rk[FU] ← Qk[FU] == 0;
   Result[dst] ← FU;

function read_operands(FU)
   wait until (Rj[FU] AND Rk[FU]);
   Rj[FU] ← No;
   Rk[FU] ← No;

function execute(FU)
   // انجام عملیات واحد تابعی

function write_back(FU)
   wait until (∀f (Fj[f]≠Fi[FU] OR Rj[f]=No) AND (Fk[f]≠Fi[FU] OR Rk[f]=No))
   foreach f do
       if Qj[f]=FU then Rj[f] ← Yes;
       if Qk[f]=FU then Rk[f] ← Yes;
   Result[Fi[FU]] ← 0;
   RegFile[Fi[FU]] ← نتیجه محاسبه‌شده;
   Busy[FU] ← No;
```


## محدودیت‌ها و نکات تاریخی
در کتاب تورنتون پیش از اصطلاحات مدرن نوشته شده است:

* «First Order Conflict» ≈ مشغول بودن واحدها + خطر WAW
* «Second Order Conflict» ≈ خطر RAW
* «Third Order Conflict» ≈ خطر WAR

در CDC 6600 واقعی، خطر WAW با توقف کامل (stall) در مرحله صدور حل می‌شد (نه با تغییر نام رجیستر). افزودن تغییر نام رجیستر به اسکوربوردینگ کاملاً ممکن است و در طراحی‌های مدرن‌تر انجام شده است.

تحلیل‌های جدید نشان می‌دهند که الگوریتم اسکوربوردینگ و الگوریتم توماسولو اساساً معادل هستند؛ فقط توماسولو با تغییر نام رجیستر WAW را هم به‌طور کامل حذف می‌کند.

## جستارهای وابسته

* الگوریتم توماسولو
* اجرای خارج از ترتیب
## منابع

* 

* 

رده:پردازش دستورها