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

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

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

~3 min read · Updated Sep 6, 2026

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

هر دستور 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 استفاده کرد، که تضمین می‌کند فقط یک هسته در هر لحظه می‌تواند به یک منبع مشترک دسترسی داشته باشد.

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

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

Written & researched by Dr. Shahin Siami

Related Articles

تصورات غلط رایج درباره محاسبات موازی و درس‌های نهایی کتاب

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

Continue

واقعیت‌های عملی: بنچمارک CPU در مقابل GPU و ضرب ماتریس چندپردازنده‌ای

مقایسه منصفانه یک CPU و یک GPU نیازمند مدلی است که هم توان عملیاتی محاسباتی و هم محدودیت‌های پهنای باند حافظه را با هم در نظر بگیرد. این مقاله مدل roofline مورد استفاده برای مقایسه سخت‌افزار واقعی مانند Intel Core i7 و NVIDIA Tesla GPU را معرفی می‌کند، سپس نشان می‌دهد ضرب ماتریس چگونه در سراسر چند پردازنده تسریع می‌شود، به‌عنوان کاربرد عملی نهایی مفاهیم موازی این فصل.

Continue

بنچمارک کردن چندپردازنده‌ها و مدل‌سازی کارایی موازی

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

Continue

شبکه‌سازی کلاستر: ارتباط با دنیای بیرون

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

Continue

کلاسترها، کامپیوترهای در مقیاس انبار، و توپولوژی‌های شبکه

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

Continue

مقدمه‌ای بر GPU: موازی‌سازی عظیم برای بارهای کاری سنگین از نظر داده

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

Continue