چرا محاسبات ریاضی به طراحی سختافزاری دقیق نیاز دارند
در سطح نرمافزار، جمع و تفریق بهعنوان عملگرهای ساده بهنظر میرسند. در سطح سختافزار، آنها باید با استفاده از مدارهای فیزیکی ساختهشده از تعداد محدودی گیت منطقی پیادهسازی شوند، و آن مدارها باید تعداد ثابتی بیت را بهدرستی مدیریت کنند، زمانی که نتیجه قابلنمایش نیست را تشخیص دهند، و همه اینها را با سرعتی کافی برای اجرای میلیاردها بار در ثانیه انجام دهند.
یک مدار برای هم جمع و هم تفریق
بهجای ساخت دو مدار جداگانه، سختافزار یک مدار Adder واحد را برای هر دو عملیات استفاده مجدد میکند. این کار بهدلیل نحوه نمایش اعداد در Two's Complement امکانپذیر است، که پیشتر در این مجموعه بحث شد: تفریق یک عدد معادل جمع کردن نقیض آن است.
a − b = a + (−b)از آنجا که منفی کردن یک عدد در مکمل دو فقط نیازمند معکوس کردن بیتهایش و اضافه کردن یک است، یک دستور تفریق میتواند از همان سختافزار جمعکننده مورد استفاده برای جمع استفاده مجدد کند، با کمی مدار اضافی برای انجام این عملیات نفی روی یک عملوند در ابتدا.
سرریز چیست و چرا اهمیت دارد
Overflow زمانی رخ میدهد که نتیجه واقعی ریاضی یک عملیات نتواند در تعداد ثابت بیتهای موجود برای نمایش آن جا شود. از آنجا که هر رجیستر و کلمه حافظه عرض ثابتی دارد، محاسبهای که منطقاً باید مقداری بزرگتر از آنچه آن عرض اجازه میدهد تولید کند، نتیجهای نادرست و دورزدهشده تولید خواهد کرد مگر اینکه سرریز تشخیص داده شود.
قوانین سرریز برای اعداد علامتدار و بدون علامت متفاوتاند
اینکه یک نتیجه خاص سرریز محسوب شود یا نه، به نحوه تفسیر اعداد بستگی دارد.
- برای
Unsigned Numbers، سرریز زمانی رخ میدهد که جمع نتیجهای تولید کند که به بیتهای بیشتری از آنچه موجود است نیاز دارد — از نظر مفهومی، یک carry خارج از با اهمیتترین بیت. - برای
Signed Numbers، سرریز بهطور خاص زمانی رخ میدهد که جمع دو عدد مثبت نتیجهای منفی تولید کند، یا وقتی جمع دو عدد منفی نتیجهای مثبت تولید کند — نشانهای از اینکه نتیجه واقعی از نظر بزرگی برای جا شدن درست، بیش از حد بزرگ بوده است.
از آنجا که این دو قانون متفاوتاند، همان الگوی بیتی و همان عملیات جمع میتواند تحت یک تفسیر معتبر و تحت تفسیر دیگر سرریز محسوب شود.
RISC-V چگونه سرریز را مدیریت میکند
RISC-V در اینجا یک رویکرد طراحی عمدی اتخاذ میکند: دستورات محاسباتی معمولی مانند add و sub بهطور خودکار در سرریز علامتدار trap نمیکنند یا exception بلند نمیکنند. در عوض، تشخیص سرریز، در صورت نیاز، بهطور صریح توسط نرمافزار با استفاده از دستورات مقایسه اضافی مدیریت میشود، که سختافزار محاسباتی هسته را ساده نگه میدارد و با اصل طراحی پیشین یعنی سریع کردن حالت رایج و واگذاری شرایط نادرتر و پیچیدهتر به نرمافزار سازگار است.
چرا این تمایز در عمل اهمیت دارد
یک برنامهنویسی که با مقادیر نزدیک به مرز بازه قابلنمایش یک نوع داده کار میکند، مانند جمعهای بسیار بزرگ یا شمارندههایی که برای مدت طولانی افزایش مییابند، باید آگاه باشد که تفسیرهای بدونعلامت و علامتدار از بیتهای ذخیرهشده یکسان میتوانند بیسروصدا نتایج بسیار متفاوت و گاهی نادرستی تولید کنند اگر سرریز بهدرستی بررسی نشود.