انحراف حافظه

این مقاله در حال ترجمه از ویکی انگلیسی است لطفاً حذف نشود.

انحراف حافظه (به انگلیسی: Memory divergence) یک مفهوم در معماری کامپیوتر و رایانش موازی است. این پدیده زمانی رخ می‌دهد که رشته‌های پردازشی (Threads) در یک دسته واحد (مانند یک وارپ در پردازنده‌های گرافیکی انویدیا)، به آدرس‌های حافظه‌ای دسترسی پیدا می‌کنند که به‌طور فیزیکی از یکدیگر دور هستند. در معماری‌های موازی مدرن، دسترسی‌های حافظه ترجیحاً باید به صورت «ادغام شده» (Coalesced) باشند؛ یعنی رشته‌ها همزمان به یک بلوک حافظه متصل دسترسی یابند. زمانی که این اتفاق نمی‌افتد، انحراف حافظه رخ داده و باعث می‌شود چندین تراکنش حافظه جداگانه صادر شود که منجر به کاهش شدید سرعت پردازش می‌گردد.

 علت‌ها و تأثیر بر عملکرد 
در پردازنده‌های گرافیکی مدرن (GPU)، رشته‌ها در گروه‌هایی به نام وارپ سازماندهی می‌شوند. تمام رشته‌ها در یک وارپ، یک دستورالعمل واحد را در یک زمان اجرا می‌کنند (مدل SIMT). زمانی که یک دستورالعمل دسترسی به حافظه اجرا می‌شود، اگر آدرس‌های درخواست شده توسط تمام رشته‌ها در یک محدوده کوچک و متصل از حافظه باشد، سخت‌افزار می‌تواند این درخواست‌ها را در یک تراکنش واحد ادغام کند.

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

 راهکارهای بهینه‌سازی 
برای مقابله با انحراف حافظه و بهبود کارایی در برنامه‌نویسی موازی (مانند CUDA یا OpenCL)، توسعه‌دهندگان از راهکارهای مختلفی استفاده می‌کنند:

 استفاده از حافظه اشتراکی (Shared Memory): داده‌ها را ابتدا به صورت ادغام‌شده از حافظه اصلی به حافظه اشتراکی (که داخل تراشه و بسیار سریع‌تر است) منتقل کرده و سپس رشته‌ها به صورت غیرادغام‌شده از آنجا داده را می‌خوانند.
 تغییر ساختار داده (AoS به SoA): تبدیل ساختار آرایه از «آرایه‌ای از ساختارها» (Array of Structures) به «ساختاری از آرایه‌ها» (Structure of Arrays) که باعث می‌شود دسترسی به یک فیلد خاص توسط تمام رشته‌ها، در حافظه به صورت متوالی قرار بگیرد.
 بازآرایی رشته‌ها: تغییر نحوه نگاشت رشته‌ها به داده‌ها به گونه‌ای که رشته‌های همسایه در یک واژت، به داده‌های همسایه در حافظه دسترسی داشته باشند.

این بهینه‌سازی‌ها باعث می‌شود که نرخ استفاده از پهنای باند حافظه (Memory Bandwidth Utilization) به حداکثر برسد و گلوگاه‌های ارتباطی بین پردازنده و حافظه کاهش یابد.

 منابع 

رده:معماری کامپیوتر
رده:پردازش موازی