مفهوم cache miss - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مفهوم cache miss

+5 امتیاز
cache miss یعنی چی ؟  

چه وقت رخ میده ؟

چطوری میشه از رخ دادنش جلوگیری کرد ؟
سوال شده شهریور 10, 1393  بوسیله ی OptiMan (امتیاز 124)   2 9 16
دوباره تگ گذاری شد شهریور 14, 1393 بوسیله ی OptiMan

1 پاسخ

+7 امتیاز
 
بهترین پاسخ
سلام .

شما وقتی میخواهید به یک آدرسی توی RAM مقداری رو تغیبر بدید (بنویسید/بخوانید) ، اینکار مستقیما انجام نمیشه .

برای مثال اگه فرض کنیم که سرعت دسترسی به RAM به اندازه 50 واحد زمانی طول بکشه . سرعت دسترسی به Cache  به اندازه 5 واحد زمانی است . (این فقط مثال بود ، سرعت ها متغییر هست ، ولی همیشه Cache واحد زمانی خیلی کمتری برای دسترسی میخواد ، این یعنی سرعت بیشتر )

هر بار که شما به داده ای اشاره میکنید . اگر اون داده توی Cache نباشه ، سیستم میاد داده رو از داخل RAM به Cache میاره و اونموقع که داده توی Cache هست شما باهاش کار میکنید .

درواقع شما با Cache کار میکنید .

و Cache از Cache Line ها تشکیل شده . و هر Cache Line به اندازه ی 64 بایت هست . (بستگی به سیستم داره که Cache Line هاش چقدر باشه )

خلاصه ، حالا شما میاد مثلا میخواید توی آدرس 0x000010 داده رو به اندازه 8 بایت بخونید .

اول داخل Cache بررسی میشه تا معلوم بشه این آدرس توی Cache هست یا نه . اگر باشه بهش میگن Cache-Hit .

اگر اون آدرس توی Cache  نباشه ، سیستم میره از RAM اون آدرس رو میاره توی Cache . پس اینجا آدرسی که شما بهش دادید توی Cache نبود . به این میگن Cache-Miss .

حالا نسبت به واحد های زمانی که RAM و Cache دارن اگر حساب کنیم ، توی Cache-Miss شما باید 50 واحد زمانی اضافه رو برای آوردن داده از RAM به Cache داشته باشید .

ولی توی Cache-Hit شما فقط همون 5 واجد زمانی رو دارید . چون داده در حال حاظر توی Cache هست .

برای جلوگیری از Cache-Miss و شما باید داده هاتون رو چسبیده به هم قرار بدید .

چون هر بار که از RAM داده ای به Cache میاد به اندازه ی Cache-Line  ( برای مثال Cache-Line به اندازه ی ۶۴ بایت هست ) میاد توی Cache .

و با داده ای که توی Cache کمتز از همه استفاده شده جایگذین میشه .

حالا اگر شما متغییر اولتون رو توی Cache بیارید و اگر مثلا متغییر شما ۴ بایت باشه ، تا ۶۰ بایت بعدی این متغییر هم داخل Cache میاد .

پس شما دیگه نیازی به آوردن متغییر هایی که تا ۶۰ بایت بعد از متغییرتون هستند رو به Cache ندارید .

پس داده هایی که باهم استفاده میشن رو پراکنده توی آدرس های مختلف قرار ندید .

یعنی به صورت خطی باشن .

مثلا توی Linked-List اشیا  توی آدرس ها مختلفی هستند .

اگر شما توی Linked-List به شی اولی دسترسی پیدا کنید . اشیا بعدی دقیق پشت سر اون شی نیستند و برای دسترسی به اونها شما Cache-Miss دارید .

ولی توی Vector اشیا پشت سر هم هستند و شما به شی اولی دسترسی پیدا کنید ، شی های بعدی هم توی Cache میان . (به دلیل اندازه Cache-Line )

یه نکته هم هست ، خود Cache به صورت چند تا سطح (Level) هست . ( معمولا ۳ تا سطح داره )

یعنی هر داده ای که Cache-Hit بیشتری میگیره ، به سمت سطح سرعتی تر Cache منتقل میشه .
پاسخ داده شده شهریور 14, 1393 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
انتخاب شد شهریور 14, 1393 بوسیله ی OptiMan
cache miss و ساختار unrolled linked list
این که چه اطلاعاتی وارد cache میشن بر عهده سیستم عامل هست یا cpu ؟‌ راهی وجود داره که از طریق برنامه نویسی تعیین کنیم چه اطلاعاتی وارد cache بشن ؟
خوب معلومه شما !
شما وقتی میگید که توی فلان متغییر فلان مقدار رو بنویس ، cpu به اندازه Cache-Line اون رو میاره توی Cache بعد روی اون مینویسه .
پس شما میگید که چی بیاد توی Cache .

جدا از اینها من خودم دنبال روشی هستم که بتونم مثلا یه Cache-Line رو همیشه ثابت نگه دارم ، طوری که چیزی جاگذینش نشه . تا بتونم قسمتی که خیلی توی برنامه ازش استفاده میکنم و حالت بحرانی داره رو توی اون قرار بدم تا سرعت بیشتر بشه .
...