Cache Coherency و False Sharing
مفاهیم پرفورمنس در سیستم های Multithreaded
تو پردازنده های مدرن، هر هسته برای دسترسی سریع تر به داده ها از L1/L2 Cache اختصاصی خودش استفاده میکنه. برای این که مطمئن بشن مقدار یک متغیر تو کش همه هسته ها همگامه، از پروتکل هایی مثل MESI استفاده میشه. نکته اینجاست که پردازنده متغیرهارو تک تک کش نمیکنه، بلکه کل یک بلوک حافظه (معمولا 64 bit) تحت عنوان Cache Line رو جابه جا میکنه.
False Sharing
زمانی اتفاق می افته که دو ترد مجزا روی دو هسته مختلف، با متغیرهای کاملا متفاوتی کار میکنن اما این متغیرها به صورت تصادفی تو یک Cache Line مشترک در حافظه قرار بگیرن. هر بار که هسته A متغیر خودش رو مینویسه، کل لاین کش رو invalidate میکنه و هسته B مجبور میشه کل خط رو دوباره لود کنه. نتیجه؟ افت وحشتناک پرفورمنس به خاطر Cache Thrashing، بدون این که حتی یک Race Condition واقعی داشته باشید.
حلش معمولا با Data Alignment و Padding انجام میشه (مثل تابع alignas(64) در C++)
@Buddy_R
Post #466
187

- ❤ 1