تسریع ضرب ماتریس و درس‌های کلیدی فصل سوم

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

کارایی ضرب ماتریسمغالطات محاسباتیجمع‌بندی فصل سوم

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

چرا ضرب ماتریس تناسب طبیعی با موازی‌سازی دارد

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

به‌کارگیری موازی‌سازی زیرکلمه‌ای برای ضرب ماتریس

به‌جای محاسبه هر ضرب و جمع در یک ماتریس یکی‌یکی، یک پردازنده با استفاده از Subword Parallelism می‌تواند چند مقدار از یک ردیف و یک ستون را در یک رجیستر پهن واحد بسته‌بندی کند و چندین عملیات ضرب-و-جمع را به‌طور هم‌زمان درون یک دستور انجام دهد.

به‌جای:
result += a[0]*b[0]
result += a[1]*b[1]
result += a[2]*b[2]
result += a[3]*b[3]
(4 گام جداگانه ضرب-جمع)

با استفاده از موازی‌سازی زیرکلمه‌ای:
یک دستور همه 4 جفت را
به‌طور هم‌زمان ضرب و جمع می‌کند

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

مغالطات رایج درباره محاسبات کامپیوتری

چند سوءتفاهم پایدار درباره سخت‌افزار محاسباتی ارزش پرداختن مستقیم دارند.

  • فرض اینکه اعداد ممیز شناور می‌توانند هر عدد حقیقی را دقیقاً نمایش دهند — همان‌طور که پیش‌تر پوشش داده شد، بیشتر مقادیر اعشاری به نزدیک‌ترین تقریب قابل‌نمایش گرد می‌شوند.
  • فرض اینکه ضرب و تقسیم همیشه همان زمان جمع را می‌گیرند — در واقعیت، این عملیات‌ها به گام‌های سخت‌افزاری قابل‌توجهی بیشتری نیاز دارند، همان‌طور که پیش‌تر در این مجموعه شرح داده شد.
  • فرض اینکه سرریز در همه موارد به‌طور خودکار توسط سخت‌افزار تشخیص داده و گزارش می‌شود — RISC-V، همان‌طور که بحث شد، تشخیص سرریز علامت‌دار را عمدتاً به نرم‌افزار واگذار می‌کند نه اینکه به‌طور خودکار trap کند.

دام‌های رایج در کد سنگین از نظر محاسباتی

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

  • مقایسه مقادیر ممیز شناور برای برابری دقیق به‌جای بررسی اینکه آیا درون یک تلورانس قابل‌قبول کوچک نسبت به هم قرار دارند.
  • ترکیب مقادیر علامت‌دار و بدون‌علامت در همان مقایسه یا محاسبه بدون در نظر گرفتن اینکه چقدر متفاوت همان الگوی بیتی را تفسیر می‌کنند.
  • نادیده گرفتن هزینه کارایی تقسیم غیرضروری درون حلقه‌هایی که تعداد بسیار زیادی بار اجرا می‌شوند.

جمع‌بندی فصل: از بیت‌ها تا اعداد دنیای واقعی

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

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

مقالات مرتبط

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

یک کش فقط به این دلیل کار می‌کند که برنامه‌ها تمایل دارند داده یکسان یا نزدیک به هم را به‌طور تکراری دسترسی کنند نه به‌صورت تصادفی. این مقاله اصل محلیت که کش را مؤثر می‌کند را توضیح می‌دهد، یک کش مستقیم‌نگاشت‌شده چگونه داده را با استفاده از یک آدرس مکان‌یابی می‌کند، و در یک hit کش در مقابل یک miss کش چه اتفاقی می‌افتد.

ادامه

سلسله‌مراتب حافظه: چرا کامپیوترها از چند نوع حافظه استفاده می‌کنند

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

ادامه

تصورات غلط رایج درباره طراحی پردازنده و تصویر کلی فصل چهارم

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

ادامه

پایپ‌لاین‌های دنیای واقعی: مقایسه ARM و Intel، و تسریع ضرب ماتریس

مفاهیم نظری پایپ‌لاین در پردازنده‌های تجاری واقعی شکل مشخصی به خود می‌گیرند، که بسته به اهداف طراحی‌شان از نظر عمق پایپ‌لاین و عرض صدور به‌طور گسترده متفاوت‌اند. این مقاله مقایسه می‌کند ARM Cortex-A53 و Intel Core i7 چگونه پایپ‌لاینینگ را متفاوت برای کارایی توان در مقابل کارایی خام پیاده‌سازی می‌کنند، سپس نشان می‌دهد موازی‌سازی سطح دستور چگونه ضرب ماتریس را در عمل تسریع می‌کند.

ادامه

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

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

ادامه

یک پردازنده پایپ‌لاین‌شده چگونه استثناها را مدیریت می‌کند

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

ادامه