سنجش کمی کارایی کش
برای استدلال دقیق بهجای شهودی درباره کارایی کش، دو سنجه ضروریاند: Miss Rate، بخشی از دسترسیهای حافظه که منجر به یک cache miss میشوند، و Miss Penalty، زمان اضافهای که برای واکشی داده از یک سطح کندتر سلسلهمراتب حافظه هنگام رخ دادن یک miss مورد نیاز است.
این دو در یک سنجه کلی واحد ترکیب میشوند:
میانگین زمان دسترسی حافظه =
Hit Time + (Miss Rate × Miss Penalty)این فرمول نشان میدهد بهبود کارایی کش یعنی کاهش یک یا چند مورد از سه عامل: زمان دسترسی به خود کش، دفعات رخ دادن miss، و هزینه هر miss هنگام رخ دادن.
سه C: دستهبندی چرایی رخ دادن Miss ها
Cache miss ها معمولاً در سه دسته گروهبندی میشوند، که اغلب Three Cs نامیده میشوند.
Compulsory Missesاولین باری که یک بلوک از حافظه دسترسی میشود رخ میدهند، چون نمیتواند از قبل در کش باشد. اینها گاهی cold-start miss نامیده میشوند و تا حد زیادی اجتنابناپذیرند.Capacity Missesزمانی رخ میدهند که کش صرفاً برای نگهداشتن تمام دادهای که یک برنامه همزمان نیاز دارد بسیار کوچک است، و بلوکهای قبلاً کششده را مجبور به تخلیه میکند حتی اگر ممکن بود بهزودی دوباره مورد نیاز باشند.Conflict Missesبهطور خاص در کشهای مستقیمنگاشتشده یا با associativity محدود، که پیشتر در این مجموعه بحث شد، رخ میدهند، وقتی دو بلوک حافظه پرکاربرد به همان مکان کش نگاشت میشوند، و بهطور مکرر یکدیگر را تخلیه میکنند حتی اگر کش در کل فضای استفادهنشدهای در جای دیگر داشته باشد.
استراتژی: افزایش Associativity
یک راه برای کاهش conflict miss ها این است که اجازه داده شود هر آدرس حافظه به بیش از یک مکان کش ممکن نگاشت شود بهجای دقیقاً یکی، رویکردی به نام Set-Associative Caching. این کار احتمال برخورد دو بلوک پرکاربرد و تخلیه مکرر یکدیگر را کاهش میدهد، به قیمت نیاز به سختافزار مقایسه اضافی برای بررسی چند مکان ممکن در هر دسترسی.
استراتژی: افزایش اندازه بلوک
همانطور که پیشتر درباره محلیت مکانی بحث شد، افزایش اندازه بلوک میتواند compulsory miss ها را با واکشی داده مجاور مفید بیشتر در هر miss کاهش دهد. با این حال، اگر بیشازحد پیش برود، بلوکهای بزرگتر جریمه miss را افزایش میدهند، چون داده بیشتری باید در هر miss منتقل شود، و اگر داده اضافه در نهایت استفاده نشود میتوانند ظرفیت کش را هدر دهند.
استراتژی: افزودن سطوح کش بیشتر
بهجای تکیه بر یک کش واحد، بیشتر پردازندههای امروزی از یک سلسلهمراتب Multi-Level Cache استفاده میکنند، با یک کش سطحاول بسیار کوچک و بسیار سریع که توسط یک کش سطحدوم بزرگتر و کمی کندتر پشتیبانی میشود، که خود بهنوبهخود توسط حافظه اصلی پشتیبانی میشود. یک miss در سطح اول اغلب همچنان در سطح دوم hit میشود، که جریمه miss میانگین مؤثر را در مقایسه با رفتن تا حافظه اصلی بهطور قابلتوجهی کاهش میدهد.
چرا این مبادلات نیازمند توازن دقیقاند
هرکدام از این استراتژیها یک جنبه از کارایی کش را بهبود میبخشد در حالی که بهطور بالقوه جنبه دیگری را بدتر میکند — کشهای بزرگتر capacity miss را کاهش میدهند اما زمان hit و هزینه را افزایش میدهند، associativity بالاتر conflict miss را کاهش میدهد اما پیچیدگی سختافزاری اضافه میکند، و بلوکهای بزرگتر compulsory miss را کاهش میدهند اما جریمه miss را افزایش میدهند. طراحیهای پردازنده واقعی نتیجه توازن دقیق این عوامل رقیب بر اساس بارهای کاری خاصی هستند که انتظار میرود اجرا کنند.