سخت‌افزار چگونه تقسیم انجام می‌دهد: خارج‌قسمت، باقیمانده و موارد خاص

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

تقسیم باینریخارج‌قسمت و باقیماندهموارد خاص تقسیم

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

چرا تقسیم سخت‌ترین عملیات محاسباتی پایه است

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

الگوریتم مفهومی تقسیم طولانی

تقسیم سخت‌افزاری همان فرآیند تقسیم طولانی که برای اعداد اعشاری آموزش داده می‌شود را منعکس می‌کند، منطبق‌شده با ارقام باینری.

  • 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 حتی وقتی به این شرایط مرزی برخورد می‌کنند، رفتاری سازگار دارند.

چرا سرعت تقسیم در عمل اهمیت دارد

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

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

مقالات مرتبط

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

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

ادامه

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

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

ادامه

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

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

ادامه

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

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

ادامه

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

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

ادامه

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

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

ادامه