پیش‌واکشی حافظه نهان
پیش‌واکشی حافظه نهان ، تکنیکی است که توسط پردازنده‌های رایانه انجام می‌شود و برای تقویت عملکرد اجرای برنامه‌ها است. در این تکنیک، پردازنده دستورالعمل‌ها یا داده‌ها را از حافظه اصلی (حافظه کندتر) به یک حافظه محلی (حافظه تندتر) قبل از اینکه واقعاً مورد نیاز باشد بازیابی می‌کند (از این رو اصطلاح 'prefetch' نامیده می‌شود). اکثر پردازنده‌های کامپیوتری مدرن، دارای حافظه نهان سریع و محلی هستند که داده‌های بازیابی شده را تا زمانی که مورد استفاده قرار نگرفته‌اند در خود نگه می‌دارند. معمولاً عملیات پیش واکشی در حافظه اصلی صورت می‌گیرد. به دلیل طراحی پردازنده‌ها، معمولاً دسترسی به حافظه‌های نهان بسیار سریع‌تر از دسترسی به حافظه اصلی است، بنابراین واکشی اولیه داده‌ها و سپس دسترسی به آن‌ها از طریق حافظه نهان معمولاً چندین مرتبه سریع‌تر از دسترسی مستقیم به آن‌ها از حافظه اصلی است. واکشی اولیه را می‌توان با دستورالعمل‌های کنترل حافظه پنهان غیر مسدود کننده (non-blocking) انجام داد.
پیش واکشی حافظه نهان می‌تواند داده‌ها یا دستورالعمل‌ها را در حافظه پنهان بازیابی کند.
پیش واکشی حافظه نهان می‌تواند توسط سخت‌افزار یا نرم‌افزار انجام شود.روش دیگری برای پیش واکشی دستورالعمل‌ها، پیش واکشی تعدادی آدرس به صورت دنباله هستند. این روش عمدتاً زمانی استفاده می‌شود که بلوک‌های متوالی که قرار است از قبل واکشی شوند، دارای s آدرس جدا از هم هستند،این روش Strided Prefetching نام دارد.
پیش واکشی هدایت شده توسط کامپایلر، در حلقه‌هایی با تعداد زیاد تکرار استفاده می‌شود. در این تکنیک، کامپایلر cache misses را پیش‌بینی می‌کند و یک دستورالعمل پیش واکشی بر اساس جریمه خطا و زمان اجرای دستورالعمل‌ها ایجاد می‌کند.
این پیش واکشی‌ها عملیات حافظه غیر مسدود هستند، یعنی این دسترسی‌های حافظه با دسترسی‌های واقعی حافظه تداخلی ندارند، وضعیت پردازنده را تغییر نمی‌دهند و همچنین باعث وقوع خطا در پردازنده نمی‌شوند.
یکی از مزیت‌های اصلی پیش واکشی نرم‌افزار، کاهش تعداد cache misses است.
مثال زیر نشان می‌دهد که چگونه یک دستورالعمل پیش واکشی به یک کد برای بهبود عملکرد حافظه پنهان اضافه می‌شود.
یک حلقه for را در نظر بگیرید: for (int i=0; i<1024; i++) { در هر تکرار، i امین عنصر از آرایه "array1" قابل دسترسی است؛ بنابراین، می‌توانیم عناصری را که در تکرارهای بعدی به آن نیاز داریم را با قرار دادن یک دستورالعمل "prefetch" مانند شکل زیر پیش واکشی کنیم: for (int i=0; i<1024; i++) { اینجا، گام پیش واکشی، formula_1 به دو عامل بستگی دارد، cache miss penalty و زمان لازم برای اجرای یک تکرار حلقه for. به عنوان مثال، اگر یک تکرار از حلقه ۷ سیکل طول بکشد تا اجرا شود، cache miss penalty چهل و نه چرخه باشد. داریمformula_4. که به این معنی است که باید ۷ عنصر را پیش واکشی کنیم. در زمان اولین تکرار، i=۰ خواهد بود، بنابراین عنصر هفتم را پیش واکشی می‌کنیم. با همین منوال، ۷ عنصر اول (i=۰->۶) همچنان پیش واکشی می‌شوند (به عبارتی دیگر هر عنصر از آرایه۱ در یک خط‌کش برای خودش قرار دارد).سه معیار اصلی برای پیش واکشی حافظه پنهان وجود دارد
پوشش، نسبت تعداد cache misses رخ داده به خاطر پیش واکشی به تعداد کل cache misses است:
formula_5 ،
جایی که، formula_6
دقت، نسبت پیش واکشی مفید (آدرس‌های پیش واکشی شده توسط برنامه) به کل پیش واکشی‌ها.
formula_7
در حالی که به نظر می‌رسد داشتن دقت کامل به معنای عدم وجود خطا است، اگر بلوک‌های پیش واکشی شده مستقیماً در حافظه پنهان قرار گیرند، خود پیش واکشی‌ها ممکن است منجر به خطاهای جدیدی شوند. اگرچه این مورد ممکن است کسر کوچکی از تعداد کل پیش واکشی‌ها باشد ولی احتمالش صفر نیست.
گوییم یک پیش واکشی به موقع است اگر حدفاصل زمان بین پیش واکشی و واکشی کم باشد. یک مثال برای توضیح بیشتر به موقع بودن به شرح زیر است:
یک حلقه for را در نظر بگیرید که در آن هر تکرار ۳ چرخه برای اجرا و عملیات پیش واکشی ۱۲ چرخه طول می‌کشد. این بدان معناست که برای اینکه داده‌های پیش واکشی شده مفید باشند، باید پیش واکشی را formula_8 تکرار قبل از استفاده اصلی انجام دهیم.