مدیریت آدرس‌های بزرگ و همگام‌سازی در RISC-V

یک دستور ۳۲ بیتی نمی‌تواند یک ثابت بزرگ یا یک آدرس حافظه دور را مستقیماً درون خودش جا دهد، و چند پردازنده‌ای که حافظه را به اشتراک می‌گذارند نمی‌توانند بدون هماهنگی، یک داده یکسان را با امنیت به‌روزرسانی کنند. این مقاله توضیح می‌دهد RISC-V چگونه مقادیر فوری و آدرس‌های بزرگ را از قطعات کوچک‌تر می‌سازد، و دستورات اتمیک چگونه اجازه می‌دهند برنامه‌های موازی با امنیت همگام شوند.

مقادیر فوری بزرگساخت آدرسدستورات همگام‌سازی

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۱۵ شهریور ۱۴۰۵

مسئله: جا دادن مقادیر بزرگ در دستورات با عرض ثابت

هر دستور RISC-V در یک کلمه ثابت ۳۲ بیتی بسته‌بندی می‌شود. از آنجا که برخی از آن بیت‌ها باید opcode و فیلدهای رجیستر را کدگذاری کنند، فقط تعداد محدودی بیت برای یک ثابت جاسازی‌شده، معروف به Immediate Value، باقی می‌ماند. این یک مسئله ایجاد می‌کند: چگونه یک برنامه می‌تواند با یک ثابت ۳۲ بیتی یا ۶۴ بیتی، یا یک آدرس حافظه که بسیار بزرگ‌تر از چیزی است که در بیت‌های باقی‌مانده یک دستور جا می‌شود، کار کند؟

ساخت ثابت‌های بزرگ از قطعات کوچک‌تر

RISC-V این مسئله را با تقسیم یک ثابت بزرگ بین دو دستور حل می‌کند، به‌جای تلاش برای جا دادن آن در یک دستور.

lui a, upperBits
addi a, a, lowerBits

lui (load upper immediate) مجموعه‌ای از بیت‌ها را در بخش بالایی یک رجیستر قرار می‌دهد و بخش پایینی را صفر می‌کند. دستور addi بعدی سپس یک مقدار فوری کوچک‌تر را اضافه می‌کند تا بیت‌های پایینی را پر کند. با ترکیب این دو دستور معمولی، مقداری بسیار بزرگ‌تر از آنچه هر دستور به‌تنهایی می‌توانست کدگذاری کند ساخته می‌شود.

رسیدن به آدرس‌ها و برچسب‌های دور در حافظه

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

چرا چند پردازنده به همگام‌سازی نیاز دارند

وقتی یک برنامه واحد روی یک هسته اجرا می‌شود، دستورات به ترتیبی قابل‌پیش‌بینی اجرا می‌شوند. اما وقتی یک برنامه بین چند هسته که حافظه یکسانی را به اشتراک می‌گذارند تقسیم شود، مسئله جدیدی پیش می‌آید: دو هسته ممکن است تلاش کنند تقریباً هم‌زمان همان مکان حافظه را بخوانند و به‌روزرسانی کنند، وضعیتی به نام Race Condition، که اگر مدیریت نشود می‌تواند بی‌سروصدا داده مشترک را خراب کند.

دستورات اتمیک: خواندن-تغییر-نوشتن بدون وقفه

برای جلوگیری از این مسئله، RISC-V Atomic Instructions فراهم می‌کند، که یک خواندن، یک تغییر، و یک نوشتن به حافظه را به‌عنوان یک گام واحد و تجزیه‌ناپذیر انجام می‌دهند که هیچ هسته دیگری نمی‌تواند در میانه آن وقفه ایجاد کند.

یک دستور اتمیک نماینده استفاده‌شده برای همگام‌سازی:

amoswap.d a, b, (c)

این دستور به‌طور اتمیک مقدار رجیستر b را با مقداری که در حال حاضر در آدرس حافظه نگه‌داشته‌شده در رجیستر c ذخیره شده، جابه‌جا می‌کند، و مقدار قدیمی حافظه را در رجیستر a قرار می‌دهد. از آنجا که تضمین می‌شود این کل توالی بدون دخالت هسته دیگری در میانه‌اش کامل شود، می‌توان از آن برای ساخت ابزارهای هماهنگی سطح بالاتر مانند Lock استفاده کرد، که تضمین می‌کند فقط یک هسته در هر لحظه می‌تواند به یک منبع مشترک دسترسی داشته باشد.

چرا این دو موضوع به یکدیگر مرتبط‌اند

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

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

خطرهای داده در پایپ‌لاین: Forwarding در مقابل Stalling

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

ادامه

تبدیل یک Datapath تک‌سیکلی به یک Datapath پایپ‌لاین‌شده

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

ادامه

مروری بر پایپ‌لاینینگ: هم‌پوشانی اجرای دستورات

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

ادامه

طراحی منطق کنترلی برای یک پردازنده تک‌سیکلی

یک datapath به‌تنهایی بدون سیگنال‌های کنترلی که به آن بگویند برای هر دستور چه کاری انجام دهد، هیچ کاری نمی‌کند. این مقاله توضیح می‌دهد منطق کنترلی چگونه فیلدهای opcode و function یک دستور را می‌خواند تا سیگنال‌های دقیق مورد نیاز برای مسیریابی درست داده را تولید کند، و مرور می‌کند یک پیاده‌سازی کامل تک‌سیکلی چگونه انواع مختلف دستورات را اجرا می‌کند.

ادامه

ساخت یک Datapath: اتصال رجیسترها، حافظه، و ALU

یک datapath مدار فیزیکی است که داده را در طول اجرای یک دستور از میان پردازنده حرکت می‌دهد. این مقاله بلوک‌های سازنده اساسی سخت‌افزاری مورد نیاز برای fetch، decode، و اجرای دستورات را تجزیه می‌کند، و نشان می‌دهد آن‌ها چگونه به‌هم سیم‌کشی می‌شوند تا یک datapath پردازنده کارآمد، هرچند ساده‌شده، تشکیل دهند.

ادامه

مقدمه‌ای بر طراحی پردازنده و قوانین منطق دیجیتال

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

ادامه
مدیریت آدرس‌های بزرگ و همگام‌سازی در RISC-V | دکتر شاهین صیامی