چرا تقسیم سختترین عملیات محاسباتی پایه است
برخلاف جمع که در یک عبور واحد کامل میشود، و ضرب که از الگوی نسبتاً منظم شیفت-و-جمع پیروی میکند، تقسیم نیازمند گامهای تکراری مقایسه و تفریق است که نتیجه هر مرحله به نتیجه مرحله قبل بستگی دارد. این وابستگی باعث میشود مدارهای تقسیم هم کندتر و هم پیچیدهتر برای طراحی نسبت به جمعکنندهها یا ضربکنندهها باشند.
الگوریتم مفهومی تقسیم طولانی
تقسیم سختافزاری همان فرآیند تقسیم طولانی که برای اعداد اعشاری آموزش داده میشود را منعکس میکند، منطبقشده با ارقام باینری.
Divisorرا با بخش فعلیDividendمقایسه کن.- اگر divisor جا بشود (کوچکتر یا مساوی آن بخش باشد)، آن را تفریق کن، یک ۱ در آن موقعیت از
Quotientثبت کن، و نتیجه تفریق را بهعنوان باقیمانده جدید برای کار نگه دار. - اگر divisor جا نشود، یک ۰ در آن موقعیت از quotient ثبت کن و بدون تفریق ادامه بده.
- برای آوردن بیت بعدی از dividend شیفت بده و این فرآیند را تکرار کن تا هر بیت پردازش شود.
یک تصویرسازی سادهشده از تقسیم یک مقدار ۸ بیتی بر یک divisor کوچک:
Dividend: 00001011 (11)
Divisor: 0011 (3)
گامهای تکراری مقایسه-تفریق-شیفت تولید میکنند:
Quotient: 0011 (3)
Remainder: 0010 (2)
بررسی: 3 × 3 + 2 = 11دو خروجی از یک عملیات
برخلاف جمع یا ضرب، تقسیم بهطور طبیعی دو نتیجه متمایز را همزمان تولید میکند: Quotient، که نشان میدهد divisor چند بار در dividend جا میشود، و Remainder، که نشان میدهد چه چیزی باقی میماند. RISC-V این را با فراهم کردن دستورات جداگانه برای بازیابی مستقل هر مقدار منعکس میکند، چون یک برنامه واحد اغلب فقط به یکی از این دو نیاز دارد.
موارد خاصی که سختافزار باید مدیریت کند
تقسیم موارد خاصی دارد که جمع و ضرب معمولی ندارند.
Division by Zeroاز نظر ریاضی نامشخص است. بهجای کرش کردن بهطور غیرقابلپیشبینی، RISC-V یک نتیجه مشخص و قابلپیشبینی برای بازگرداندن در این حالت تعریف میکند، تا نرمافزار بتواند صراحتاً آن را بررسی کند.Signed Division Overflowمیتواند در یک مورد خاص و باریک رخ دهد: تقسیم منفیترین مقدار قابلنمایش بر منفی یک، چون نتیجه صحیح از نظر ریاضی نمیتواند در همان عرض بیتی ثابت نمایش داده شود.
از آنجا که این رفتارها بهطور دقیق تعریف شدهاند نه اینکه نامشخص رها شده باشند، برنامههای در حال اجرا روی پیادهسازیهای مختلف RISC-V حتی وقتی به این شرایط مرزی برخورد میکنند، رفتاری سازگار دارند.
چرا سرعت تقسیم در عمل اهمیت دارد
از آنجا که تقسیم بهطور قابلتوجهی کندتر از جمع یا ضرب روی بیشتر سختافزارهاست، کامپایلرها و برنامهنویسان توجهکننده به کارایی اغلب بهدنبال راههایی برای اجتناب از تقسیم غیرضروری میگردند، برای مثال جایگزینی تقسیم تکراری بر یک ثابت با یک ضرب ازپیشمحاسبهشده واحد در جایی که از نظر ریاضی معتبر باشد، یا بازساختاردهی الگوریتمها برای بهحداقل رساندن دفعاتی که تقسیم باید درون یک حلقه حساس به کارایی اجرا شود.