سخت‌افزار چگونه اعداد را ضرب می‌کند: از منطق ساده تا مدارهای واقعی

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

ضرب باینریسخت‌افزار ضرب‌کنندهضرب علامت‌دار

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

چرا ضرب گران‌تر از جمع است

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

الگوریتم پایه ضرب

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

  • هر بیت از Multiplier را یکی‌یکی بررسی کن، شروع از کم‌ارزش‌ترین بیت.
  • اگر آن بیت ۱ باشد، یک کپی شیفت‌داده‌شده از Multiplicand را به یک مجموع در حال اجرا به نام Product اضافه کن.
  • اگر آن بیت ۰ باشد، جمعی برای آن گام نیاز نیست، اما multiplicand همچنان به چپ شیفت داده می‌شود برای آماده‌سازی برای بیت بعدی.
  • این فرآیند را برای هر بیت از multiplier تکرار کن، و نتیجه را در product جمع کن.

یک تصویرسازی ساده‌شده با استفاده از مقادیر ۴ بیتی کوچک:

Multiplicand: 0010 (2)
Multiplier:   0011 (3)

گام ۱ (بیت ۰ = ۱): Product += 0010
گام ۲ (بیت ۱ = ۱): Product += 0010 شیفت‌داده‌شده به چپ به‌اندازه ۱ (0100)
نتیجه: 0010 + 0100 = 0110 (6)

چرا نتیجه به دو برابر عرض بیتی نیاز دارد

ضرب دو عدد n بیتی می‌تواند نتیجه‌ای تولید کند که برای نمایش بدون از دست دادن اطلاعات، تا 2n بیت نیاز دارد. برای مثال، ضرب دو مقدار ۳۲ بیتی می‌تواند به یک نتیجه کامل ۶۴ بیتی نیاز داشته باشد. به همین دلیل، پردازنده‌ها یا یک رجیستر نتیجه گسترده‌تر برای ضرب تولید می‌کنند یا دستورات جداگانه‌ای برای بازیابی نیمه‌های بالایی و پایینی نتیجه ضرب به‌طور جداگانه فراهم می‌کنند.

ضرب علامت‌دار

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

چرا این موضوع برای کارایی نرم‌افزار اهمیت دارد

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

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

مقالات مرتبط

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

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

ادامه

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

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

ادامه

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

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

ادامه

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

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

ادامه

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

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

ادامه

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

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

ادامه