پیش‌نویس:تغییر نام ثبات‌ها

تغییر نام ثبات 
'''این مقاله در حال ترجمه از ویکی انگلیسی است لطفا حذف نشود.'''

در [[معماری کامپیوتر]]، تغییر نام ثبات (Register Renaming) تکنیکی است که ثبات‌های منطقی را از ثبات‌های فیزیکی جدا می‌کند. هر ثبات منطقی مجموعه‌ای از ثبات‌های فیزیکی مرتبط دارد. وقتی یک دستورالعمل زبان ماشین به یک ثبات منطقی خاص اشاره می‌کند، پردازنده این نام را به‌صورت آنی به یک ثبات فیزیکی مشخص تبدیل می‌کند. ثبات‌های فیزیکی مبهم هستند و نمی‌توان مستقیماً به آن‌ها ارجاع داد، بلکه تنها از طریق نام‌های استاندارد قابل دسترسی‌اند.Register renaming

این تکنیک برای حذف وابستگی‌های داده‌ای کاذب ناشی از استفاده مجدد ثبات‌ها توسط دستورالعمل‌های پشت سرهم که وابستگی داده‌ای واقعی بین خود ندارند، به‌کار می‌رود. حذف این وابستگی‌های کاذب، موازی‌سازی بیشتری در سطح دستورالعمل را در یک جریان دستورالعمل آشکار می‌کند که می‌توان از آن با تکنیک‌های مکمل و متنوعی مانند [[ابررقمی (Superscalar)]] و [[اجرای خارج از ترتیب (Out-of-order execution)]] بهره گرفت.

 رویکرد به مسئله 
برنامه‌ها از دستورالعمل‌هایی تشکیل شده‌اند که روی مقادیر عمل می‌کنند. دستورالعمل‌ها باید این مقادیر را نام‌گذاری کنند تا آن‌ها را از یکدیگر متمایز کنند. یک دستورالعمل معمول ممکن است بگوید: «x و y را جمع کن و نتیجه را در z قرار بده.» در این دستورالعمل، x، y و z نام مکان‌های ذخیره‌سازی هستند.

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

ثبات‌های فردی در فایل با شماره در کد ماشین مشخص می‌شوند. رمزگذاری یک عدد در کد ماشین به چند بیت نیاز دارد. برای مثال، در [[زیلوگ Z80]]، هشت ثبات همه‌منظوره در فایل وجود داشت. برای انتخاب یکی از هشت مقدار، سه بیت لازم است زیرا ۲³ = ۸. داشتن ثبات‌های معماری (منطقی) بیشتر با همان عرض و نوع می‌تواند منجر به عملکرد بهتر شود، زیرا مقادیر موقتی بیشتری می‌توانند در ثبات‌ها نگهداری شوند و از عملیات پرهزینه ذخیره یا بارگذاری از حافظه اجتناب شود.

به طور کلی، پردازنده‌های مدرن‌تر و آن‌هایی که کلمات دستورالعمل بزرگ‌تری دارند، هرگاه ممکن باشد از ثبات‌های بیشتری استفاده می‌کنند. برای مثال، معماری دستورالعمل [[IA-32]] دارای ۸ ثبات همه‌منظوره است، [[x86-64]] دارای ۱۶، بسیاری از [[RISC|ریسک‌ها]] دارای ۳۲، و [[IA-64]] دارای ۱۲۸ ثبات است.

مزایای فایل ثبات بزرگ‌تر با نیاز به استفاده از بیت‌های بیشتر برای رمزگذاری شماره ثبات جبران می‌شود. برای مثال، در سیستمی که از دستورالعمل‌های ۳۲ بیتی استفاده می‌کند، ممکن است بخواهیم سه ثبات داشته باشیم تا بتوانیم عملیاتی از نوع z = x + y انجام دهیم. اگر فایل ثبات دارای ۳۲ ورودی باشد، هر یک از مراجع به ۵ بیت نیاز دارد و مجموع سه ثبات ۱۵ بیت می‌شود و ۱۷ بیت برای رمزگذاری عملیات و اطلاعات دیگر باقی می‌ماند. گسترش فایل ثبات به ۶۴ ورودی به ۶ بیت نیاز دارد، یعنی ۱۸ بیت در مجموع. این امر منجر به تلاش برای ایجاد تعادل بین اندازه فایل و تعداد دستورالعمل‌های ممکن می‌شود.

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

دستورالعمل‌های مختلف ممکن است زمان‌های متفاوتی بگیرند؛ برای مثال، یک پردازنده ممکن است بتواند صدها دستورالعمل ثبات-به-ثبات را در حین انجام یک بارگذاری از حافظه اصلی اجرا کند. پیشرفت کلیدی در بهبود عملکرد این است که اجازه داده شود دستورالعمل‌های سریع در حالی که سایرین منتظر داده هستند، اجرا شوند. این به معنای آن است که دستورالعمل‌ها دیگر به ترتیبی که در کد ماشین مشخص شده‌اند تکمیل نمی‌شوند، بلکه خارج از ترتیب اجرا می‌شوند.

این قطعه کد را در نظر بگیرید که روی یک CPU خارج از ترتیب اجرا می‌شود:
 r1 := m[1024] ;مقدار را در مکان حافظه 1024 بخوان
 r1 := r1 + 2 ;دو عدد به مقدار اضافه کن
 m[1032] := r1 ;نتیجه را در مکان 1032 ذخیره کن
 r1 := m[2048] ;مقدار را در 2048 بخوان
 r1 := r1 + 4 ;4 اضافه کن
 m[2056] := r1 ;در 2056 ذخیره کن
دستورالعمل‌های سه خط آخر مستقل از سه دستورالعمل اول هستند، اما پردازنده نمی‌تواند r1 := m[2048] را تمام کند تا وقتی که m[1032] := r1 قبلی کامل شود.

اگر ثبات دیگری در دسترس باشد، این محدودیت را می‌توان با انتخاب ثبات‌های متفاوت برای سه دستورالعمل اول و دوم حذف کرد:
 r1 := m[1024]
 r1 := r1 + 2
 m[1032] := r1
 r2 := m[2048]
 r2 := r2 + 4
 m[2056] := r2
اکنون سه دستورالعمل آخر می‌توانند به موازات سه دستورالعمل اول اجرا شوند. با این حال، بسیاری از CPU‌های پرکارایی یک فایل ثبات با ثبات‌های بیشتری نسبت به آنچه در مجموعه دستورالعمل مشخص شده، فراهم می‌کنند و در سخت‌افزار، مراجع در ثبات‌های تعریف‌شده توسط مجموعه دستورالعمل را به ثبات‌های موجود در فایل ثبات تغییر نام می‌دهند.

 خطرات داده‌ای 
وقتی بیش از یک دستورالعمل به یک مکان خاص به عنوان عملوند اشاره می‌کند - یا با خواندن آن (به عنوان ورودی) یا با نوشتن به آن (به عنوان خروجی) - اجرای آن دستورالعمل‌ها به ترتیبی متفاوت از ترتیب اصلی برنامه می‌تواند به سه نوع خطر داده‌ای منجر شود:

 خواندن پس از نوشتن (RAW): خواندن از یک ثبات یا مکان حافظه باید مقداری را که توسط آخرین نوشتن در ترتیب برنامه قرار داده شده برگرداند. این به عنوان وابستگی واقعی یا وابستگی جریان شناخته می‌شود و دستورالعمل‌ها را ملزم می‌کند که به ترتیب برنامه اجرا شوند.
 نوشتن پس از نوشتن (WAW): نوشتن‌های متوالی به یک ثبات یا مکان حافظه باید آن مکان را حاوی نتیجه نوشتن دوم بگذارند. این وابستگی‌های خروجی نامیده می‌شوند.
 نوشتن پس از خواندن (WAR): خواندن از یک ثبات یا مکان حافظه باید آخرین مقدار قبلی نوشته شده در آن مکان را برگرداند. این یک نوع وابستگی کاذب است که می‌توان با تغییر نام آن را حل کرد. وابستگی‌های WAR به عنوان وابستگی‌های ضد نیز شناخته می‌شوند.

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

هر آنچه خوانده و نوشته می‌شود می‌تواند تغییر نام یابد. در حالی که ثبات‌های همه‌منظوره و ممیز شناور بیشتر مورد بحث قرار می‌گیرند، ثبات‌های پرچم و وضعیت یا حتی بیت‌های وضعیت منفرد نیز معمولاً تغییر نام می‌یابند.

 ثبات‌های معماری در برابر ثبات‌های فیزیکی 
برنامه‌های زبان ماشین خواندن و نوشتن به مجموعه محدودی از ثبات‌ها را که توسط معماری مجموعه دستورالعمل (ISA) مشخص شده، تعریف می‌کنند. برای مثال، ISA آلفا دارای ۳۲ ثبات صحیح (هر کدام ۶۴ بیت) و ۳۲ ثبات ممیز شناور (هر کدام ۶۴ بیت) است. اینها ثبات‌های معماری هستند.

یک پردازنده خاص که این ISA را پیاده‌سازی می‌کند، [[آلفا 21264]]، دارای ۸۰ ثبات فیزیکی صحیح و ۷۲ ثبات فیزیکی ممیز شناور است.

در تمام طرح‌های تغییر نام، ماشین ثبات‌های معماری مراجع‌شده در جریان دستورالعمل را به برچسب تبدیل می‌کند. در حالی که ثبات‌های معماری ممکن است با ۳ تا ۵ بیت مشخص شوند، برچسب‌ها معمولاً اعداد ۶ تا ۸ بیتی هستند.

 فایل ثبات نمایه‌شده با برچسب 
این سبک تغییر نام در [[MIPS R10000]]، [[آلفا 21264]]، و بخش FP از [[AMD Athlon]] استفاده می‌شود.

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

 ایستگاه‌های رزروه 
این سبک در بخش صحیح طراحی‌های [[AMD K7]] و K8 استفاده می‌شود.

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

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

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

 تاریخچه 
سیستم IBM/360 مدل 91 یکی از اولین ماشین‌هایی بود که از اجرای خارج از ترتیب دستورالعمل‌ها پشتیبانی می‌کرد؛ از [[الگوریتم توماسولو]] استفاده کرد که تغییر نام ثبات را به‌کار می‌برد.

POWER1 از سال ۱۹۹۰ اولین ریزپردازنده‌ای بود که از تغییر نام ثبات و اجرای خارج از ترتیب استفاده کرد.

معماری ریزپردازنده P6 اولین معماری اینتل بود که هم اجرای خارج از ترتیب و هم تغییر نام ثبات را پیاده‌سازی کرد. معماری P6 در ریزپردازنده‌های Pentium Pro، Pentium II، Pentium III، Pentium M، Core و Core 2 استفاده شد.

Cyrix M1، که در ۲ اکتبر ۱۹۹۵ منتشر شد، اولین پردازنده x86 بود که از تغییر نام ثبات و اجرای خارج از ترتیب استفاده کرد. سایر پردازنده‌های x86 (مانند NexGen Nx686 و AMD K5) که در سال ۱۹۹۶ منتشر شدند نیز دارای تغییر نام ثبات و اجرای خارج از ترتیب عملیات RISC بودند.

 منابع 

 Simu, D. (September–October 2000). "The design space of register renaming techniques". ''IEEE Micro''. 20 (5). IEEE: 70–83.
 Smith, J. E.; Pleszkun, A. R. (June 1985). "Implementation of precise interrupts in pipelined processors". ''ACM SIGARCH Computer Architecture News''. 13 (3): 36–44.

[[:رده:معماری کامپیوتر]] [[:رده:پردازنده‌ها]]