همه وابستگی های میان دستورها واقعی نیستند؛ بعضی فقط به دلیل استفاده از یک نام مشترک ایجاد می شوند
Register Renaming چیست؟ CPU چگونه وابستگی های کاذب میان دستورها را حذف می کند؟
در فصل قبل دیدیم که پردازنده های مدرن
می توانند دستورها را در داخل CPU
خارج از ترتیب اولیه برنامه اجرا کنند.
اما یک سوال مهم باقی ماند:
CPU از کجا می فهمد
کدام دستور واقعاً باید منتظر دستور قبلی بماند
و کدام دستور را می توان زودتر اجرا کرد؟
پاسخ این سوال
ما را به مفاهیمی مانند
Data Dependency یا «وابستگی داده ای»،
Register Renaming یا «نام گذاری مجدد ثبات ها»،
Reservation Station یا «ایستگاه رزرو»
و
Reorder Buffer یا «بافر مرتب سازی مجدد»
می رساند.
این ساختارها کمک می کنند CPU
میان «ترتیب نوشته شده برنامه»
و «ترتیب مناسب برای اجرای داخلی»
تفاوت قائل شود.
Program Order
→
Dependency Analysis
→
Register Renaming
→
Scheduling
→
Out-of-Order Execution
→
In-Order Retirement
در این فصل چه چیزهایی یاد می گیریم؟
- Architectural Register و Physical Register چه هستند.
- True Dependency و False Dependency چه تفاوتی دارند.
- RAW چیست.
- WAR چیست.
- WAW چیست.
- Register Renaming چیست.
- Rename Table چه کاری انجام می دهد.
- Physical Register File چیست.
- Reservation Station چیست.
- Operand چیست.
- Issue چیست.
- Dispatch چیست.
- Wakeup چیست.
- Select چیست.
- Reorder Buffer چیست.
- Retirement و Commit چه هستند.
- Precise Exception چیست.
- CPU چگونه بعد از Branch Misprediction بازیابی می شود.
- Out-of-Order Window چیست.
- چرا بزرگ تر بودن پنجره اجرای CPU می تواند مفید باشد.
ابتدا یادآوری کنیم Register چیست
ثبات پردازنده — Register
Register
یا «ثبات»
فضای ذخیره سازی بسیار کوچک
و بسیار سریع داخل پردازنده است.CPU برای نگهداری موقت
داده ها، آدرس ها، نتایج محاسبات
و برخی اطلاعات مورد نیاز اجرای دستورها
از Registerها استفاده می کند.
Architectural Register چیست؟
ثبات معماری — Architectural Register
Architectural Register
یا «ثبات معماری»
ثباتی است که در معماری مجموعه دستورها
برای نرم افزار تعریف شده است.برنامه و Compiler
با نام های معماری این Registerها
سروکار دارند.
اما CPU مدرن الزاماً مجبور نیست
در داخل سخت افزار
هر نام معماری را فقط به یک محل فیزیکی ثابت
محدود کند.
کامپایلر — Compiler
Compiler
یا «کامپایلر»
نرم افزاری است که کد نوشته شده
در یک زبان برنامه نویسی
را به شکل دیگری از کد،
معمولاً کدی مناسب تر برای اجرای ماشین،
تبدیل می کند.
Physical Register چیست؟
ثبات فیزیکی — Physical Register
Physical Register
یا «ثبات فیزیکی»
یکی از محل های واقعی داخلی CPU
برای نگهداری مقادیر Registerها است.یک پردازنده Out-of-Order
می تواند تعداد Physical Registerهای بیشتری
نسبت به Registerهای معماری قابل مشاهده
در اختیار داشته باشد.
چون یک نام معماری
ممکن است در بخش های مختلف جریان دستورها
برای مقادیر متفاوتی استفاده شود.
اگر CPU بتواند
این استفاده های متفاوت را
به Physical Registerهای جداگانه نگاشت کند،
بعضی وابستگی های غیرواقعی
از بین می روند.
این دقیقاً همان جایی است
که Register Renaming وارد می شود.
وابستگی میان دستورها دقیقاً یعنی چه؟
فرض کنید چند دستور
به Registerهای یکسانی
دسترسی داشته باشند.
نوع و ترتیب
خواندن و نوشتن این Registerها
مشخص می کند
چه نوع رابطه ای
میان دستورها وجود دارد.
سه اصطلاح بسیار مهم عبارت اند از:
RAW
=
Read After Write
WAR
=
Write After Read
WAW
=
Write After Write
| نوع | نام کامل انگلیسی | معنی فارسی | ماهیت وابستگی |
|---|---|---|---|
| RAW | Read After Write | خواندن پس از نوشتن | وابستگی واقعی داده |
| WAR | Write After Read | نوشتن پس از خواندن | وابستگی کاذب ناشی از نام |
| WAW | Write After Write | نوشتن پس از نوشتن | وابستگی کاذب ناشی از نام |
RAW چیست؟
خواندن پس از نوشتن — Read After Write
RAW
مخفف:
Read After Write
و به معنی
«خواندن پس از نوشتن»
است.
این حالت زمانی رخ می دهد
که دستور دوم
به نتیجه ای نیاز داشته باشد
که دستور اول هنوز باید تولید کند.
این دو عملیات فرضی را ببینید:
Instruction 1:
R1 = R2 + R3
Instruction 2:
R4 = R1 × R5
Instruction 2
باید مقدار جدید R1
را که توسط Instruction 1 تولید می شود
بخواند.
بنابراین دستور دوم
واقعاً به نتیجه دستور اول وابسته است.
Produce R1
→
Consume R1
این یک
True Dependency یا «وابستگی واقعی»
است.
وابستگی واقعی — True Dependency
True Dependency
یا «وابستگی واقعی»
زمانی وجود دارد
که یک عملیات
واقعاً برای دریافت داده مورد نیاز خود
به نتیجه عملیات قبلی وابسته باشد.Register Renaming
نمی تواند نیاز واقعی به این داده را حذف کند.
WAR چیست؟
نوشتن پس از خواندن — Write After Read
WAR
مخفف:
Write After Read
و به معنی
«نوشتن پس از خواندن»
است.
در این حالت
یک دستور باید مقدار قدیمی یک Register را بخواند
و دستور بعدی قصد دارد
مقدار جدیدی در همان نام Register بنویسد.
Instruction 1:
R4 = R1 + R2
Instruction 2:
R1 = R5 + R6
Instruction 1
باید مقدار قدیمی R1 را بخواند.
Instruction 2
مقدار جدیدی در R1 می نویسد.
اگر اجرای داخلی بدون کنترل
جابه جا شود،
نباید نوشتن جدید
باعث شود دستور اول
مقدار اشتباه را ببیند.
نکته مهم این است که
Instruction 2
برای محاسبه خود
به نتیجه Instruction 1 نیاز ندارد.
مشکل اصلی
استفاده مشترک از نام R1 است.
WAW چیست؟
نوشتن پس از نوشتن — Write After Write
WAW
مخفف:
Write After Write
و به معنی
«نوشتن پس از نوشتن»
است.
در این حالت
دو دستور مختلف
می خواهند در یک Register معماری
مقدار بنویسند.
Instruction 1:
R1 = R2 + R3
Instruction 2:
R1 = R4 × R5
هر دو دستور
از نام R1
به عنوان مقصد استفاده کرده اند.
اما نتیجه Instruction 2
برای محاسبه خود
به نتیجه Instruction 1 نیاز ندارد.
مسئله این است
که ترتیب نهایی نوشتن ها
باید مطابق رفتار برنامه حفظ شود.
False Dependency چیست؟
وابستگی کاذب — False Dependency
False Dependency
یا «وابستگی کاذب»
وابستگی ای است
که به دلیل استفاده از نام مشترک
برای یک منبع معماری ایجاد شده،
نه به دلیل نیاز واقعی یک دستور
به داده تولید شده توسط دستور دیگر.WAR و WAW
نمونه های مهم
وابستگی نامی یا کاذب هستند.
| وابستگی | واقعی یا کاذب؟ | Register Renaming می تواند حذف کند؟ |
|---|---|---|
| RAW | واقعی | خیر؛ مصرف کننده واقعاً به داده تولید شده نیاز دارد |
| WAR | کاذب / نامی | بله |
| WAW | کاذب / نامی | بله |
Register Renaming چیست؟
نام گذاری مجدد ثبات ها — Register Renaming
Register Renaming
یا «نام گذاری مجدد ثبات ها»
تکنیکی است
که CPU با استفاده از آن
نام های Register معماری
را به Physical Registerهای مختلف
نگاشت می کند.هدف مهم این کار
حذف وابستگی های کاذب
و فراهم کردن فرصت بیشتر
برای اجرای موازی دستورها است.
برنامه همچنان ممکن است
از R1 استفاده کند.
اما CPU می تواند نسخه های مختلف
این نام معماری را
به Physical Registerهای متفاوت
متصل کند.
برای مثال:
Architectural R1
→
Physical P17
و پس از یک نوشتن جدید:
New Architectural R1
→
Physical P42
در نتیجه مقدار قدیمی
و مقدار جدید R1
می توانند موقتاً
در دو محل فیزیکی متفاوت وجود داشته باشند.
Register Renaming چگونه WAW را حذف می کند؟
مثال قبلی را دوباره ببینیم:
Instruction 1:
R1 = R2 + R3
Instruction 2:
R1 = R4 × R5
CPU می تواند مقصدهای داخلی را
این گونه تغییر دهد:
Instruction 1:
P20 = P2 + P3
Instruction 2:
P21 = P4 × P5
حالا دو عملیات
دیگر روی یک Physical Register مشترک
نمی نویسند.
بنابراین وابستگی نامی WAW
از مسیر اجرای داخلی حذف شده است.
خیر.
Register Renaming
می تواند وابستگی های نامی
مانند WAR و WAW را حذف کند.
اما RAW
نشان دهنده جریان واقعی داده است.
اگر دستور B
واقعاً به نتیجه دستور A نیاز داشته باشد،
تغییر نام Register
نمی تواند آن داده را
پیش از تولید شدن ایجاد کند.
WAR / WAW
→
Can Be Removed by Renaming
RAW
→
True Data Dependency
Rename Table چیست؟
جدول نگاشت نام ثبات ها — Rename Table
Rename Table
یا «جدول نگاشت نام ثبات ها»
ساختاری داخلی است
که ارتباط میان Registerهای معماری
و Physical Registerهای فعلی
را دنبال می کند.جزئیات و نام دقیق این ساختار
میان ریزمعماری های مختلف
می تواند متفاوت باشد.
Physical Register File چیست؟
فایل ثبات های فیزیکی — Physical Register File
Physical Register File
یا «فایل ثبات های فیزیکی»
مجموعه ای از Physical Registerها است
که مقادیر داخلی مورد استفاده
عملیات پردازنده
می توانند در آن نگهداری شوند.به صورت کوتاه
ممکن است از عبارت:
PRF
=
Physical Register File
استفاده شود.
Operand چیست؟
عملوند — Operand
Operand
یا «عملوند»
داده یا مقداری است
که یک دستور
عملیات خود را روی آن انجام می دهد.برای مثال در:
A = B + C
مقادیر B و C
ورودی های عملیات جمع هستند.
Reservation Station چیست؟
ایستگاه رزرو — Reservation Station
Reservation Station
یا «ایستگاه رزرو»
ساختاری در موتور اجرای Out-of-Order است
که عملیات منتظر اجرا
و وضعیت Operandهای مورد نیاز آنها
را نگهداری می کند.عملیات می تواند در این ساختار منتظر بماند
تا داده ها و واحد اجرایی مناسب
آماده شوند.
یک عملیات ممکن است
برای اجرا تقریباً آماده باشد،
اما یکی از Operandهای آن
هنوز تولید نشده باشد.
به شکل مفهومی:
Operand A
=
Ready
Operand B
=
Waiting
وقتی Operand B آماده شود،
عملیات می تواند
کاندید اجرای واقعی شود.
در همین زمان،
عملیات مستقل دیگری
لازم نیست منتظر بماند.
Wakeup چیست؟
اعلام آماده شدن عملیات — Wakeup
Wakeup
یا «اعلام آماده شدن»
به فرایندی گفته می شود
که در آن آماده شدن نتیجه مورد نیاز
به عملیات منتظر اطلاع داده می شود.در نتیجه عملیاتی که
Operandهای لازم آن آماده شده اند
می تواند برای اجرا
در نظر گرفته شود.
Select چیست؟
انتخاب عملیات آماده — Select
Select
یا «انتخاب»
فرایندی است
که از میان عملیات آماده،
تعدادی برای استفاده
از واحدهای اجرایی موجود
انتخاب می شوند.
این دو مفهوم
اغلب در تحلیل موتور اجرای CPU
کنار هم دیده می شوند:
Wakeup
→
Select
→
Execute
Dispatch و Issue چه تفاوتی دارند؟
Dispatch و Issue — دو اصطلاح مهم در مسیر اجرای دستور
Dispatch
معمولاً به انتقال عملیات
به ساختارهای موتور اجرای Out-of-Order
اشاره دارد.Issue
معمولاً به انتخاب و فرستادن
یک عملیات آماده
برای اجرا روی واحد اجرایی مناسب
اشاره می کند.
اما باید توجه داشت
که استفاده دقیق از این اصطلاحات
میان منابع و معماری های مختلف
همیشه کاملاً یکسان نیست.
Reorder Buffer یا ROB دقیقاً چه کاری انجام می دهد؟
بافر مرتب سازی مجدد — Reorder Buffer
Reorder Buffer
یا ROB
ساختاری مهم
در بسیاری از CPUهای Out-of-Order است
که اطلاعات دستورهای در حال پردازش
را تا زمان نهایی شدن
دنبال می کند.یکی از نقش های مهم آن
کمک به حفظ ترتیب معماری
هنگام نهایی سازی دستورها است.
چرا Execute با Retire یکی نیست؟
یک دستور ممکن است
اجرای محاسباتی خود را تمام کرده باشد،
اما هنوز نتواند
نتیجه معماری خود را نهایی کند.
چرا؟
چون ممکن است
دستور قدیمی تری
هنوز در وضعیت حل نشده باشد.
بنابراین:
Execution Complete
≠
Architectural Retirement
Retirement چیست؟
نهایی سازی دستور — Retirement
Retirement
یا «نهایی سازی دستور»
مرحله ای است
که نتیجه یک دستور
به صورت رسمی
بخشی از وضعیت معماری برنامه می شود.اجرای داخلی می تواند
خارج از ترتیب باشد،
اما Retirement معمولاً
ترتیب برنامه را حفظ می کند.
Commit چیست؟
ثبت نهایی نتیجه — Commit
Commit
یا «ثبت نهایی نتیجه»
اصطلاحی است
که در بسیاری از توضیحات معماری CPU
نزدیک به مفهوم Retirement
استفاده می شود.تفاوت کاربرد دقیق این واژه ها
می تواند به معماری
یا منبع فنی مورد استفاده بستگی داشته باشد.
Precise Exception چیست؟
استثنای دقیق — Precise Exception
Precise Exception
یا «استثنای دقیق»
یعنی CPU بتواند
هنگام رخ دادن یک Exception
وضعیت معماری را طوری ارائه کند
که انگار دستورهای قبل از نقطه خطا
به درستی انجام شده اند
و دستورهای بعدی
هنوز اثر معماری نهایی ایجاد نکرده اند.این قابلیت
با وجود اجرای داخلی خارج از ترتیب
اهمیت بسیار زیادی دارد.
ROB به پردازنده کمک می کند
وضعیت تعداد زیادی دستور در حال پرواز
را دنبال کند.
این ساختار
در مدیریت Retirement،
Exceptionها،
اجرای حدسی
و بازیابی از برخی پیش بینی های اشتباه
نقش مهمی دارد.
Instructions In Flight یعنی چه؟
دستورهای در حال پردازش — Instructions In Flight
Instructions In Flight
یا «دستورهای در حال پردازش»
به دستورهایی گفته می شود
که وارد Pipeline شده اند
اما هنوز Retirement آنها
کامل نشده است.در یک CPU مدرن
ممکن است تعداد زیادی دستور
به طور همزمان
در مراحل مختلف پردازش قرار داشته باشند.
Out-of-Order Window چیست؟
پنجره اجرای خارج از ترتیب — Out-of-Order Window
Out-of-Order Window
یا «پنجره اجرای خارج از ترتیب»
به محدوده ای از عملیات در حال پردازش
گفته می شود
که CPU می تواند
برای پیدا کردن کار مستقل
در میان آنها جستجو کند.هرچه پردازنده
بتواند تعداد بیشتری عملیات
را زیر نظر داشته باشد،
احتمال پیدا کردن یک عملیات مستقل
هنگام توقف دستورهای دیگر
می تواند افزایش یابد.
فرض کنید یک دستور
منتظر داده ای از Cache یا RAM است.
اگر CPU
فقط چند دستور بعدی را ببیند
و همه آنها وابسته باشند،
ممکن است منابع اجرایی بیکار بمانند.
اما اگر پنجره بزرگ تری
از عملیات در اختیار داشته باشد،
شاید در فاصله دورتر
دستورهای مستقلی پیدا کند.
Memory Stall
→
Search Independent Work
→
Execute Other Instructions
→
Hide Part of Latency
به این ترتیب
CPU تلاش می کند
بخشی از زمان انتظار حافظه
را با کار مفید پر کند.
Latency Hiding چیست؟
پنهان کردن تاخیر — Latency Hiding
Latency Hiding
یا «پنهان کردن تاخیر»
به تکنیک هایی گفته می شود
که اجازه می دهند
هنگام انتظار برای یک عملیات کندتر،
کار مفید دیگری انجام شود.Out-of-Order Execution
یکی از راه های مهم
پنهان کردن بخشی از Latency
در CPU است.
خیر.
ساختارهای بزرگ تر
می توانند فرصت بیشتری
برای پیدا کردن Instruction-Level Parallelism
ایجاد کنند،
اما هزینه هایی نیز دارند.
از جمله:
- پیچیدگی سخت افزاری بیشتر
- مصرف انرژی بیشتر
- مساحت بیشتر روی تراشه
- پیچیده تر شدن زمان بندی عملیات
- چالش های بیشتر برای حفظ فرکانس بالا
طراحی CPU همیشه
مسئله ایجاد تعادل
میان این عوامل است.
هنگام Branch Misprediction چه بر سر Renameها می آید؟
در فصل قبل دیدیم
CPU ممکن است
روی مسیر پیش بینی شده
دستورهای زیادی را جلو ببرد.
این دستورها
حتی ممکن است
Register Renaming شده باشند
و منابع داخلی گرفته باشند.
اگر مشخص شود
Branch اشتباه پیش بینی شده،
پردازنده باید
وضعیت مربوط به مسیر اشتباه را کنار بگذارد
و نگاشت صحیح را بازیابی کند.
Branch Misprediction
→
Discard Wrong-Path Work
→
Restore Correct Rename State
→
Redirect Fetch
Checkpoint چیست؟
نقطه بازیابی وضعیت — Checkpoint
Checkpoint
یا «نقطه بازیابی وضعیت»
نسخه ای از اطلاعات لازم
برای بازگرداندن وضعیت داخلی
به یک نقطه مشخص است.برخی طراحی های CPU
می توانند از سازوکارهای Checkpoint
برای بازیابی سریع تر
پس از پیش بینی اشتباه استفاده کنند.
جزئیات این سازوکار
میان ریزمعماری ها متفاوت است.
چه چیزی اندازه اجرای Out-of-Order را محدود می کند؟
CPU منابع نامحدود ندارد.
تعداد عملیات در حال پرواز
می تواند توسط ظرفیت ساختارهای مختلف
محدود شود.
برای مثال:
- Reorder Buffer
- Physical Registers
- Reservation Stations
- Load / Store Structures
- Scheduler Capacity
- Front-End Throughput
عملیات بارگذاری و ذخیره — Load / Store
Load
یا «بارگذاری»
عملیاتی است
که داده را از حافظه
برای استفاده پردازنده دریافت می کند.Store
یا «ذخیره»
عملیاتی است
که داده را برای نوشتن
در حافظه ارسال می کند.
مدیریت وابستگی های حافظه
میان Load و Store
مسئله مهم دیگری است
که در فصل بعد
عمیق تر بررسی می کنیم.
اگر CPU مجبور بود
هر بار که دو دستور
از یک نام Register استفاده می کنند
آنها را وابسته فرض کند،
مقدار زیادی از Parallelism
از بین می رفت.
Register Renaming
اجازه می دهد CPU
وابستگی واقعی داده
را از وابستگی صرفاً نامی
جدا کند.
Remove False Dependencies
→
More Independent Operations
→
Better Scheduling Opportunities
→
Higher Potential ILP
به همین دلیل
تعداد Physical Registerها،
ظرفیت Scheduler،
ROB
و سایر منابع داخلی
می توانند در Performance
ریزمعماری اهمیت داشته باشند.
اکنون دلیل این موضوع
روشن تر می شود.
یک معماری جدیدتر ممکن است:
- Front-End قوی تری داشته باشد،
- Branch Predictor دقیق تری داشته باشد،
- ROB بزرگ تری داشته باشد،
- Physical Register بیشتری داشته باشد،
- Scheduler توانمندتری داشته باشد،
- واحدهای اجرایی بیشتری داشته باشد،
- Cache بهتری داشته باشد،
- و Latencyها را بهتر پنهان کند.
بنابراین مشخصات ساده ای مانند:
Core Count
+
Clock Frequency
تصویر کاملی از توان واقعی CPU
ارائه نمی دهند.
مسیر ساده شده یک دستور در CPU Out-of-Order
| مرحله | معنی فارسی | وظیفه اصلی |
|---|---|---|
| Fetch | واکشی | دریافت دستورها |
| Decode | رمزگشایی | تفسیر دستورها و تبدیل آنها به عملیات داخلی |
| Rename | نام گذاری مجدد | نگاشت Registerهای معماری به منابع فیزیکی |
| Dispatch | ارسال داخلی | ورود عملیات به ساختارهای موتور Out-of-Order |
| Wakeup / Select | آماده سازی و انتخاب | پیدا کردن عملیات آماده برای اجرا |
| Execute | اجرا | انجام عملیات توسط واحد اجرایی |
| Retire | نهایی سازی | ثبت نتیجه معتبر طبق ترتیب معماری برنامه |
حالا می توانیم
مسیر فصل قبل و این فصل
را به هم متصل کنیم:
Branch Prediction
→
Fetch
→
Decode
→
Register Rename
→
Dispatch
→
Reservation / Scheduling
→
Wakeup
→
Select
→
Execute
→
Complete
→
Retire
در تمام این مسیر،
پردازنده دائماً تلاش می کند
میان صدها وابستگی،
محدودیت منابع
و اتفاقات حافظه،
بیشترین مقدار کار مستقل
را پیدا کند.
- فرض اینکه همه وابستگی های Register واقعی هستند.
- یکی دانستن RAW، WAR و WAW.
- فرض اینکه Register Renaming وابستگی RAW را حذف می کند.
- فرض اینکه Register Renaming نام Register را در خود برنامه تغییر می دهد.
- یکی دانستن Architectural Register و Physical Register.
- فرض اینکه Out-of-Order یعنی نتیجه برنامه خارج از ترتیب ثبت می شود.
- یکی دانستن Execute و Retire.
- یکی دانستن Dispatch و Issue در همه معماری ها.
- فرض اینکه ROB فقط یک صف ساده برای دستورها است.
- فرض اینکه دستور اجرا شده الزاماً نهایی شده است.
- فرض اینکه پنجره Out-of-Order بزرگ تر همیشه بهتر است.
- نادیده گرفتن هزینه انرژی و پیچیدگی Schedulerهای بزرگ.
- نادیده گرفتن نقش Branch Prediction در استفاده موثر از موتور Out-of-Order.
- مقایسه توان CPUها فقط بر اساس تعداد Core و GHz.
سوالات متداول درباره Register Renaming و اجرای Out-of-Order
Register Renaming چیست؟
نام گذاری مجدد ثبات ها
روشی است که CPU
Registerهای معماری را
به Physical Registerهای مختلف نگاشت می کند
تا وابستگی های کاذب کاهش پیدا کنند.
RAW چیست؟
Read After Write
یا «خواندن پس از نوشتن»
یک وابستگی واقعی داده است
که در آن دستور بعدی
به نتیجه دستور قبلی نیاز دارد.
WAR چیست؟
Write After Read
یا «نوشتن پس از خواندن»
یک وابستگی نامی است
که می تواند با Register Renaming
برطرف شود.
WAW چیست؟
Write After Write
یا «نوشتن پس از نوشتن»
زمانی رخ می دهد
که چند دستور
از یک Register معماری
به عنوان مقصد استفاده کنند.
چرا RAW با Register Renaming حذف نمی شود؟
چون دستور مصرف کننده
واقعاً به داده تولید شده
توسط دستور قبلی نیاز دارد.
این وابستگی صرفاً ناشی از نام Register نیست.
Physical Register چیست؟
یک محل ذخیره سازی واقعی
در ساختار داخلی CPU است
که می تواند
برای نگهداری نسخه های مختلف
مقادیر Registerهای معماری استفاده شود.
Reservation Station چیست؟
ساختاری برای نگهداری عملیات منتظر اجرا
و دنبال کردن آماده شدن Operandهای آنها است.
ROB چیست؟
Reorder Buffer
ساختاری برای دنبال کردن
دستورهای در حال پردازش
و کمک به نهایی سازی صحیح آنها است.
آیا CPU دستورها را واقعاً خارج از ترتیب اجرا می کند؟
بله.
در CPUهای Out-of-Order
عملیات مستقل می توانند
خارج از ترتیب اولیه اجرا شوند،
اما نتیجه معماری برنامه
باید رفتار صحیح تعریف شده را حفظ کند.
Instructions In Flight یعنی چه؟
دستورهایی هستند
که وارد Pipeline شده اند
اما هنوز Retirement آنها
کامل نشده است.
Out-of-Order Window چیست؟
محدوده ای از عملیات در حال پردازش است
که CPU می تواند
برای یافتن کارهای مستقل
میان آنها جستجو کند.
آیا ROB بزرگ تر همیشه CPU را سریع تر می کند؟
خیر.
ظرفیت بیشتر می تواند
فرصت اجرای بیشتری ایجاد کند،
اما مصرف انرژی،
پیچیدگی،
مساحت تراشه
و محدودیت های دیگر نیز اهمیت دارند.
واژه های جدید این فصل برای واژه نامه نهایی کتاب
- Architectural Register: ثبات تعریف شده در معماری قابل مشاهده نرم افزار.
- Physical Register: ثبات فیزیکی داخلی CPU.
- Compiler: نرم افزار تبدیل کد به شکل مناسب تر برای اجرا یا پردازش بعدی.
- RAW: Read After Write؛ خواندن پس از نوشتن و وابستگی واقعی داده.
- WAR: Write After Read؛ نوشتن پس از خواندن و وابستگی نامی.
- WAW: Write After Write؛ نوشتن پس از نوشتن و وابستگی نامی.
- True Dependency: وابستگی واقعی ناشی از نیاز به داده تولید شده.
- False Dependency: وابستگی کاذب ناشی از اشتراک نام منابع.
- Register Renaming: نام گذاری مجدد ثبات ها با نگاشت نام معماری به منابع فیزیکی.
- Rename Table: ساختار دنبال کننده نگاشت Register معماری به Physical Register.
- PRF: Physical Register File یا فایل ثبات های فیزیکی.
- Operand: عملوند یا داده ورودی یک عملیات.
- Reservation Station: ایستگاه نگهداری عملیات منتظر آماده شدن برای اجرا.
- Wakeup: اعلام آماده شدن داده مورد نیاز یک عملیات.
- Select: انتخاب عملیات آماده برای اجرا.
- Dispatch: ارسال عملیات به ساختارهای موتور اجرای داخلی.
- Issue: فرستادن عملیات آماده به واحد اجرایی مناسب.
- ROB: Reorder Buffer یا بافر مرتب سازی مجدد.
- Retirement: نهایی سازی نتیجه دستور در وضعیت معماری.
- Commit: ثبت نهایی نتیجه معتبر دستور.
- Precise Exception: استثنایی که وضعیت معماری دقیق و قابل بازیابی را حفظ می کند.
- Instructions In Flight: دستورهای وارد شده به Pipeline که هنوز نهایی نشده اند.
- Out-of-Order Window: پنجره عملیات قابل بررسی برای اجرای خارج از ترتیب.
- Latency Hiding: انجام کار مفید دیگر برای پوشاندن بخشی از زمان انتظار.
- Checkpoint: نقطه ذخیره وضعیت لازم برای بازیابی.
- Load: عملیات دریافت داده از حافظه.
- Store: عملیات نوشتن داده در حافظه.
خلاصه فصل
پردازنده Out-of-Order
فقط ترتیب دستورها را جابه جا نمی کند.
پیش از آن باید تشخیص دهد
کدام عملیات واقعاً به یکدیگر وابسته هستند.
RAW یک وابستگی واقعی داده است،
اما WAR و WAW
می توانند فقط به دلیل
استفاده از نام Register مشترک ایجاد شوند.
Register Renaming
با نگاشت نام های معماری
به Physical Registerهای متفاوت
این وابستگی های کاذب را کاهش می دهد.
Architectural Registers
→
Register Renaming
→
Physical Registers
→
Dependency Tracking
→
Scheduling
→
Execution
Reservation Station و Scheduler
منتظر آماده شدن عملیات می مانند،
واحدهای اجرایی کار را انجام می دهند
و ROB کمک می کند
نتایج در زمان مناسب
نهایی شوند.
مهم ترین قانون این فصل:
CPU مدرن فقط دستور بعدی را اجرا نمی کند؛
دائماً میان تعداد زیادی دستور
به دنبال کاری می گردد
که همین حالا قابل انجام باشد.
جابه جا کردن دستورهای محاسباتی یک مسئله است؛ جابه جا کردن خواندن و نوشتن حافظه مسئله ای سخت تر
Load و Store چیست؟ CPU چگونه وابستگی های حافظه را در اجرای Out-of-Order مدیریت می کند؟
در موتور Out-of-Order،
CPU تلاش می کند هر عملیاتی را که آماده است
زودتر اجرا کند.
اما عملیات حافظه یک چالش مهم ایجاد می کنند.
اگر یک دستور بخواهد
از یک آدرس حافظه داده بخواند
و دستور دیگری بخواهد
در همان آدرس داده بنویسد،
جابه جا شدن نادرست ترتیب آنها
می تواند نتیجه برنامه را عوض کند.
بنابراین پردازنده باید
علاوه بر وابستگی Registerها،
Memory Dependency یا «وابستگی حافظه»
را نیز تشخیص دهد.
Load
+
Store
+
Address Calculation
+
Dependency Checking
+
Ordering
=
Correct Memory Execution
در این فصل چه چیزهایی یاد می گیریم؟
- Load چیست.
- Store چیست.
- Memory Operand چیست.
- Effective Address چیست.
- Load Queue چیست.
- Store Queue چیست.
- Load/Store Queue چیست.
- Memory Dependency چیست.
- Memory Alias چیست.
- Memory Disambiguation چیست.
- Store-to-Load Forwarding چیست.
- Store Buffer چیست.
- Load Buffer چیست.
- Memory Ordering چیست.
- Memory Model چیست.
- Fence چیست.
- Speculative Load چیست.
- Memory Order Violation چیست.
- Replay چیست.
- چرا حافظه می تواند موتور Out-of-Order را متوقف کند.
Load چیست؟
بارگذاری داده — Load
Load
یا «بارگذاری»
عملیاتی است
که داده را از حافظه
به داخل منابع پردازنده می آورد
تا CPU بتواند روی آن کار کند.به صورت مفهومی:
Memory
→
CPU
Store چیست؟
ذخیره داده — Store
Store
یا «ذخیره»
عملیاتی است
که داده تولید شده توسط CPU
را برای نوشتن
در حافظه ارسال می کند.به صورت مفهومی:
CPU
→
Memory
Memory Operand چیست؟
عملوند حافظه — Memory Operand
Memory Operand
یا «عملوند حافظه»
داده ای است
که یک دستور
آن را مستقیماً از حافظه می خواند
یا در حافظه می نویسد.
Effective Address چیست؟
آدرس موثر — Effective Address
Effective Address
یا «آدرس موثر»
آدرسی است
که یک دستور حافظه
برای مشخص کردن محل داده
محاسبه می کند.این آدرس می تواند
از ترکیب بخش هایی مانند:
- Base Address
- Index
- Scale
- Offset
ساخته شود.
Base، Index و Offset یعنی چه؟
Base
یا «آدرس پایه»
نقطه شروع یک ناحیه حافظه است.Index
یا «شاخص»
می تواند موقعیت یک عنصر
در ساختار داده را مشخص کند.
Offset
یا «جابجایی»
مقدار افزوده شده
برای رسیدن به محل نهایی است.
AGU چیست؟
واحد تولید آدرس — Address Generation Unit
AGU
مخفف:
Address Generation Unit
و به معنی
«واحد تولید آدرس»
است.
AGU بخشی از پردازنده است
که در محاسبه آدرس
برای عملیات Load و Store
نقش دارد.
برای توضیح مفهومی،
یک Load می تواند مسیری شبیه این داشته باشد:
Instruction
→
Address Generation
→
Dependency Check
→
TLB
→
Cache Lookup
→
Data Return
اگر داده در Cache نزدیک
پیدا نشود،
مسیر می تواند
به سطوح پایین تر Cache
و در نهایت RAM ادامه پیدا کند.
Load Queue چیست؟
صف بارگذاری — Load Queue
Load Queue
یا «صف بارگذاری»
ساختاری داخلی
برای دنبال کردن Loadهای در حال پردازش
و اطلاعات مربوط به آنها است.
Store Queue چیست؟
صف ذخیره — Store Queue
Store Queue
یا «صف ذخیره»
ساختاری داخلی
برای نگهداری و دنبال کردن
Storeهایی است
که هنوز تمام مراحل لازم
برای نهایی شدن آنها کامل نشده است.
LSQ چیست؟
صف Load و Store — Load/Store Queue
LSQ
مخفف:
Load / Store Queue
است.
در توضیح عمومی،
LSQ به ساختارهایی گفته می شود
که عملیات Load و Store
را در موتور Out-of-Order
دنبال می کنند
و در مدیریت وابستگی های حافظه
نقش دارند.
چرا وابستگی حافظه از وابستگی Register سخت تر است؟
در Register Dependency،
نام Registerها
در خود دستور مشخص هستند.
مثلاً CPU می داند:
R1
→
R2
اما در حافظه،
آدرس نهایی
ممکن است تا زمان اجرای محاسبه آدرس
مشخص نباشد.
بنابراین CPU ممکن است
با دو عملیات حافظه روبه رو باشد
بدون اینکه در همان لحظه بداند
آیا هر دو
به یک محل حافظه اشاره می کنند یا نه.
Memory Dependency چیست؟
وابستگی حافظه — Memory Dependency
Memory Dependency
یا «وابستگی حافظه»
زمانی وجود دارد
که ترتیب صحیح
یک عملیات حافظه
به عملیات حافظه دیگری وابسته باشد.برای مثال،
یک Load ممکن است
نیاز داشته باشد
مقدار نوشته شده
توسط Store قبلی را بخواند.
فرض کنید برنامه این ترتیب را دارد:
Store:
Memory[X] = 50
Load:
A = Memory[X]
Load باید مقدار:
50
را دریافت کند.
اگر Load بدون توجه
به Store قبلی
از نسخه قدیمی حافظه بخواند،
نتیجه برنامه نادرست خواهد شد.
Memory Alias چیست؟
اشاره چند عملیات به یک محل حافظه — Memory Alias
Memory Alias
در این Context
یعنی دو یا چند عملیات حافظه
ممکن است به همان محل حافظه
اشاره کنند.اگر CPU هنوز
آدرس هر دو عملیات را
به طور کامل نداند،
تشخیص این موضوع
دشوارتر می شود.
Memory Disambiguation چیست؟
تشخیص مستقل بودن دسترسی های حافظه — Memory Disambiguation
Memory Disambiguation
یا «تشخیص مستقل بودن دسترسی های حافظه»
سازوکاری است
که CPU با آن تلاش می کند
بفهمد آیا یک Load
به Storeهای قدیمی تر وابسته است یا خیر.هدف این است
که Loadهای مستقل
بی دلیل منتظر Storeهای قبلی نمانند.
اگر CPU همیشه صبر کند چه می شود؟
یک راه بسیار محافظه کارانه
این است که هر Load
تا مشخص شدن آدرس تمام Storeهای قبلی
صبر کند.
این روش از نظر صحت ساده است،
اما Performance را کاهش می دهد.
چون بسیاری از Loadها
واقعاً به Store قبلی
وابسته نیستند.
Speculative Load چیست؟
بارگذاری حدسی — Speculative Load
Speculative Load
یا «بارگذاری حدسی»
زمانی است
که CPU یک Load را
پیش از قطعی شدن کامل
نبود وابستگی به Storeهای قبلی
اجرا می کند.اگر پیش بینی درست باشد،
بخشی از زمان انتظار
حذف می شود.
Memory Dependency Prediction چیست؟
پیش بینی وابستگی حافظه — Memory Dependency Prediction
Memory Dependency Prediction
سازوکاری است
که پردازنده با استفاده از آن
تلاش می کند
رفتار وابستگی میان Loadها و Storeها را
پیش بینی کند.هدف این است
که عملیات مستقل
زودتر اجرا شوند،
اما وابستگی های واقعی
حفظ شوند.
Memory Order Violation چیست؟
نقض ترتیب حافظه — Memory Order Violation
اگر CPU یک Load را
زودتر اجرا کند
و بعد مشخص شود
آن Load در واقع
به Store قدیمی تری وابسته بوده،
یک:
Memory Order Violation
یا «نقض ترتیب حافظه»
رخ داده است.
Replay چیست؟
اجرای مجدد — Replay
Replay
یا «اجرای مجدد»
یعنی عملیاتی که
با فرض نادرست اجرا شده
دوباره با اطلاعات صحیح
اجرا شود.Memory Order Violation
می تواند باعث
Replay بعضی عملیات شود.
اگر CPU همیشه صبر کند،
Performance از دست می رود.
اگر بیش از حد تهاجمی
Loadها را جلو بیندازد،
احتمال Memory Order Violation
و Replay بیشتر می شود.
بنابراین طراحی مناسب:
Too Conservative
→
Lost Parallelism
Too Aggressive
→
More Replays
و معماری باید
میان این دو
تعادل ایجاد کند.
Store-to-Load Forwarding چیست؟
ارسال مستقیم داده از Store به Load — Store-to-Load Forwarding
Store-to-Load Forwarding
یا «ارسال مستقیم داده از Store به Load»
زمانی است
که Load به داده ای نیاز دارد
که یک Store قدیمی تر
در حال نوشتن آن است.CPU می تواند
در شرایط مناسب
داده را مستقیماً
از ساختار Store
به Load منتقل کند
بدون اینکه منتظر شود
Store ابتدا در Cache یا حافظه
نهایی شود.
دوباره این مثال را ببینیم:
Store:
Memory[X] = 50
Load:
A = Memory[X]
اگر مقدار 50
هنوز در Store Queue
یا ساختار مشابه موجود باشد،
CPU می تواند
همان مقدار را مستقیماً
به Load بدهد.
Store Data
→
Forward
→
Load
بنابراین نیازی نیست
داده یک مسیر رفت و برگشت کامل
تا Cache و دوباره به Load
طی کند.
آیا Store-to-Load Forwarding همیشه ممکن است؟
خیر.
موفقیت Forwarding
به عواملی مانند:
- تطابق آدرس
- اندازه Load و Store
- Alignment
- نحوه همپوشانی محدوده داده
- قوانین ریزمعماری
بستگی دارد.
Alignment چیست؟
هم ترازی حافظه — Memory Alignment
Alignment
یا «هم ترازی»
به قرار گرفتن داده
روی مرزهای آدرسی مناسب
برای اندازه یا نوع آن داده
اشاره دارد.دسترسی های Misaligned
یا «ناهم تراز»
در برخی شرایط
می توانند پیچیده تر
یا پرهزینه تر باشند.
دسترسی ناهم تراز — Misaligned Access
Misaligned Access
یا «دسترسی ناهم تراز»
زمانی رخ می دهد
که داده روی مرزی
که برای آن دسترسی مناسب است
قرار نگرفته باشد.
Store Buffer چیست؟
بافر نوشتن — Store Buffer
Store Buffer
یا «بافر نوشتن»
ساختاری است
که Storeهای انجام شده توسط CPU
می توانند موقتاً
در آن نگهداری شوند
تا نوشتن آنها
در سلسله مراتب حافظه
ادامه پیدا کند.این کار کمک می کند
CPU مجبور نباشد
برای تکمیل هر Store
تا پایان تمام مسیر حافظه
متوقف بماند.
Load Buffer چیست؟
بافر بارگذاری — Load Buffer
Load Buffer
یا «بافر بارگذاری»
ساختاری برای دنبال کردن
Loadهای در حال انجام
و وضعیت دسترسی آنها
به حافظه است.
خیر.
نام گذاری و سازمان دهی
ساختارهای Load و Store
میان ریزمعماری های مختلف
می تواند متفاوت باشد.
در منابع فنی،
برخی اصطلاحات
ممکن است به ساختارهای نزدیک
اما نه کاملاً یکسان
اشاره کنند.
بنابراین بهتر است
برای یک CPU مشخص
مستندات همان معماری بررسی شود.
Memory Ordering چیست؟
ترتیب مشاهده عملیات حافظه — Memory Ordering
Memory Ordering
یا «ترتیب مشاهده عملیات حافظه»
قوانینی است
که مشخص می کند
Loadها و Storeها
با چه ترتیبی
می توانند برای بخش های مختلف سیستم
قابل مشاهده شوند.
Program Order و Memory Order چه تفاوتی دارند؟
Program Order
یا «ترتیب برنامه»
همان ترتیبی است
که دستورها در جریان منطقی برنامه
قرار دارند.
اما CPU و Memory System
ممکن است بعضی عملیات را
برای Performance
در داخل سخت افزار
با ترتیب متفاوتی پردازش کنند.
این تغییر ترتیب
فقط زمانی مجاز است
که قوانین معماری و Memory Model
رعایت شوند.
Memory Model چیست؟
مدل حافظه — Memory Model
Memory Model
یا «مدل حافظه»
مجموعه قوانینی است
که مشخص می کند
عملیات حافظه
در یک معماری
چه ترتیب قابل مشاهده ای
برای نرم افزار و پردازنده های دیگر دارند.
Strong و Weak Memory Model چیست؟
| نوع کلی | مفهوم |
|---|---|
| Stronger Memory Ordering | محدودیت بیشتر برای تغییر ترتیب قابل مشاهده عملیات حافظه |
| Weaker Memory Ordering | آزادی بیشتر سخت افزار برای تغییر ترتیب، در چارچوب قواعد معماری |
چرا Memory Ordering در CPU چند هسته ای مهم تر می شود؟
وقتی فقط یک جریان اجرا داریم،
بسیاری از تغییرات ترتیب داخلی
برای نرم افزار قابل مشاهده نیستند.
اما در سیستم چند هسته ای،
یک Core ممکن است
داده ای را بنویسد
و Core دیگری
همان داده را بخواند.
در این شرایط
ترتیب مشاهده Storeها و Loadها
اهمیت بسیار زیادی پیدا می کند.
Memory Visibility چیست؟
قابل مشاهده شدن تغییرات حافظه — Memory Visibility
Memory Visibility
یا «قابل مشاهده شدن تغییرات حافظه»
به این موضوع اشاره دارد
که تغییر انجام شده توسط یک Thread یا Core
چه زمانی و تحت چه قوانینی
برای Thread یا Core دیگری
قابل مشاهده است.
Memory Fence چیست؟
مانع ترتیب حافظه — Memory Fence
Memory Fence
یا «مانع ترتیب حافظه»
سازوکاری است
که برای محدود کردن
جابه جایی یا مشاهده ترتیب
برخی عملیات حافظه
استفاده می شود.واژه:
Fence
در اینجا مفهوم
«مرز یا مانع»
دارد.
Memory Barrier چیست؟
مانع حافظه — Memory Barrier
Memory Barrier
اصطلاحی است
که در بسیاری از Contextها
برای سازوکارهای کنترل ترتیب حافظه
استفاده می شود.بسته به معماری،
زبان برنامه نویسی
یا سیستم عامل،
جزئیات دقیق آن
می تواند متفاوت باشد.
فرض کنید یک Thread
ابتدا داده ای را آماده می کند
و سپس یک Flag
یا «پرچم وضعیت»
را تغییر می دهد.
Write Data
→
Set Ready Flag
Thread دیگری
Flag را می خواند
تا بفهمد داده آماده است.
اگر Memory Ordering
به درستی کنترل نشود،
ممکن است مشاهده ترتیب
با انتظار برنامه نویس
یکسان نباشد.
سازوکارهای Synchronization
و Memory Ordering
برای حل چنین مسائل
ضروری هستند.
پرچم وضعیت — Flag
Flag
یا «پرچم وضعیت»
مقدار یا متغیری است
که برای نشان دادن
یک وضعیت مشخص
استفاده می شود.
Synchronization چیست؟
همگام سازی — Synchronization
Synchronization
یا «همگام سازی»
مجموعه روش هایی است
که برای هماهنگ کردن
Threadها یا پردازش های همزمان
هنگام دسترسی به داده مشترک
استفاده می شود.
Atomic Operation چیست؟
عملیات اتمی — Atomic Operation
Atomic Operation
یا «عملیات اتمی»
عملیاتی است
که از دید سایر Threadها
به صورت یک واحد تجزیه ناپذیر
مشاهده می شود.عملیات اتمی
در ساخت بسیاری از الگوریتم های
همزمان و Synchronization
اهمیت دارد.
خیر.
Atomic
درباره ویژگی
«تجزیه ناپذیر بودن مشاهده عملیات»
صحبت می کند،
نه اینکه عملیات
الزاماً سریع تر باشد.
بعضی عملیات اتمی
حتی می توانند
هزینه بیشتری نسبت به
Load یا Store ساده داشته باشند.
Memory Ordering و Cache Coherence یک چیز هستند؟
خیر.
در فصل Cache
با:
Cache Coherence یا «سازگاری داده میان Cacheها»
آشنا شدیم.
Cache Coherence
کمک می کند Coreها
نسخه های ناسازگار یک Cache Line
را معتبر تصور نکنند.
اما Memory Ordering
درباره ترتیب قابل مشاهده
عملیات حافظه است.
Cache Coherence
≠
Memory Ordering
| مفهوم | سوال اصلی |
|---|---|
| Cache Coherence | Coreها درباره مقدار یک محل حافظه چگونه هماهنگ می شوند؟ |
| Memory Ordering | عملیات مختلف حافظه با چه ترتیبی قابل مشاهده می شوند؟ |
Memory-Level Parallelism چیست؟
موازی سازی در سطح دسترسی حافظه — Memory-Level Parallelism
Memory-Level Parallelism
که به اختصار:
MLP
گفته می شود،
توانایی سیستم برای
داشتن چند درخواست حافظه
به طور همزمان
در حال پردازش است.
اگر CPU فقط بتواند
یک درخواست حافظه
را در هر لحظه مدیریت کند،
هر Cache Miss
می تواند توقف بزرگی ایجاد کند.
اما پردازنده مدرن
می تواند چند Load مستقل
را همزمان در حال انتظار
نگه دارد.
Miss A
+
Miss B
+
Miss C
→
Overlapped Memory Requests
این کار
به پنهان کردن
بخشی از Latency حافظه کمک می کند.
Outstanding Memory Request چیست؟
درخواست حافظه در انتظار پاسخ — Outstanding Memory Request
Outstanding Memory Request
یا «درخواست حافظه در انتظار پاسخ»
درخواستی است
که CPU یا زیرسیستم حافظه
صادر کرده
اما پاسخ آن
هنوز کامل نشده است.
MSHR چیست؟
ساختار دنبال کردن Cache Miss — MSHR
MSHR
مخفف:
Miss Status Holding Register
است.
ترجمه مفهومی:
«ساختار نگهداری وضعیت درخواست های Cache Miss».
MSHR به Cache
کمک می کند
درخواست های Miss در حال انتظار
را دنبال کند.
Non-Blocking Cache چیست؟
کش غیرمسدودکننده — Non-Blocking Cache
Non-Blocking Cache
یا «Cache غیرمسدودکننده»
طراحی ای است
که اجازه می دهد
در حالی که بعضی Cache Missها
منتظر پاسخ هستند،
درخواست های دیگر نیز
تا حد مشخصی
پردازش شوند.
Hit Under Miss چیست؟
پاسخ به Hit در زمان وجود Miss — Hit Under Miss
Hit Under Miss
یعنی Cache
بتواند در حالی که
یک درخواست Miss
منتظر تکمیل است،
به درخواست دیگری
که Hit شده
پاسخ دهد.
Miss Under Miss چیست؟
مدیریت چند Miss همزمان — Miss Under Miss
Miss Under Miss
یعنی سیستم
بتواند بیش از یک Cache Miss
را همزمان
در حال پردازش نگه دارد.این قابلیت
یکی از عناصر مهم
Memory-Level Parallelism است.
Memory Wall چیست؟
دیوار حافظه — Memory Wall
Memory Wall
یا «دیوار حافظه»
اصطلاحی برای شکاف
میان سرعت رشد توان پردازشی CPU
و سرعت دسترسی به حافظه
است.وقتی CPU بسیار سریع باشد
اما داده به اندازه کافی سریع
به آن نرسد،
Performance می تواند
توسط زیرسیستم حافظه محدود شود.
موتور اجرای قدرتمند،
ROB بزرگ،
تعداد زیاد Execution Unit
و فرکانس بالا
زمانی مفید هستند
که داده کافی
برای تغذیه آنها وجود داشته باشد.
اگر CPU
مرتباً منتظر حافظه بماند:
More Execution Resources
≠
More Useful Work
به همین دلیل
Cache،
Prefetching،
MLP،
Load/Store Queue
و Memory Controller
بخش های حیاتی Performance CPU هستند.
Prefetching چه ارتباطی با Load دارد؟
اگر CPU بتواند
پیش از اجرای یک Load
حدس بزند
چه داده ای لازم خواهد شد،
می تواند آن داده را
زودتر به Cache نزدیک کند.
در این حالت:
Future Load
→
Data Already Closer
→
Lower Effective Stall
بنابراین Prefetcher
در کنار موتور Load/Store
برای کاهش زمان انتظار حافظه
نقش مهمی دارد.
Load Port و Store Port چیست؟
مسیرهای اجرایی عملیات حافظه — Load / Store Ports
در تحلیل بعضی ریزمعماری ها،
از Load Port
و Store Port
برای توصیف ظرفیت
مسیرهای داخلی اجرای عملیات حافظه
استفاده می شود.
تعداد و توان این مسیرها
می تواند روی تعداد Load و Store
قابل پردازش در هر Cycle
اثر بگذارد.
Port Pressure چیست؟
فشار روی مسیرهای اجرایی — Port Pressure
Port Pressure
یا «فشار روی مسیرهای اجرایی»
زمانی ایجاد می شود
که تعداد عملیات نیازمند
یک مجموعه محدود از منابع اجرایی
زیاد باشد.حتی اگر سایر بخش های CPU
ظرفیت خالی داشته باشند،
یک Port خاص
می تواند Bottleneck شود.
چه چیزهایی می توانند مسیر حافظه CPU را محدود کنند؟
- TLB Miss زیاد
- Cache Miss زیاد
- Memory Dependency زیاد
- Store Forwarding ناموفق
- Memory Order Replay
- ظرفیت محدود Load Queue
- ظرفیت محدود Store Queue
- محدودیت Load / Store Port
- Memory Bandwidth ناکافی
- Memory Latency بالا
- Prefetch نامناسب
- Memory-Level Parallelism کم
جدول خلاصه ساختارهای مهم Load و Store
| مفهوم | معنی فارسی | کار اصلی |
|---|---|---|
| Load | بارگذاری | دریافت داده از حافظه |
| Store | ذخیره | نوشتن داده در حافظه |
| AGU | واحد تولید آدرس | محاسبه آدرس عملیات حافظه |
| Load Queue | صف بارگذاری | دنبال کردن Loadهای در حال پردازش |
| Store Queue | صف ذخیره | دنبال کردن Storeهای در حال پردازش |
| Memory Disambiguation | تشخیص وابستگی حافظه | بررسی مستقل بودن Load و Store |
| Store-to-Load Forwarding | ارسال مستقیم داده Store به Load | جلوگیری از انتظار غیرضروری برای نوشتن کامل داده |
| Memory Fence | مانع ترتیب حافظه | کنترل ترتیب مشاهده عملیات حافظه |
| MSHR | ساختار پیگیری Cache Miss | دنبال کردن درخواست های Miss در حال انتظار |
| MLP | موازی سازی سطح حافظه | مدیریت چند درخواست حافظه همزمان |
این عبارت ساده
می تواند چندین وضعیت متفاوت را پنهان کند.
CPU ممکن است منتظر:
- ترجمه TLB،
- پاسخ Cache،
- حل Memory Dependency،
- آماده شدن Store Forwarding،
- پاسخ RAM،
- یا آزاد شدن منابع Load/Store Queue باشد.
بنابراین اصطلاح:
Memory Stall یا «توقف ناشی از حافظه»
می تواند دلایل مختلفی داشته باشد.
توقف ناشی از حافظه — Memory Stall
Memory Stall
یا «توقف ناشی از حافظه»
زمانی است
که پیشروی دستورها
به دلیل آماده نبودن
داده یا منابع مرتبط با حافظه
محدود می شود.
- فرض اینکه Load فقط یک خواندن ساده از RAM است.
- فرض اینکه Store بلافاصله مستقیماً در RAM نوشته می شود.
- نادیده گرفتن AGU و محاسبه آدرس.
- فرض اینکه آدرس تمام عملیات حافظه از ابتدا معلوم است.
- یکی دانستن وابستگی Register و Memory Dependency.
- فرض اینکه CPU همیشه Load را بعد از تمام Storeهای قبلی اجرا می کند.
- فرض اینکه Memory Disambiguation بدون خطا است.
- نادیده گرفتن Memory Order Violation و Replay.
- فرض اینکه Store-to-Load Forwarding همیشه انجام می شود.
- نادیده گرفتن Alignment.
- یکی دانستن Cache Coherence و Memory Ordering.
- فرض اینکه Memory Fence فقط یک دستور کندکننده است و کاربرد دیگری ندارد.
- فرض اینکه Atomic یعنی سریع تر.
- نادیده گرفتن Memory-Level Parallelism.
- فرض اینکه یک Cache Miss همیشه کل CPU را متوقف می کند.
- نادیده گرفتن محدودیت Load/Store Queue.
- نادیده گرفتن Port Pressure.
سوالات متداول درباره Load، Store و وابستگی حافظه
Load چیست؟
عملیاتی است
که داده را از حافظه
برای استفاده CPU دریافت می کند.
Store چیست؟
عملیاتی است
که داده تولید شده توسط CPU
را برای نوشتن در حافظه
ارسال می کند.
AGU چیست؟
Address Generation Unit
یا واحد تولید آدرس،
بخشی از CPU برای محاسبه
آدرس عملیات حافظه است.
Memory Dependency چیست؟
وابستگی ای است
که ترتیب صحیح
یک عملیات حافظه
به عملیات حافظه دیگری
وابسته باشد.
Memory Disambiguation چیست؟
سازوکاری برای تشخیص
اینکه آیا Load
به Storeهای قبلی
وابسته است یا خیر.
Store-to-Load Forwarding چیست؟
انتقال مستقیم داده
از Store قدیمی تر
به Load وابسته
بدون انتظار برای نوشتن کامل
در Cache یا حافظه است.
Memory Order Violation چیست؟
زمانی رخ می دهد
که Load زودتر اجرا شده باشد
اما بعداً مشخص شود
به Store قدیمی تری وابسته بوده است.
Replay چیست؟
اجرای مجدد عملیات
پس از مشخص شدن
فرض یا ترتیب نادرست قبلی است.
Memory Fence چیست؟
سازوکاری برای محدود کردن
تغییر ترتیب قابل مشاهده
برخی عملیات حافظه است.
Cache Coherence و Memory Ordering یکی هستند؟
خیر.
Coherence درباره هماهنگی مقدار داده
میان Cacheها است،
اما Ordering درباره ترتیب مشاهده
عملیات حافظه است.
MLP چیست؟
Memory-Level Parallelism
یا موازی سازی در سطح حافظه،
توانایی داشتن چند درخواست حافظه
به طور همزمان است.
MSHR چیست؟
ساختاری برای دنبال کردن
Cache Missهای در حال انتظار است.
آیا Cache Miss همیشه CPU را متوقف می کند؟
خیر.
CPU می تواند
عملیات مستقل دیگری انجام دهد
یا چند درخواست حافظه
را همزمان مدیریت کند.
چرا Alignment مهم است؟
چون دسترسی ناهم تراز
می تواند بعضی عملیات حافظه
یا Store Forwarding
را پیچیده تر کند.
واژه های جدید این فصل برای واژه نامه نهایی کتاب
- Load: بارگذاری داده از حافظه.
- Store: ذخیره داده در حافظه.
- Memory Operand: عملوندی که در حافظه قرار دارد.
- Effective Address: آدرس موثر محاسبه شده برای یک عملیات حافظه.
- Base Address: آدرس پایه.
- Index: شاخص مورد استفاده در محاسبه آدرس.
- Offset: جابجایی افزوده شده به آدرس.
- AGU: Address Generation Unit یا واحد تولید آدرس.
- Load Queue: صف دنبال کننده Loadهای در حال پردازش.
- Store Queue: صف دنبال کننده Storeهای در حال پردازش.
- LSQ: Load/Store Queue؛ ساختار مدیریت عملیات حافظه.
- Memory Dependency: وابستگی ترتیب میان عملیات حافظه.
- Memory Alias: اشاره چند عملیات به یک محل حافظه.
- Memory Disambiguation: تشخیص مستقل یا وابسته بودن دسترسی های حافظه.
- Speculative Load: اجرای حدسی Load پیش از قطعی شدن نبود وابستگی.
- Memory Dependency Prediction: پیش بینی وابستگی میان Load و Store.
- Memory Order Violation: نقض ترتیب صحیح دسترسی های حافظه.
- Replay: اجرای مجدد عملیات.
- Store-to-Load Forwarding: انتقال مستقیم داده Store به Load.
- Alignment: هم ترازی داده در حافظه.
- Misaligned Access: دسترسی ناهم تراز به حافظه.
- Store Buffer: بافر موقت Storeها.
- Load Buffer: ساختار دنبال کننده Loadها.
- Memory Ordering: قوانین ترتیب مشاهده عملیات حافظه.
- Program Order: ترتیب منطقی دستورها در برنامه.
- Memory Model: مدل تعریف کننده رفتار قابل مشاهده عملیات حافظه.
- Memory Visibility: زمان و نحوه قابل مشاهده شدن تغییرات حافظه برای Threadهای دیگر.
- Memory Fence: مانع ترتیب حافظه.
- Memory Barrier: سازوکار محدود کردن جابه جایی عملیات حافظه.
- Flag: متغیر یا مقدار نشان دهنده وضعیت.
- Synchronization: همگام سازی Threadها یا عملیات همزمان.
- Atomic Operation: عملیات تجزیه ناپذیر از دید سایر Threadها.
- MLP: Memory-Level Parallelism یا موازی سازی در سطح حافظه.
- Outstanding Memory Request: درخواست حافظه ای که پاسخ آن هنوز کامل نشده است.
- MSHR: ساختار نگهداری وضعیت Cache Missهای در حال انتظار.
- Non-Blocking Cache: Cacheای که هنگام وجود Miss می تواند درخواست های دیگری را نیز پردازش کند.
- Hit Under Miss: پاسخ به Cache Hit در زمان انتظار یک Miss.
- Miss Under Miss: مدیریت چند Cache Miss همزمان.
- Memory Wall: شکاف میان سرعت پردازنده و سرعت دسترسی به حافظه.
- Load Port: مسیر اجرایی مرتبط با Load.
- Store Port: مسیر اجرایی مرتبط با Store.
- Port Pressure: فشار ناشی از رقابت عملیات برای یک منبع اجرایی محدود.
- Memory Stall: توقف یا محدودیت ناشی از آماده نبودن داده یا منابع حافظه.
خلاصه فصل
عملیات حافظه
یکی از پیچیده ترین بخش های
اجرای Out-of-Order هستند.
CPU باید ابتدا
آدرس را محاسبه کند،
سپس بررسی کند
آیا Load یا Store
به عملیات قدیمی تری وابسته است یا نه.
Load / Store
→
Address Generation
→
Memory Dependency Check
→
TLB
→
Cache
→
Memory System
Memory Disambiguation
تلاش می کند
Loadهای مستقل را
زودتر اجرا کند.
Store-to-Load Forwarding
می تواند داده را
مستقیماً از Store قدیمی تر
به Load وابسته بدهد.
MLP و Non-Blocking Cache
نیز کمک می کنند
چند درخواست حافظه
همزمان در حال انجام باشند.
مهم ترین قانون این فصل:
CPU مدرن فقط داده را از حافظه نمی خواند؛
دائماً پیش بینی می کند، وابستگی ها را بررسی می کند،
درخواست ها را موازی می کند
و تلاش می کند Latency حافظه را پنهان کند.
داده وارد CPU شده است؛ حالا کدام بخش واقعاً محاسبه را انجام می دهد؟
واحدهای اجرایی CPU چیستند؟ از ALU و FPU تا SIMD و پردازش برداری
وقتی می گوییم پردازنده یک محاسبه را انجام می دهد،
در واقع همه بخش های CPU مستقیماً آن محاسبه را انجام نمی دهند.
پس از واکشی، رمزگشایی، نام گذاری مجدد، زمان بندی
و آماده شدن داده ها،
عملیات باید به یک
Execution Unit یا «واحد اجرایی»
مناسب فرستاده شود.
بعضی واحدهای اجرایی
برای محاسبات عدد صحیح ساخته شده اند،
بعضی برای اعداد اعشاری،
بعضی عملیات منطقی را انجام می دهند
و بعضی می توانند
تعداد زیادی داده را با یک دستور پردازش کنند.
به همین دلیل دو CPU
حتی با تعداد هسته و فرکانس مشابه
ممکن است در نرم افزارهای مختلف
عملکرد یکسانی نداشته باشند.
Instruction
→
Scheduler
→
Execution Unit
→
Result
در این فصل چه چیزهایی یاد می گیریم؟
- Execution Unit چیست.
- ALU چیست و چه عملیاتی انجام می دهد.
- Integer Operation چیست.
- FPU چیست.
- Floating-Point Number چیست.
- SIMD چیست.
- Scalar و Vector چه تفاوتی دارند.
- Vector Unit چیست.
- Vector Width چیست.
- SSE چیست.
- AVX چیست.
- AVX2 چیست.
- AVX-512 چیست.
- NEON چیست.
- FMA چیست.
- Throughput و Latency در واحدهای اجرایی چه معنایی دارند.
- Execution Port چیست.
- Port Pressure چیست.
- چرا پشتیبانی CPU از یک Instruction Set به تنهایی تضمین کننده سرعت بالا نیست.
Execution Unit چیست؟
واحد اجرایی — Execution Unit
Execution Unit
یا «واحد اجرایی»
بخشی از موتور پردازنده است
که یک نوع مشخص از عملیات
یا مجموعه ای از عملیات را
واقعاً اجرا می کند.برای مثال،
عملیات جمع عدد صحیح،
ضرب اعشاری،
مقایسه،
عملیات منطقی
یا محاسبات برداری
ممکن است توسط واحدهای اجرایی متفاوتی
انجام شوند.
ALU چیست؟
واحد حساب و منطق — Arithmetic Logic Unit
ALU
مخفف:
Arithmetic Logic Unit
و به معنی
«واحد حساب و منطق»
است.
ALU یکی از واحدهای بنیادی پردازنده است
و عملیات هایی مانند
جمع و تفریق عدد صحیح،
مقایسه
و بسیاری از عملیات منطقی
را انجام می دهد.
Integer Operation چیست؟
عملیات عدد صحیح — Integer Operation
Integer
به معنی «عدد صحیح» است.اعدادی مانند:
-8, 0, 17, 250
نمونه عدد صحیح هستند.
بنابراین
Integer Operation
یعنی عملیاتی که
روی اعداد صحیح انجام می شود.
Logical Operation چیست؟
عملیات منطقی — Logical Operation
Logical Operation
یا «عملیات منطقی»
به عملیات هایی گفته می شود
که روی بیت ها یا مقادیر منطقی
انجام می شوند.نمونه های معروف:
AND
/
OR
/
XOR
/
NOT
این عملیات در برنامه نویسی،
سیستم عامل،
رمزنگاری،
پردازش داده
و بسیاری از بخش های دیگر
کاربرد دارند.
FPU چیست؟
واحد محاسبات ممیز شناور — Floating-Point Unit
FPU
مخفف:
Floating-Point Unit
و به معنی
«واحد محاسبات ممیز شناور»
است.
این واحد برای انجام
محاسبات عددی روی اعدادی
که می توانند بخش کسری داشته باشند
اهمیت دارد.
Floating-Point Number یعنی چه؟
عدد ممیز شناور — Floating-Point Number
Floating-Point Number
یا «عدد ممیز شناور»
روشی رایج برای نمایش
اعداد حقیقی در کامپیوتر است.برای مثال:
3.14159
0.125
-27.75
محاسبات مهندسی،
علمی،
گرافیکی،
شبیه سازی
و بسیاری از الگوریتم های پردازش تصویر
به عملیات Floating Point وابستگی زیادی دارند.
| نوع محاسبه | نمونه | کاربردهای رایج |
|---|---|---|
| Integer | 125 + 300 | منطق برنامه، شمارنده ها، آدرس ها، بسیاری از عملیات عمومی |
| Floating Point | 3.14 × 7.82 | مهندسی، گرافیک، شبیه سازی، محاسبات علمی و عددی |
Scalar Processing چیست؟
پردازش اسکالر یا تک مقداری — Scalar Processing
Scalar
در اینجا به یک مقدار منفرد اشاره دارد.در یک عملیات Scalar،
دستور روی یک مقدار
یا یک جفت مقدار مشخص
کار می کند.
A + B
→
C
Vector Processing چیست؟
پردازش برداری — Vector Processing
Vector Processing
یا «پردازش برداری»
یعنی انجام یک عملیات مشابه
روی مجموعه ای از داده ها
به شکل گروهی.برای مثال به جای اینکه:
A1 + B1
A2 + B2
A3 + B3
A4 + B4
کاملاً جداگانه پردازش شوند،
سخت افزار برداری می تواند
چند عنصر را در یک عملیات برداری
پردازش کند.
SIMD چیست؟
یک دستور، چند داده — Single Instruction Multiple Data
SIMD
مخفف:
Single Instruction, Multiple Data
و مفهوم آن:
«یک دستور برای پردازش چند داده»
است.
SIMD اجازه می دهد
یک عملیات مشابه
روی چند عنصر داده
به صورت موازی انجام شود.
فرض کنید باید
چهار جفت عدد را با هم جمع کنیم.
روش مفهومی Scalar:
A1 + B1
→
C1
A2 + B2
→
C2
A3 + B3
→
C3
A4 + B4
→
C4
اما در یک مثال ساده SIMD:
[A1 A2 A3 A4]
+
[B1 B2 B3 B4]
→
[C1 C2 C3 C4]
بنابراین یک دستور
می تواند روی چند عنصر داده
کار کند.
این تعریف دقیق نیست.
در SIMD،
اصل مهم این است که
یک دستور واحد روی چند عنصر داده
اعمال می شود.
این موضوع با اجرای همزمان
چند دستور مستقل توسط موتور Superscalar
یک مفهوم یکسان نیست.
Vector Unit چیست؟
واحد برداری — Vector Unit
Vector Unit
یا «واحد برداری»
بخشی از پردازنده است
که برای اجرای عملیات
روی چند عنصر داده
طراحی شده است.چنین واحدهایی
در پردازش تصویر،
صوت،
ویدئو،
محاسبات علمی،
برخی الگوریتم های هوش مصنوعی،
فشرده سازی
و رمزنگاری
بسیار مهم هستند.
Vector Width چیست؟
پهنای بردار — Vector Width
Vector Width
یا «پهنای بردار»
تعداد بیت هایی را نشان می دهد
که یک دستور یا مسیر برداری
می تواند در یک بردار
پوشش دهد.نمونه های متداول:
128-bit
256-bit
512-bit
پاسخ به نوع داده بستگی دارد.
برای مثال،
اگر هر عنصر
یک عدد 32 بیتی باشد:
256 ÷ 32 = 8
بنابراین یک بردار 256 بیتی
می تواند هشت عنصر 32 بیتی
را در خود جای دهد.
اما اگر هر عنصر 64 بیتی باشد:
256 ÷ 64 = 4
پس همان پهنای 256 بیتی
چهار عنصر 64 بیتی را پوشش می دهد.
SSE چیست؟
Streaming SIMD Extensions — توسعه های SIMD برای پردازش گروهی داده
SSE
مخفف:
Streaming SIMD Extensions
است.
SSE خانواده ای از
توسعه های مجموعه دستورهای x86
برای انجام عملیات SIMD است.
نسل های مختلف SSE
در طول زمان
قابلیت های بیشتری
به پردازنده های x86 اضافه کردند.
AVX چیست؟
توسعه های برداری پیشرفته — Advanced Vector Extensions
AVX
مخفف:
Advanced Vector Extensions
و به معنی
«توسعه های برداری پیشرفته»
است.
AVX مجموعه ای از قابلیت های برداری
در معماری x86 است
که امکان انجام عملیات SIMD
روی داده های بیشتری را فراهم می کند.
AVX2 چیست؟
نسل توسعه یافته AVX — AVX2
AVX2
توسعه ای مهم بر AVX است
که قابلیت های SIMD
برای عملیات عدد صحیح
و مجموعه ای از عملیات دیگر
را گسترش داد.در بسیاری از نرم افزارهای مدرن x86،
AVX2 می تواند
برای پردازش سریع تر
حجم زیادی از داده
مورد استفاده قرار گیرد.
AVX-512 چیست؟
خانواده دستورهای برداری AVX-512
AVX-512
خانواده ای از
توسعه های برداری x86 است
که از Registerهای برداری
تا پهنای 512 بیت
و قابلیت های پیشرفته دیگری
استفاده می کند.AVX-512 یک قابلیت واحد و ساده نیست؛
خانواده ای از Extensionهای مختلف است
و پشتیبانی دقیق آن
بین پردازنده ها متفاوت است.
خیر.
پهنای برداری بیشتر
به تنهایی تضمین نمی کند
برنامه دو برابر سریع تر شود.
عملکرد واقعی
به مواردی مانند:
- نوع الگوریتم،
- قابلیت Vectorization،
- پهنای واقعی واحدهای اجرایی،
- تعداد Execution Portها،
- Throughput دستور،
- Memory Bandwidth،
- Cache،
- فرکانس CPU،
- توان مصرفی و محدودیت حرارتی
بستگی دارد.
NEON چیست؟
فناوری SIMD در معماری Arm — NEON
NEON
نام فناوری SIMD
در بسیاری از پردازنده های مبتنی بر Arm است.NEON برای پردازش موازی داده ها
در کاربردهایی مانند:
- صوت،
- ویدئو،
- تصویر،
- پردازش سیگنال،
- محاسبات چندرسانه ای،
- و برخی محاسبات عددی
استفاده می شود.
SSE و AVX
با اکوسیستم x86 مرتبط هستند،
در حالی که NEON
بخشی از اکوسیستم Arm است.
وجود یک مجموعه دستور
فقط مشخص می کند
CPU چه نوع دستورهایی را می تواند اجرا کند.
سرعت واقعی
به نحوه پیاده سازی آن دستورها
در Microarchitecture
یا «ریزمعماری»
بستگی دارد.
ISA چیست؟
معماری مجموعه دستورها — Instruction Set Architecture
ISA
مخفف:
Instruction Set Architecture
و به معنی
«معماری مجموعه دستورها»
است.
ISA رابط تعریف شده
میان نرم افزار و پردازنده است
و مشخص می کند
پردازنده از دید نرم افزار
چه دستورها، Registerها
و رفتارهای معماری دارد.
Microarchitecture چیست؟
ریزمعماری — Microarchitecture
Microarchitecture
یا «ریزمعماری»
نحوه پیاده سازی داخلی
یک معماری مجموعه دستورها
در یک پردازنده مشخص است.دو CPU می توانند
ISA مشابهی داشته باشند
اما به دلیل تفاوت در ریزمعماری،
Performance،
مصرف انرژی
و رفتار اجرایی متفاوتی داشته باشند.
FMA چیست؟
ضرب و جمع ترکیبی — Fused Multiply-Add
FMA
مخفف:
Fused Multiply-Add
است و می توان آن را
«عملیات ترکیبی ضرب و جمع»
ترجمه کرد.
به شکل مفهومی:
A × B + C
در FMA،
ضرب و جمع
در قالب یک عملیات ترکیبی
انجام می شوند.
این قابلیت
در بسیاری از محاسبات علمی،
برداری،
گرافیکی
و عددی اهمیت دارد.
در محاسبات Floating Point،
FMA می تواند
ضرب و جمع را
با یک مرحله گرد کردن نهایی
انجام دهد.
بنابراین علاوه بر Performance،
در برخی محاسبات
می تواند رفتار عددی دقیق تری
نسبت به اجرای کاملاً جداگانه
ضرب و سپس جمع داشته باشد.
Latency یک دستور چیست؟
تاخیر اجرای دستور — Instruction Latency
Latency
یا «تاخیر»
در این Context
مدت زمانی است
که از شروع اجرای یک عملیات
تا آماده شدن نتیجه آن
طول می کشد.این زمان
معمولاً در تحلیل ریزمعماری
با تعداد Cycle بیان می شود.
Throughput چیست؟
نرخ عبور عملیات — Throughput
Throughput
یا «نرخ عبور»
نشان می دهد
واحد اجرایی یا CPU
با چه نرخی
می تواند عملیات جدید
را بپذیرد یا تکمیل کند.Throughput و Latency
یک مفهوم نیستند.
فرض کنید یک واحد اجرایی Pipeline شده
برای تکمیل هر عملیات
چهار Cycle زمان نیاز داشته باشد.
این الزاماً به این معنی نیست
که باید چهار Cycle صبر کند
تا عملیات بعدی را شروع کند.
Cycle 1:
Operation A enters
Cycle 2:
Operation B enters
Cycle 3:
Operation C enters
Cycle 4:
Operation D enters
بنابراین ممکن است:
Latency = 4 cycles
اما نرخ پذیرش عملیات مستقل
بسیار بیشتر باشد.
چرا Latency در زنجیره وابسته مهم می شود؟
فرض کنید:
B depends on A
C depends on B
D depends on C
اگر هر عملیات
برای تولید نتیجه
چند Cycle زمان نیاز داشته باشد،
دستور بعدی نمی تواند
پیش از آماده شدن نتیجه قبلی
ادامه پیدا کند.
به این ساختار:
Dependency Chain یا «زنجیره وابستگی»
گفته می شود.
زنجیره وابستگی — Dependency Chain
Dependency Chain
یا «زنجیره وابستگی»
مجموعه ای از عملیات است
که هر عملیات
برای شروع یا تکمیل صحیح خود
به نتیجه عملیات قبلی نیاز دارد.
اگر تعداد زیادی عملیات مستقل وجود داشته باشد،
CPU می تواند آنها را
روی واحدهای اجرایی مختلف
یا مراحل مختلف Pipeline
پخش کند.
Independent Work
→
Better Unit Utilization
→
Higher Throughput
اما اگر همه عملیات
در یک زنجیره وابستگی طولانی باشند،
Latency هر عملیات
اهمیت بیشتری پیدا می کند.
Execution Port چیست؟
مسیر ارسال عملیات به منابع اجرایی — Execution Port
Execution Port
یا «مسیر اجرایی»
در بسیاری از ریزمعماری ها
مسیری است که عملیات
از طریق آن
به واحدهای اجرایی مشخص
دسترسی پیدا می کند.یک Port ممکن است
به یک یا چند نوع
واحد اجرایی متصل باشد.
Port Pressure چیست؟
فشار روی مسیر اجرایی — Port Pressure
Port Pressure
یا «فشار روی مسیر اجرایی»
زمانی ایجاد می شود
که تعداد زیادی عملیات
برای استفاده از تعداد محدودی
Execution Port رقابت کنند.در چنین شرایطی
حتی اگر بخش های دیگر CPU
ظرفیت خالی داشته باشند،
همان Port یا واحد اجرایی
می تواند به
Bottleneck یا «گلوگاه»
تبدیل شود.
گلوگاه — Bottleneck
Bottleneck
یا «گلوگاه»
بخشی از سیستم است
که محدودیت آن
سرعت کل فرایند را
محدود می کند.گلوگاه می تواند
CPU، Cache، RAM، Storage،
GPU، شبکه
یا حتی یک واحد اجرایی خاص
داخل CPU باشد.
Vectorization چیست؟
برداری سازی — Vectorization
Vectorization
یا «برداری سازی»
فرایندی است
که در آن محاسبات مناسب
از شکل تک مقداری
به عملیات برداری تبدیل می شوند
تا بتوان از SIMD استفاده کرد.این تبدیل ممکن است
توسط برنامه نویس،
Compiler
یا ترکیبی از هر دو
انجام شود.
Auto-Vectorization چیست؟
برداری سازی خودکار — Auto-Vectorization
Auto-Vectorization
یا «برداری سازی خودکار»
زمانی است که Compiler
تشخیص می دهد
بخشی از کد را می توان
با دستورهای SIMD
اجرا کرد
و به صورت خودکار
کد برداری تولید می کند.
خیر.
برخی الگوریتم ها
ساختار بسیار مناسبی برای SIMD دارند،
اما برخی دیگر
وابستگی های داده ای،
Branchهای زیاد
یا الگوهای حافظه نامناسب دارند.
بنابراین قابلیت Vectorization
به ماهیت الگوریتم
بستگی دارد.
SIMD در چه کارهایی استفاده می شود؟
- پردازش تصویر و فیلترهای تصویری
- تبدیل و پردازش ویدئو
- پردازش صوت
- فشرده سازی و Decompression
- رمزنگاری و Hashing در الگوریتم های مناسب
- محاسبات علمی
- شبیه سازی های عددی
- پردازش سیگنال
- برخی محاسبات هوش مصنوعی
- محاسبات سه بعدی و هندسی
- برخی عملیات CAD و مهندسی
- تحلیل داده
- کتابخانه های ریاضی
بازکردن داده فشرده — Decompression
Decompression
یا «بازکردن داده فشرده»
فرایند تبدیل داده فشرده شده
به شکل قابل استفاده یا اصلی آن است.
تابع درهم سازی — Hash
Hash
یا «درهم سازی»
در علوم کامپیوتر
به فرایندی گفته می شود
که داده ورودی
توسط یک تابع مشخص
به خروجی با ساختار تعریف شده
تبدیل می شود.Hash در زمینه هایی مانند
بررسی صحت داده،
ساختارهای داده،
امنیت
و رمزنگاری
کاربردهای مختلفی دارد.
اگر CPU از AVX2 پشتیبانی کند، آیا همه برنامه ها از آن استفاده می کنند؟
خیر.
برای استفاده از یک قابلیت SIMD،
نرم افزار باید
دستور مناسب تولید کند.
این کار می تواند
از طریق Compiler،
کتابخانه های بهینه شده
یا کد اختصاصی برنامه
انجام شود.
بنابراین:
Hardware Support
+
Software Support
=
Useful Acceleration
دو CPU ممکن است
هر دو از AVX2 پشتیبانی کنند،
اما Performance آنها
در یک Workload برداری
متفاوت باشد.
علت می تواند تفاوت در:
- تعداد واحدهای برداری،
- پهنای مسیرهای اجرایی،
- Throughput،
- Latency،
- فرکانس،
- Cache،
- Memory Bandwidth،
- Front-End،
- Scheduler،
- و محدودیت توان و دما
باشد.
Workload چیست؟
بار کاری — Workload
Workload
یا «بار کاری»
مجموعه کاری است
که سیستم در یک سناریوی مشخص
باید انجام دهد.برای مثال:
رندر سه بعدی،
اجرای بازی،
کامپایل نرم افزار،
تحلیل داده،
فشرده سازی فایل،
اجرای ماشین مجازی
یا پردازش ویدئو
Workloadهای متفاوتی هستند.
یک پردازنده ممکن است
در اجرای تک رشته ای
بسیار قوی باشد،
پردازنده دیگری
هسته های بیشتری داشته باشد
و مدل دیگری
در محاسبات برداری خاص
عملکرد بهتری نشان دهد.
بنابراین انتخاب CPU
برای کامپیوتر رومیزی،
لپ تاپ،
ورک استیشن،
سرور
یا سیستم مهندسی
باید بر اساس نوع Workload
انجام شود.
SIMD با Multi-Core چه تفاوتی دارد؟
| روش | نوع موازی سازی | ایده اصلی |
|---|---|---|
| SIMD | موازی سازی داده | یک دستور روی چند عنصر داده |
| Multi-Core | موازی سازی در سطح Core | چند هسته می توانند جریان های کاری مختلف را اجرا کنند |
| SMT | چند رشته سخت افزاری روی یک Core | استفاده بهتر از منابع یک Core با چند جریان دستور |
آیا این روش های موازی سازی می توانند همزمان استفاده شوند؟
بله.
یک نرم افزار بهینه
ممکن است همزمان
از چند سطح Parallelism
یا «موازی سازی»
استفاده کند.
Multiple Cores
→
Multiple Threads
→
SIMD Inside Each Thread
→
Multiple Execution Units
بنابراین Performance نهایی
می تواند حاصل همکاری
چند سطح متفاوت
از موازی سازی باشد.
اگر CPU SIMD دارد، چرا GPU لازم است؟
CPUهای مدرن
توانایی پردازش برداری قابل توجهی دارند،
اما فلسفه طراحی CPU و GPU
یکسان نیست.
CPU معمولاً برای:
- Latency پایین،
- کنترل پیچیده،
- Branchهای متعدد،
- اجرای عمومی،
- و Performance قوی روی جریان های محدودتر دستور
طراحی شده است.
GPU معمولاً
منابع بسیار بیشتری
برای اجرای موازی حجم عظیمی
از عملیات مناسب
در اختیار دارد.
| ویژگی کلی | CPU | GPU |
|---|---|---|
| تمرکز طراحی | اجرای عمومی و کنترل پیچیده با Latency پایین | Throughput بسیار بالا در محاسبات موازی مناسب |
| تعداد منابع محاسباتی | کمتر اما قدرتمندتر و انعطاف پذیرتر | تعداد بسیار بیشتری منابع محاسباتی ساده تر |
| Branch پیچیده | معمولاً مناسب تر | بسته به نوع الگوریتم می تواند هزینه بیشتری داشته باشد |
| موازی سازی انبوه داده | محدودتر | یکی از نقاط قوت اصلی |
چرا محاسبات برداری سنگین می توانند مصرف برق CPU را بالا ببرند؟
فعال شدن تعداد زیادی
مدار محاسباتی در واحدهای برداری
می تواند مصرف توان
و تولید گرما را افزایش دهد.
به همین دلیل
رفتار فرکانسی CPU
هنگام اجرای Workloadهای برداری سنگین
الزاماً با Workloadهای سبک
یکسان نیست.
پردازنده باید
محدودیت های توان،
جریان الکتریکی
و دما را رعایت کند.
بنابراین نوع دستورهایی
که در حال اجرا هستند
می تواند روی رفتار
فرکانس واقعی CPU اثر بگذارد.
نتیجه مهم:
GHz به تنهایی نمی گوید
CPU در یک Workload برداری سنگین
چه مقدار کار واقعی انجام می دهد.
جدول خلاصه مفاهیم واحدهای اجرایی
| مفهوم | معنی فارسی | وظیفه یا مفهوم اصلی |
|---|---|---|
| Execution Unit | واحد اجرایی | انجام واقعی عملیات |
| ALU | واحد حساب و منطق | عملیات عدد صحیح و منطقی |
| FPU | واحد ممیز شناور | محاسبات Floating Point |
| SIMD | یک دستور، چند داده | اجرای یک عملیات روی چند عنصر داده |
| Vector Unit | واحد برداری | اجرای عملیات برداری |
| FMA | ضرب و جمع ترکیبی | انجام عملیات A × B + C به شکل ترکیبی |
| Latency | تاخیر | زمان لازم تا آماده شدن نتیجه عملیات |
| Throughput | نرخ عبور | میزان عملیات قابل پردازش در واحد زمان |
| Execution Port | مسیر اجرایی | مسیر دسترسی عملیات به منابع اجرایی |
| Vectorization | برداری سازی | تبدیل محاسبات مناسب به عملیات SIMD |
- فرض اینکه همه محاسبات CPU توسط یک واحد واحد انجام می شوند.
- یکی دانستن ALU و FPU.
- فرض اینکه Floating Point فقط برای اعداد اعشاری ساده کاربرد دارد.
- یکی دانستن SIMD و Multi-Core.
- فرض اینکه Vector Width بیشتر همیشه Performance بیشتری ایجاد می کند.
- فرض اینکه AVX-512 همیشه دو برابر AVX2 سریع است.
- فرض اینکه وجود AVX2 یعنی همه نرم افزارها از آن استفاده می کنند.
- یکی دانستن ISA و Microarchitecture.
- یکی دانستن Latency و Throughput.
- نادیده گرفتن Dependency Chain.
- نادیده گرفتن Execution Port و Port Pressure.
- فرض اینکه همه الگوریتم ها قابل Vectorization هستند.
- مقایسه CPUها فقط بر اساس GHz.
- نادیده گرفتن Memory Bandwidth در محاسبات برداری.
- فرض اینکه CPU SIMD می تواند در همه کاربردها جای GPU را بگیرد.
سوالات متداول درباره ALU، FPU، SIMD و واحدهای برداری
ALU چیست؟
Arithmetic Logic Unit
یا «واحد حساب و منطق»
بخشی از CPU است
که بسیاری از عملیات عدد صحیح
و منطقی را انجام می دهد.
FPU چیست؟
Floating-Point Unit
یا «واحد محاسبات ممیز شناور»
برای اجرای محاسبات
Floating Point استفاده می شود.
SIMD چیست؟
Single Instruction Multiple Data
یعنی «یک دستور، چند داده»
و اجازه می دهد
یک عملیات مشابه
روی چند عنصر داده اجرا شود.
Scalar و Vector چه تفاوتی دارند؟
Scalar معمولاً روی مقدار منفرد کار می کند،
در حالی که عملیات Vector
می تواند چند عنصر داده
را در یک بردار پردازش کند.
AVX چیست؟
Advanced Vector Extensions
یا «توسعه های برداری پیشرفته»
خانواده ای از قابلیت های SIMD
در معماری x86 است.
AVX2 چیست؟
توسعه ای بر AVX است
که قابلیت های برداری بیشتری،
از جمله گسترش مهم عملیات عدد صحیح،
فراهم می کند.
آیا AVX-512 همیشه سریع تر از AVX2 است؟
خیر.
سرعت واقعی به نرم افزار،
ریزمعماری،
پهنای واحدهای اجرایی،
حافظه،
فرکانس و عوامل متعدد دیگری بستگی دارد.
NEON چیست؟
فناوری SIMD
در بسیاری از پردازنده های Arm است
و برای پردازش گروهی داده ها
استفاده می شود.
FMA چیست؟
Fused Multiply-Add
یا «ضرب و جمع ترکیبی»
عملیاتی برای محاسبه ترکیبی
ضرب و جمع است.
Latency و Throughput چه تفاوتی دارند؟
Latency مدت زمان لازم
برای آماده شدن نتیجه یک عملیات است،
اما Throughput نرخ پردازش
عملیات متعدد را توصیف می کند.
Vectorization چیست؟
برداری سازی
تبدیل محاسبات مناسب
به عملیات برداری است
تا بتوان از SIMD استفاده کرد.
آیا همه برنامه ها از SIMD استفاده می کنند؟
خیر.
نرم افزار،
Compiler یا کتابخانه مورد استفاده
باید بتواند از دستورهای SIMD
بهره بگیرد.
چرا دو CPU دارای AVX2 سرعت یکسانی ندارند؟
چون پشتیبانی از ISA
فقط قابلیت اجرای دستور را مشخص می کند.
نحوه پیاده سازی آن در ریزمعماری،
تعداد و پهنای واحدهای اجرایی،
Cache، حافظه، فرکانس
و عوامل دیگر
Performance واقعی را تعیین می کنند.
واژه های جدید این فصل برای واژه نامه نهایی کتاب
- Execution Unit: واحد اجرایی؛ سخت افزار انجام دهنده عملیات.
- ALU: Arithmetic Logic Unit؛ واحد حساب و منطق.
- Integer: عدد صحیح.
- Integer Operation: عملیات روی اعداد صحیح.
- Logical Operation: عملیات منطقی روی بیت ها یا مقادیر منطقی.
- FPU: Floating-Point Unit؛ واحد محاسبات ممیز شناور.
- Floating Point: روش نمایش و محاسبه اعداد حقیقی در کامپیوتر.
- Scalar: مقدار منفرد یا پردازش تک مقداری.
- Vector: مجموعه ای از عناصر داده برای پردازش گروهی.
- SIMD: Single Instruction Multiple Data؛ یک دستور برای چند داده.
- Vector Unit: واحد اجرای عملیات برداری.
- Vector Width: پهنای داده قابل پوشش توسط عملیات برداری.
- SSE: Streaming SIMD Extensions؛ خانواده ای از توسعه های SIMD در x86.
- AVX: Advanced Vector Extensions؛ توسعه های برداری پیشرفته.
- AVX2: نسل توسعه یافته قابلیت های AVX.
- AVX-512: خانواده ای از توسعه های برداری x86 با قابلیت های برداری پیشرفته.
- NEON: فناوری SIMD در معماری Arm.
- ISA: Instruction Set Architecture؛ معماری مجموعه دستورها.
- Microarchitecture: ریزمعماری؛ نحوه پیاده سازی داخلی ISA.
- FMA: Fused Multiply-Add؛ ضرب و جمع ترکیبی.
- Latency: تاخیر تا آماده شدن نتیجه.
- Throughput: نرخ عبور یا میزان عملیات قابل پردازش.
- Dependency Chain: زنجیره ای از عملیات وابسته به نتیجه یکدیگر.
- Execution Port: مسیر دسترسی عملیات به واحدهای اجرایی.
- Port Pressure: فشار ناشی از رقابت عملیات برای مسیر اجرایی محدود.
- Bottleneck: گلوگاه؛ بخشی که Performance کل سیستم را محدود می کند.
- Vectorization: برداری سازی محاسبات برای استفاده از SIMD.
- Auto-Vectorization: برداری سازی خودکار توسط Compiler.
- Workload: بار کاری یا مجموعه کاری که سیستم اجرا می کند.
- Decompression: بازکردن داده فشرده.
- Hash: درهم سازی داده توسط یک تابع مشخص.
خلاصه فصل
Execution Unitها
محل انجام واقعی بسیاری از محاسبات CPU هستند.
ALU برای بسیاری از عملیات
عدد صحیح و منطقی استفاده می شود،
در حالی که FPU و واحدهای برداری
نقش مهمی در محاسبات عددی
و Floating Point دارند.
SIMD اجازه می دهد
یک دستور
چند عنصر داده را پردازش کند.
Scalar
→
One / Few Data Elements
SIMD
→
Multiple Data Elements
→
One Instruction
SSE، AVX، AVX2، AVX-512 و NEON
نمونه هایی از فناوری ها
و مجموعه قابلیت های مرتبط
با پردازش SIMD هستند.
اما وجود یک قابلیت در ISA
به تنهایی Performance را تعیین نمی کند.
ریزمعماری،
تعداد واحدهای اجرایی،
پهنای آنها،
Throughput،
Latency،
Cache،
Memory Bandwidth،
فرکانس
و نوع Workload
همگی اهمیت دارند.
مهم ترین قانون این فصل:
نام یک دستور یا پهنای یک Vector
به تنهایی سرعت CPU را مشخص نمی کند؛
Performance واقعی حاصل همکاری
نرم افزار، ISA، ریزمعماری،
واحدهای اجرایی و سیستم حافظه است.
یک Core همیشه از تمام منابع داخلی خود استفاده نمی کند؛ آیا می توان ظرفیت خالی را به Thread دیگری داد؟
SMT و Hyper-Threading چیست؟ چگونه یک هسته CPU چند Thread را اجرا می کند؟
یک Core مدرن
مجموعه بزرگی از منابع داخلی مانند
Front-End،
Scheduler،
Execution Unit،
Load/Store Unit
و Cache دارد.
اما یک Thread
در هر لحظه الزاماً نمی تواند
از تمام این منابع استفاده کند.
ممکن است Thread
منتظر داده از Cache باشد،
با Branch Misprediction روبه رو شود،
یک زنجیره وابستگی داشته باشد
یا فقط به بعضی واحدهای اجرایی نیاز داشته باشد.
یکی از ایده های مهم
برای استفاده بهتر از این ظرفیت خالی:
SMT یا «چند رشته ای همزمان»
است.
One Physical Core
+
Multiple Hardware Threads
→
Better Resource Utilization
در این فصل چه چیزهایی یاد می گیریم؟
- Thread چیست.
- Hardware Thread چیست.
- Physical Core چیست.
- Logical Processor چیست.
- SMT چیست.
- Hyper-Threading چیست.
- SMT2 و SMT4 یعنی چه.
- چرا یک Core می تواند چند Thread را دنبال کند.
- کدام منابع ممکن است بین Threadها مشترک باشند.
- Resource Sharing چیست.
- Resource Contention چیست.
- چرا SMT دو برابر شدن Performance نیست.
- SMT چه زمانی مفید است.
- چه زمانی سود SMT کم می شود.
- SMT چه ارتباطی با Cache و Memory Stall دارد.
- SMT با Multi-Core چه تفاوتی دارد.
- سیستم عامل چگونه Logical Processorها را می بیند.
- Thread Scheduling چیست.
Thread چیست؟
رشته اجرایی — Thread
Thread
یا «رشته اجرایی»
یک جریان اجرای دستور
در داخل یک برنامه یا Process است.یک برنامه
می تواند فقط یک Thread داشته باشد
یا از چند Thread
برای انجام بخش های مختلف کار
استفاده کند.
Process چیست؟
فرایند — Process
Process
یا «فرایند»
نمونه در حال اجرای یک برنامه
همراه با منابع و فضای اجرایی مربوط به آن است.یک Process
می تواند شامل
یک یا چند Thread باشد.
Process
→
Thread 1
+
Thread 2
+
Thread 3
Hardware Thread چیست؟
رشته سخت افزاری — Hardware Thread
Hardware Thread
یا «رشته سخت افزاری»
Context اجرایی است
که سخت افزار CPU
برای دنبال کردن یک جریان دستور
در اختیار سیستم قرار می دهد.واژه
Context
در اینجا به معنی
«وضعیت و اطلاعات لازم برای دنبال کردن اجرای یک جریان دستور»
است.
Physical Core چیست؟
هسته فیزیکی — Physical Core
Physical Core
یا «هسته فیزیکی»
یک هسته واقعی سخت افزاری
داخل پردازنده است.این Core
دارای منابع اجرایی واقعی
مانند Pipeline،
واحدهای اجرایی،
Scheduler
و ساختارهای دیگر است.
Logical Processor چیست؟
پردازنده منطقی — Logical Processor
Logical Processor
یا «پردازنده منطقی»
واحد اجرایی قابل مشاهده
برای سیستم عامل است
که می تواند یک Thread نرم افزاری
روی آن زمان بندی شود.در یک CPU دارای SMT،
یک Physical Core
می تواند بیش از یک
Logical Processor
در اختیار سیستم عامل قرار دهد.
فرض کنید یک CPU
دارای 8 هسته فیزیکی باشد
و هر Core بتواند
دو Hardware Thread
را دنبال کند.
8 Physical Cores
×
2 Hardware Threads per Core
=
16 Logical Processors
سیستم عامل
در این مثال
16 پردازنده منطقی
برای زمان بندی Threadها مشاهده می کند.
اما این به معنی وجود
16 هسته فیزیکی کامل
نیست.
SMT چیست؟
چند رشته ای همزمان — Simultaneous Multithreading
SMT
مخفف:
Simultaneous Multithreading
و به معنی
«چند رشته ای همزمان»
است.
SMT تکنیکی است
که اجازه می دهد
یک Core فیزیکی
دستورهای متعلق به
بیش از یک Hardware Thread
را در بازه زمانی مشابه
وارد موتور پردازنده کند.
هدف اصلی:
Better Utilization
of
Core Resources
یعنی:
«استفاده بهتر از منابع داخلی هسته».
چرا اصلاً SMT ساخته شد؟
یک Thread منفرد
همیشه نمی تواند
تمام ظرفیت یک Core مدرن
را مصرف کند.
برای مثال ممکن است:
- منتظر Load از حافظه باشد.
- با Cache Miss روبه رو شده باشد.
- Branch اشتباه پیش بینی شده باشد.
- Dependency Chain طولانی داشته باشد.
- فقط از بعضی Execution Unitها استفاده کند.
در چنین شرایطی
بخشی از منابع Core
ممکن است ظرفیت آزاد داشته باشند.
SMT تلاش می کند
بخشی از این ظرفیت را
برای Thread دیگری
قابل استفاده کند.
فرض کنید Thread A
به دلیل Cache Miss
موقتاً نمی تواند
بعضی دستورهای خود را ادامه دهد.
Thread A
→
Waiting for Data
در همین زمان،
Thread B
ممکن است دستورهای آماده
برای اجرا داشته باشد.
Thread B
→
Ready Instructions
→
Execution Units
بنابراین به جای اینکه
بعضی منابع Core
کاملاً بیکار بمانند،
Thread B می تواند
بخشی از ظرفیت موجود را استفاده کند.
Hyper-Threading چیست؟
Hyper-Threading — نام تجاری Intel برای پیاده سازی SMT
Hyper-Threading Technology
نامی است که Intel
برای فناوری چند رشته ای همزمان
در بسیاری از پردازنده های خود
استفاده کرده است.بنابراین از نظر مفهومی:
Hyper-Threading
=
Intel SMT Implementation
یعنی Hyper-Threading
نام عمومی تمام فناوری های چند رشته ای نیست.
SMT2 یعنی چه؟
دو رشته سخت افزاری برای هر Core — SMT2
SMT2
یعنی هر Physical Core
می تواند دو Hardware Thread
را پشتیبانی کند.
1 Core
→
2 Hardware Threads
SMT4 یعنی چه؟
چهار رشته سخت افزاری برای هر Core — SMT4
SMT4
یعنی یک Core
چهار Hardware Thread
را پشتیبانی می کند.
1 Core
→
4 Hardware Threads
تعداد Threadهای سخت افزاری
برای هر Core
به طراحی معماری
بستگی دارد.
خیر.
SMT یک Core فیزیکی دیگر
ایجاد نمی کند.
بسیاری از منابع اصلی Core
همچنان مشترک هستند.
فقط برخی وضعیت ها و منابع
باید به اندازه کافی
مستقل یا قابل تفکیک باشند
تا چند Hardware Thread
بتوانند همزمان دنبال شوند.
چه منابعی ممکن است بین Threadهای SMT مشترک باشند؟
جزئیات دقیق
به ریزمعماری بستگی دارد،
اما در یک توضیح عمومی
Threadهای یک Core
ممکن است برای استفاده از
بخش هایی مانند اینها رقابت کنند:
- Front-End Capacity
- Decode Bandwidth
- Execution Units
- Execution Ports
- Load/Store Resources
- Cache Capacity
- Memory Bandwidth
- بعضی ساختارهای زمان بندی و اجرای داخلی
نحوه اشتراک یا تقسیم هر منبع
در معماری های مختلف
می تواند متفاوت باشد.
ظرفیت بخش جلویی پردازنده — Front-End Capacity
Front-End Capacity
یا «ظرفیت بخش جلویی پردازنده»
به توان Front-End
برای تامین جریان دستور
برای بخش های بعدی CPU اشاره دارد.
پهنای رمزگشایی — Decode Bandwidth
Decode Bandwidth
یا «پهنای رمزگشایی»
نشان می دهد بخش Decode
با چه ظرفیتی
می تواند دستورها را
برای مراحل بعدی آماده کند.
Resource Sharing چیست؟
اشتراک منابع — Resource Sharing
Resource Sharing
یا «اشتراک منابع»
یعنی چند Hardware Thread
از بعضی منابع فیزیکی مشترک
در یک Core استفاده کنند.همین اشتراک منابع
یکی از دلایلی است
که SMT نسبت به ساخت
یک Core فیزیکی کامل دیگر
هزینه سخت افزاری کمتری دارد.
Resource Contention چیست؟
رقابت بر سر منابع — Resource Contention
Resource Contention
یا «رقابت بر سر منابع»
زمانی رخ می دهد
که چند Thread
همزمان به یک منبع محدود
نیاز داشته باشند.برای مثال،
اگر هر دو Thread
به شدت به یک نوع Execution Unit
یا Cache مشترک وابسته باشند،
ممکن است برای آن منبع
با یکدیگر رقابت کنند.
فرض کنید Thread A
بیشتر منتظر حافظه است،
اما Thread B
تعداد زیادی عملیات محاسباتی آماده دارد.
این دو Thread
ممکن است بتوانند
منابع Core را بهتر
بین خود استفاده کنند.
Thread A:
Memory Heavy
Thread B:
Compute Heavy
Complementary Resource Usage
→
Better Utilization
عبارت
Compute Heavy
در اینجا یعنی
«بار کاری با تمرکز زیاد بر محاسبات».
عبارت
Memory Heavy
نیز یعنی
«بار کاری با وابستگی زیاد به دسترسی حافظه».
فرض کنید هر دو Thread
به شدت از واحدهای برداری
مشابه استفاده می کنند.
در این حالت
Thread دوم
الزاماً ظرفیت خالی زیادی پیدا نمی کند.
Thread A
+
Thread B
→
Same Bottleneck
→
Resource Contention
بنابراین سود SMT
به نوع Workload
وابستگی زیادی دارد.
چرا 8 Core و 16 Thread دو برابر 8 Core و 8 Thread نیست؟
چون دو Logical Processor
روی یک Physical Core
دو مجموعه کامل و مستقل
از منابع پردازشی ندارند.
آنها بخش قابل توجهی
از سخت افزار Core
را به اشتراک می گذارند.
بنابراین:
1 Core + SMT2
≠
2 Physical Cores
خیر.
عدد Thread
نباید به عنوان تعداد Core
تفسیر شود.
برای مقایسه پردازنده ها
باید حداقل موارد زیر
جداگانه بررسی شوند:
- تعداد Physical Core،
- تعداد Hardware Thread،
- نوع Coreها،
- ریزمعماری،
- فرکانس،
- Cache،
- توان مصرفی،
- و Performance واقعی در Workload مورد نظر.
Multi-Core و SMT چه تفاوتی دارند؟
| ویژگی | Multi-Core | SMT |
|---|---|---|
| منبع اصلی افزایش موازی سازی | افزودن Core فیزیکی | استفاده بهتر از منابع Core موجود |
| Execution Resources | هر Core منابع اجرایی خود را دارد | بسیاری از منابع بین Threadهای یک Core مشترک هستند |
| ظرفیت پردازشی | افزایش سخت افزاری بزرگ تر | استفاده بهتر از ظرفیت بلااستفاده |
| هدف اصلی | افزایش تعداد هسته های واقعی | افزایش Utilization یک Core |
Utilization چیست؟
میزان استفاده از منابع — Utilization
Utilization
یا «میزان استفاده از منابع»
نشان می دهد
چه مقدار از ظرفیت یک منبع
در حال استفاده است.هدف SMT
در بسیاری از شرایط
افزایش Utilization
منابع داخلی Core است.
سیستم عامل SMT را چگونه می بیند؟
سیستم عامل
Logical Processorهای موجود
را شناسایی می کند
و Threadهای نرم افزاری
را روی آنها زمان بندی می کند.
اما Scheduler سیستم عامل
می تواند اطلاعاتی درباره
ساختار Coreها و ارتباط
Logical Processorها
با Coreهای فیزیکی داشته باشد.
Scheduler سیستم عامل چیست؟
زمان بند — Scheduler
Scheduler
یا «زمان بند»
بخشی از سیستم عامل است
که تصمیم می گیرد
کدام Thread
در چه زمانی
روی کدام پردازنده منطقی
اجرا شود.
Thread Scheduling چیست؟
زمان بندی رشته ها — Thread Scheduling
Thread Scheduling
یا «زمان بندی رشته ها»
فرایند تخصیص Threadهای آماده اجرا
به منابع پردازشی موجود است.این موضوع
در CPUهای دارای:
- چند Core،
- SMT،
- Coreهای ناهمگون،
- و سیاست های مختلف مصرف انرژی
پیچیده تر می شود.
فرض کنید دو Thread آماده اجرا داریم
و دو Core فیزیکی آزاد نیز وجود دارد.
در بسیاری از شرایط،
قرار دادن Threadها
روی دو Core فیزیکی جداگانه
منابع اجرایی بیشتری
در اختیار آنها قرار می دهد.
Thread A
→
Physical Core 1
Thread B
→
Physical Core 2
اما تصمیم واقعی Scheduler
می تواند به عواملی مانند
بار سیستم،
مصرف انرژی،
ساختار CPU،
Cache Locality
و سیاست سیستم عامل
وابسته باشد.
Cache Locality چیست؟
محلی بودن داده در Cache — Cache Locality
Cache Locality
در این Context
به مزیت باقی ماندن
داده و دستورهای مورد نیاز یک Thread
در Cacheهای نزدیک
به محل اجرای آن اشاره دارد.جابه جایی مکرر Thread
میان Coreها
در بعضی شرایط
می تواند این مزیت را کاهش دهد.
Thread Migration چیست؟
مهاجرت رشته — Thread Migration
Thread Migration
یا «مهاجرت رشته»
یعنی انتقال اجرای یک Thread
از یک Core یا Logical Processor
به محل دیگری.این کار ممکن است
برای مدیریت بار،
مصرف انرژی
یا دلایل دیگر انجام شود.
SMT چگونه می تواند روی Cache اثر بگذارد؟
اگر دو Thread روی یک Core
از Cacheهای مشترک استفاده کنند،
داده های هر Thread
می توانند بخشی از ظرفیت Cache
را اشغال کنند.
اگر Working Set هر دو Thread
بزرگ باشد،
رقابت بر سر Cache
ممکن است افزایش پیدا کند.
مجموعه داده فعال — Working Set
Working Set
یا «مجموعه داده فعال»
به داده ها و دستورهایی گفته می شود
که یک برنامه یا Thread
در یک بازه زمانی
به طور فعال
به آنها نیاز دارد.
Cache Thrashing چیست؟
جایگزینی شدید و مکرر داده در Cache — Cache Thrashing
Cache Thrashing
حالتی است
که داده های مورد نیاز
مرتباً یکدیگر را
از Cache خارج می کنند
و نرخ Miss افزایش پیدا می کند.رقابت چند Workload
با Working Set بزرگ
می تواند یکی از شرایط
ایجاد چنین رفتاری باشد.
چرا Memory Stall می تواند فرصت خوبی برای SMT ایجاد کند؟
اگر Thread اول
منتظر داده ای از حافظه باشد،
ممکن است نتواند
تمام ظرفیت Core
را استفاده کند.
Thread دوم
می تواند در همین زمان
دستورهای آماده خود را
وارد واحدهای اجرایی کند.
Thread A:
Memory Stall
Thread B:
Useful Execution
این یکی از مثال های مهم
فلسفه SMT است.
ILP و TLP چه تفاوتی دارند؟
موازی سازی سطح دستور و سطح رشته
ILP
مخفف:
Instruction-Level Parallelism
و به معنی
«موازی سازی در سطح دستور»
است.
TLP
مخفف:
Thread-Level Parallelism
و به معنی
«موازی سازی در سطح رشته»
است.
| مفهوم | معنی | منبع موازی سازی |
|---|---|---|
| ILP | Instruction-Level Parallelism | دستورهای مستقل یک جریان اجرا |
| TLP | Thread-Level Parallelism | چند Thread مستقل |
| SIMD | Single Instruction Multiple Data | چند عنصر داده برای یک عملیات مشابه |
یک پردازنده مدرن
ممکن است همزمان از:
- Out-of-Order Execution برای استخراج ILP،
- SIMD برای Data-Level Parallelism،
- SMT برای استفاده از چند Hardware Thread،
- Multi-Core برای اجرای چند جریان روی Coreهای مختلف
استفاده کند.
Data-Level Parallelism
یا «موازی سازی در سطح داده»
یعنی انجام عملیات مشابه
روی چند داده.
SMT در چه Workloadهایی می تواند مفید باشد؟
میزان سود دقیق
به CPU و نرم افزار بستگی دارد،
اما SMT می تواند
در Workloadهایی که
تعداد Thread کافی دارند
مفید باشد؛ مانند:
- رندر CPU در نرم افزارهای چند رشته ای،
- کامپایل پروژه های بزرگ،
- برخی Workloadهای سرور،
- ماشین های مجازی،
- برخی عملیات فشرده سازی،
- پردازش داده،
- برخی شبیه سازی ها،
- اجرای همزمان چند برنامه سنگین،
- برخی Workloadهای تولید محتوا.
ماشین مجازی — Virtual Machine
Virtual Machine
یا «ماشین مجازی»
محیط نرم افزاری ای است
که رفتار یک سیستم کامپیوتری
را به صورت مجازی فراهم می کند
و می تواند سیستم عامل
و برنامه های جداگانه اجرا کند.
چه زمانی سود SMT کم می شود؟
سود SMT می تواند کمتر شود
اگر:
- برنامه فقط یک Thread فعال داشته باشد.
- Core تقریباً تمام منابع خود را با یک Thread مصرف کند.
- دو Thread برای منابع مشابه رقابت شدیدی داشته باشند.
- Memory Bandwidth گلوگاه اصلی باشد.
- Cache Contention افزایش پیدا کند.
- نرم افزار مقیاس پذیری چند رشته ای مناسبی نداشته باشد.
Scalability چیست؟
مقیاس پذیری — Scalability
Scalability
یا «مقیاس پذیری»
در این Context
نشان می دهد
یک نرم افزار با اضافه شدن
منابع پردازشی بیشتر
تا چه اندازه می تواند
Performance بیشتری به دست آورد.
خیر.
بخش هایی از برنامه
ممکن است قابل موازی سازی نباشند.
Threadها ممکن است
برای Cache،
Memory Bandwidth،
Lockها
یا منابع دیگر
رقابت کنند.
بنابراین Scaling واقعی
معمولاً کاملاً خطی نیست.
Lock چیست؟
قفل همگام سازی — Lock
Lock
یا «قفل»
سازوکاری برای کنترل
دسترسی همزمان چند Thread
به یک منبع مشترک است.اگر Threadهای زیادی
مرتباً منتظر یک Lock باشند،
افزایش تعداد Threadها
الزاماً Performance را
افزایش نمی دهد.
Context Switch چیست؟
تعویض زمینه اجرایی — Context Switch
Context Switch
یا «تعویض زمینه اجرایی»
زمانی رخ می دهد
که CPU اجرای یک Thread یا Process
را متوقف کند
و اجرای مورد دیگری را ادامه دهد.سیستم باید
اطلاعات لازم برای ادامه اجرای قبلی
را حفظ کند
و وضعیت اجرای جدید
را آماده کند.
SMT همان Context Switching سریع است؟
خیر.
در Context Switch،
سیستم اجرای یک Context
را با Context دیگری
جایگزین می کند.
اما در SMT،
چند Hardware Thread
می توانند همزمان
در یک Core حضور داشته باشند
و برای استفاده از منابع اجرایی
رقابت یا همکاری کنند.
چرا در Task Manager تعداد CPUها بیشتر از تعداد Coreها دیده می شود؟
در سیستم دارای SMT،
سیستم عامل
Logical Processorها را
به صورت منابع زمان بندی
مشاهده می کند.
بنابراین ممکن است مثلاً:
Cores: 8
Logical Processors: 16
مشاهده شود.
این دو عدد
دو مفهوم متفاوت دارند.
آیا اشتراک منابع SMT فقط مسئله Performance است؟
خیر.
اشتراک بعضی منابع ریزمعماری
میان Threadها
در برخی زمینه های امنیتی نیز
اهمیت دارد.
به همین دلیل
در بعضی محیط های بسیار حساس،
سیاست استفاده از SMT
می تواند علاوه بر Performance
با ملاحظات امنیتی نیز
بررسی شود.
جزئیات حملات Side-Channel
و روش های مقابله
موضوع مستقلی است
و باید جداگانه بررسی شود.
کانال جانبی — Side-Channel
Side-Channel
یا «کانال جانبی»
به روشی گفته می شود
که در آن اطلاعات
از رفتارهای جانبی یک سیستم،
مانند Timing
یا الگوهای استفاده از منابع،
استنباط می شوند
نه لزوماً از مسیر مستقیم
دسترسی به داده.
آیا خاموش کردن SMT همیشه Performance را بهتر می کند؟
خیر.
خاموش کردن SMT
می تواند در بعضی Workloadهای خاص
رفتار متفاوتی ایجاد کند،
اما در Workloadهای چند رشته ای دیگر
ممکن است Performance کاهش پیدا کند.
تصمیم درست
باید بر اساس:
- نوع CPU،
- نوع Workload،
- سیستم عامل،
- نیاز امنیتی،
- مصرف انرژی،
- و Benchmark واقعی
انجام شود.
آزمون سنجش عملکرد — Benchmark
Benchmark
یا «آزمون سنجش عملکرد»
آزمایشی است
که برای اندازه گیری
Performance سیستم
در یک شرایط مشخص
استفاده می شود.Benchmark زمانی ارزشمندتر است
که Workload آن
به استفاده واقعی کاربر
نزدیک باشد.
مقایسه ای مانند:
CPU A:
8 Cores / 16 Threads
CPU B:
12 Cores / 12 Threads
به تنهایی مشخص نمی کند
کدام CPU سریع تر است.
باید معماری Core،
نوع Coreها،
IPC،
فرکانس،
Cache،
توان،
محدودیت حرارتی
و Benchmark نرم افزار مورد نظر
نیز بررسی شود.
جدول خلاصه مفاهیم SMT
| مفهوم | معنی فارسی | توضیح |
|---|---|---|
| Physical Core | هسته فیزیکی | هسته واقعی سخت افزاری CPU |
| Hardware Thread | رشته سخت افزاری | Context سخت افزاری برای دنبال کردن یک جریان دستور |
| Logical Processor | پردازنده منطقی | منبع اجرایی قابل مشاهده برای سیستم عامل |
| SMT | چند رشته ای همزمان | اجرای چند Hardware Thread روی یک Core |
| Hyper-Threading | نام تجاری فناوری SMT اینتل | پیاده سازی SMT در بسیاری از CPUهای Intel |
| Resource Sharing | اشتراک منابع | استفاده چند Thread از منابع مشترک Core |
| Resource Contention | رقابت بر سر منابع | رقابت Threadها برای یک منبع محدود |
| Thread Scheduling | زمان بندی رشته ها | انتخاب محل و زمان اجرای Threadها |
| Thread Migration | مهاجرت رشته | انتقال Thread بین منابع پردازشی |
| Working Set | مجموعه داده فعال | داده و دستورهای مورد استفاده فعال برنامه |
- یکی دانستن Core و Thread.
- فرض اینکه 8 Core / 16 Thread یعنی 16 Core واقعی.
- فرض اینکه SMT Performance را دو برابر می کند.
- یکی دانستن SMT و Multi-Core.
- یکی دانستن SMT و Context Switching.
- فرض اینکه Hyper-Threading نام عمومی تمام SMTها است.
- نادیده گرفتن Resource Contention.
- نادیده گرفتن Cache Contention.
- فرض اینکه Thread دوم منابع اجرایی کاملاً مستقل دارد.
- فرض اینکه SMT در تمام نرم افزارها سود یکسانی دارد.
- فرض اینکه خاموش کردن SMT همیشه بهتر است.
- مقایسه CPU فقط با تعداد Thread.
- نادیده گرفتن Scheduler سیستم عامل.
- نادیده گرفتن Thread Migration و Cache Locality.
- فرض اینکه افزایش Thread همیشه Scaling خطی ایجاد می کند.
سوالات متداول درباره SMT و Hyper-Threading
SMT چیست؟
Simultaneous Multithreading
یا «چند رشته ای همزمان»
تکنیکی برای اجرای چند Hardware Thread
روی یک Core فیزیکی است.
Hyper-Threading چیست؟
نام تجاری Intel
برای فناوری SMT
در بسیاری از پردازنده های این شرکت است.
آیا هر Thread یک Core واقعی است؟
خیر.
Hardware Thread و Physical Core
دو مفهوم متفاوت هستند.
8 Core و 16 Thread یعنی چه؟
در حالت معمول چنین مشخصاتی
می تواند به معنی 8 هسته فیزیکی
با دو Hardware Thread
برای هر Core باشد.
آیا SMT سرعت CPU را دو برابر می کند؟
خیر.
Threadهای SMT
بسیاری از منابع Core
را با یکدیگر به اشتراک می گذارند.
SMT چه زمانی مفید است؟
زمانی که Thread اول
نتواند تمام منابع Core را استفاده کند
و Thread دیگری
بتواند از ظرفیت آزاد
بهره ببرد.
Resource Contention چیست؟
رقابت چند Thread
برای استفاده از یک منبع
سخت افزاری محدود است.
SMT و Multi-Core چه تفاوتی دارند؟
Multi-Core تعداد Coreهای فیزیکی را افزایش می دهد،
اما SMT تلاش می کند
از منابع یک Core موجود
بهتر استفاده کند.
چرا سیستم عامل Logical Processor بیشتری نشان می دهد؟
زیرا هر Hardware Thread
می تواند به صورت
یک Logical Processor
برای Scheduler سیستم عامل
قابل مشاهده باشد.
آیا خاموش کردن Hyper-Threading سرعت را بیشتر می کند؟
نه به صورت عمومی.
نتیجه به CPU،
Workload
و شرایط استفاده بستگی دارد.
آیا SMT فقط در لپ تاپ استفاده می شود؟
خیر.
مفهوم SMT می تواند
در پردازنده های دسکتاپ،
ورک استیشن،
سرور
و خانواده های مختلف پردازنده
مورد استفاده قرار گیرد.
واژه های جدید این فصل برای واژه نامه نهایی کتاب
- Thread: رشته اجرایی؛ یک جریان اجرای دستور.
- Process: فرایند؛ نمونه در حال اجرای یک برنامه.
- Context: وضعیت و اطلاعات لازم برای دنبال کردن یک جریان اجرا.
- Hardware Thread: رشته سخت افزاری قابل دنبال کردن توسط CPU.
- Physical Core: هسته فیزیکی واقعی پردازنده.
- Logical Processor: پردازنده منطقی قابل مشاهده برای سیستم عامل.
- SMT: Simultaneous Multithreading؛ چند رشته ای همزمان.
- Hyper-Threading: نام تجاری Intel برای فناوری SMT.
- SMT2: پشتیبانی دو Hardware Thread توسط هر Core.
- SMT4: پشتیبانی چهار Hardware Thread توسط هر Core.
- Resource Sharing: اشتراک منابع.
- Resource Contention: رقابت بر سر منابع محدود.
- Utilization: میزان استفاده از ظرفیت یک منبع.
- Scheduler: زمان بند سیستم عامل.
- Thread Scheduling: زمان بندی رشته های اجرایی.
- Cache Locality: محلی بودن داده مورد نیاز در Cache نزدیک.
- Thread Migration: انتقال اجرای Thread میان منابع پردازشی.
- Working Set: مجموعه داده و دستورهای فعال برنامه.
- Cache Thrashing: جایگزینی شدید داده و افزایش Cache Miss.
- ILP: Instruction-Level Parallelism؛ موازی سازی سطح دستور.
- TLP: Thread-Level Parallelism؛ موازی سازی سطح رشته.
- Data-Level Parallelism: موازی سازی در سطح داده.
- Scalability: مقیاس پذیری با افزایش منابع پردازشی.
- Lock: قفل برای کنترل دسترسی همزمان به منبع مشترک.
- Context Switch: تعویض زمینه اجرایی.
- Virtual Machine: ماشین مجازی.
- Side-Channel: کانال جانبی.
- Benchmark: آزمون سنجش عملکرد.
- Compute Heavy: بار کاری با تمرکز زیاد بر محاسبات.
- Memory Heavy: بار کاری با وابستگی زیاد به حافظه.
خلاصه فصل
SMT یک Core فیزیکی جدید
ایجاد نمی کند.
هدف آن
استفاده بهتر از منابع
Core موجود است.
One Physical Core
→
Multiple Hardware Threads
→
Shared Execution Resources
اگر Thread اول
نتواند تمام ظرفیت Core
را استفاده کند،
Thread دوم ممکن است
بخشی از ظرفیت آزاد را
به کار بگیرد.
اما اگر هر دو Thread
به منابع مشابه نیاز داشته باشند،
Resource Contention
می تواند سود SMT را کاهش دهد.
بنابراین:
More Threads
≠
Proportionally More Performance
مهم ترین قانون این فصل:
Thread بیشتر به معنی Core بیشتر نیست؛
SMT روشی برای استفاده بهتر
از منابع هسته فیزیکی موجود است،
نه جایگزینی کامل برای هسته های فیزیکی بیشتر.
