چه مقدار از فضای صفحه برای پردازنده استفاده می شود. حافظه کش هارد چیست و چه کاربردی دارد؟ معماری ها و اصول کش

چه مقدار از فضای صفحه برای پردازنده استفاده می شود. حافظه کش هارد چیست و چه کاربردی دارد؟ معماری و اصول کش

کش - حافظه (حافظه پنهان, پول نقد, بافر- eng.) - در دستگاه های دیجیتال به عنوان یک کلیپ بورد با سرعت بالا استفاده می شود. حافظه کش را می توان در دستگاه های کامپیوتری مانند پردازنده ها، کارت های شبکه، درایوهای CD و بسیاری دیگر یافت.

اصل عملکرد و معماری کش می تواند بسیار متفاوت باشد.

به عنوان مثال، یک کش می تواند به عنوان یک معمولی عمل کند کلیپ بورد . دستگاه داده ها را پردازش کرده و به یک بافر پرسرعت منتقل می کند، جایی که کنترلر داده ها را به رابط منتقل می کند. چنین حافظه پنهانی برای جلوگیری از خطاها، بررسی سخت افزار داده ها برای یکپارچگی، یا رمزگذاری سیگنال از یک دستگاه به سیگنال قابل فهم برای رابط، بدون تاخیر در نظر گرفته شده است. این سیستم به عنوان مثال در CD/DVDدرایوهای سی دی.

در حالتی دیگر، حافظه پنهان می تواند به آن سرویس دهد ذخیره کدهای پرکاربرد و در نتیجه سرعت پردازش داده ها را افزایش می دهد. به این معنی که دستگاه نیازی به محاسبه یا جستجوی مجدد داده ها ندارد، که بسیار بیشتر از خواندن آن از حافظه پنهان طول می کشد. در این مورد، اندازه و سرعت کش نقش بسیار مهمی دارد.

این معماری اغلب در هارد دیسک ها و واحدهای پردازش مرکزی یافت می شود ( CPU).

هنگامی که دستگاه‌ها در حال کار هستند، برنامه‌های میان‌افزار یا توزیع‌کننده ویژه ممکن است در حافظه پنهان بارگذاری شوند که کندتر کار می‌کنند. رام(حافظه ی فقط خواندنی).

اکثر دستگاه های مدرن استفاده می کنند نوع حافظه پنهان مختلط ، که می تواند به عنوان یک کلیپ بورد و همچنین ذخیره کدهای پرکاربرد عمل کند.

چندین عملکرد بسیار مهم برای حافظه پنهان پردازنده ها و تراشه های ویدئویی پیاده سازی شده است.

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

حافظه پنهان مشترک، همچنین به هسته ها اجازه می دهد تا مستقیماً با آن کار کنند و سرعت آهسته را دور بزنند.

کش برای دستورالعمل ها. یک حافظه پنهان L1 مشترک و بسیار سریع برای دستورالعمل ها و سایر عملیات وجود دارد یا یک کش اختصاصی برای آنها. هر چه دستورالعمل های بیشتری در یک پردازنده ذخیره شود، حافظه پنهان دستورات بیشتری نیاز دارد. این امر تأخیر حافظه را کاهش می دهد و به بلوک دستورالعمل اجازه می دهد تا تقریباً به طور مستقل عمل کند، زمانی که بلوک دستورالعمل به طور دوره ای بیکار می شود، که سرعت محاسبه را کاهش می دهد.

سایر عملکردها و ویژگی ها.

قابل ذکر است که در CPU(واحدهای پردازش مرکزی)، کاربردی تصحیح خطای سخت افزاری (ECC، زیرا یک خطای کوچک در حافظه پنهان می تواند منجر به یک خطای مداوم در طول پردازش بیشتر این داده ها شود.

که در CPUو پردازنده گرافیکیوجود دارد سلسله مراتب کش ، که به شما امکان می دهد داده ها را برای هسته های جداگانه و هسته های عمومی جدا کنید. اگرچه تقریباً تمام داده‌های کش سطح دوم هنوز در سطح سوم و عمومی کپی می‌شوند، اما نه همیشه. اولین سطح حافظه نهان سریعترین است و هر سطح بعدی کندتر اما از نظر اندازه بزرگتر است.

برای پردازنده ها عادی در نظر گرفته می شود سهو سطوح کش کمتر. این امکان ایجاد تعادل بین سرعت، اندازه حافظه پنهان و اتلاف گرما را فراهم می کند. یافتن بیش از دو سطح حافظه پنهان در پردازنده های ویدئویی دشوار است.

اندازه کش، تاثیر عملکرد و سایر ویژگی ها.

طبیعتا، کش بزرگتر است، داده های بیشتری را می تواند ذخیره و پردازش کند، اما یک مشکل جدی وجود دارد.

کش بزرگ- این بودجه بزرگ. در پردازنده های سرور ( CPU) کش می تواند تا 80% بودجه ترانزیستور اولاً این روی هزینه نهایی تأثیر می گذارد و ثانیاً مصرف انرژی و اتلاف گرما افزایش می یابد که قابل مقایسه با افزایش بهره وری چند درصدی نیست.

یکی از عوامل مهمی که عملکرد پردازنده را افزایش می دهد، وجود حافظه کش یا بهتر است بگوییم حجم، سرعت دسترسی و توزیع آن در بین سطوح است.

مدتی است که تقریبا تمامی پردازنده ها به این نوع حافظه مجهز شده اند که بار دیگر مفید بودن حضور آن را ثابت می کند. در این مقاله در مورد ساختار، سطوح و هدف عملی حافظه کش صحبت خواهیم کرد که بسیار مهم است. ویژگی های پردازنده.

حافظه کش چیست و ساختار آن

حافظه کش حافظه بسیار سریعی است که توسط پردازنده برای ذخیره موقت داده هایی که اغلب به آنها دسترسی پیدا می کند استفاده می کند. اینگونه می توان به طور خلاصه این نوع حافظه را توصیف کرد.

حافظه کش بر روی فلیپ فلاپ ها ساخته شده است که به نوبه خود از ترانزیستورها تشکیل شده است. گروهی از ترانزیستورها فضای بسیار بیشتری را نسبت به همان خازن هایی که تشکیل می دهند اشغال می کنند رم. این مستلزم مشکلات زیادی در تولید و همچنین محدودیت در حجم است. به همین دلیل است که حافظه نهان یک حافظه بسیار گران است، در حالی که حجم آن ناچیز است. اما مزیت اصلی چنین حافظه ای از این ساختار ناشی می شود - سرعت. از آنجایی که فلیپ فلاپ ها نیازی به بازسازی ندارند و زمان تاخیر دروازه ای که روی آن مونتاژ می شوند کم است، زمان تعویض فلیپ فلاپ از یک حالت به حالت دیگر بسیار سریع اتفاق می افتد. این به حافظه کش اجازه می دهد تا با فرکانس های مشابه پردازنده های مدرن کار کند.

همچنین یک فاکتور مهم محل قرارگیری حافظه کش است. روی خود تراشه پردازنده قرار دارد که زمان دسترسی را به میزان قابل توجهی کاهش می دهد. پیش از این، حافظه نهان برخی از سطوح خارج از تراشه پردازنده، روی یک تراشه SRAM ویژه در جایی روی مادربرد قرار داشت. در حال حاضر، تقریبا تمام پردازنده ها دارای حافظه کش هستند که روی تراشه پردازنده قرار دارد.


حافظه نهان پردازنده برای چه مواردی استفاده می شود؟

همانطور که در بالا ذکر شد، هدف اصلی حافظه کش ذخیره داده هایی است که اغلب توسط پردازنده استفاده می شود. کش یک بافر است که داده ها در آن بارگذاری می شوند و با وجود اندازه کوچک آن (حدود 4-16 مگابایت) پردازنده های مدرن، عملکرد قابل توجهی را در هر برنامه ای افزایش می دهد.

برای درک بهتر نیاز به حافظه کش، بیایید سازماندهی حافظه کامپیوتر را مانند یک دفتر تصور کنیم. RAM یک کابینت با پوشه‌هایی خواهد بود که حسابدار به صورت دوره‌ای برای بازیابی بلوک‌های بزرگ داده (یعنی پوشه‌ها) به آن دسترسی دارد. و جدول یک حافظه کش خواهد بود.

عناصری هستند که روی میز حسابدار قرار می گیرند که در طول یک ساعت چندین بار به آنها مراجعه می کند. به عنوان مثال، اینها می توانند شماره تلفن، چند نمونه از اسناد باشند. این نوع اطلاعات دقیقاً روی میز قرار می گیرند که به نوبه خود سرعت دسترسی به آنها را افزایش می دهد.

به همین ترتیب، داده‌ها را می‌توان از آن بلوک‌های داده بزرگ (پوشه‌ها) برای استفاده سریع، مثلاً یک سند، به جدول اضافه کرد. زمانی که این سند دیگر مورد نیاز نباشد، مجدداً در کابینت (در حافظه RAM) قرار می‌گیرد و بدین ترتیب جدول (حافظه کش) پاک می‌شود و این جدول برای اسناد جدیدی که در دوره‌های بعدی استفاده خواهند شد آزاد می‌شود.

همچنین در مورد حافظه نهان، اگر داده‌ای وجود داشته باشد که احتمال دسترسی مجدد به آن وجود داشته باشد، این داده از RAM در حافظه نهان بارگذاری می‌شود. اغلب، این اتفاق با بارگذاری مشترک داده‌هایی می‌افتد که به احتمال زیاد بعد از داده‌های فعلی استفاده می‌شوند. یعنی فرضیاتی در مورد آنچه که «بعد» استفاده می شود وجود دارد. اینها اصول پیچیده عملیاتی هستند.

سطوح حافظه نهان پردازنده

پردازنده های مدرن مجهز به کش هستند که اغلب از 2 یا 3 سطح تشکیل شده است. البته استثناهایی هم وجود دارد، اما اغلب اینطور است.

به طور کلی، سطوح زیر می تواند وجود داشته باشد: L1 (سطح اول)، L2 (سطح دوم)، L3 (سطح سوم). حالا کمی جزئیات بیشتر در مورد هر یک از آنها:

حافظه نهان سطح اول (L1)– سریعترین سطح حافظه کش که مستقیماً با هسته پردازنده کار می کند، به لطف این تعامل فشرده، این سطح دارای کمترین زمان دسترسی است و در فرکانس های نزدیک به پردازنده کار می کند. این یک بافر بین پردازنده و حافظه نهان سطح دوم است.

ما حجم ها را روی یک پردازنده با عملکرد بالا Intel Core i7-3770K در نظر خواهیم گرفت. این پردازنده به 4x32 KB L1 cache 4 x 32 KB = 128 KB مجهز شده است. (32 کیلوبایت در هر هسته)

حافظه نهان سطح دوم (L2)- سطح دوم از سطح اول بزرگتر است، اما در نتیجه دارای "ویژگی های سرعت" کمتری است. بر این اساس، به عنوان یک بافر بین سطوح L1 و L3 عمل می کند. اگر دوباره به مثال Core i7-3770 K نگاه کنیم، اندازه حافظه کش L2 4x256 کیلوبایت = 1 مگابایت است.

حافظه نهان سطح 3 (L3)- سطح سوم، دوباره، کندتر از دو سطح قبلی است. اما هنوز خیلی سریعتر از رم است. اندازه کش L3 در i7-3770K 8 مگابایت است. اگر دو سطح قبلی توسط هر هسته مشترک باشد، این سطح برای کل پردازنده مشترک است. رقم کاملاً محکم است، اما گزاف نیست. از آنجایی که به عنوان مثال، برای پردازنده های سری Extreme مانند i7-3960X، 15 مگابایت است و برای برخی از پردازنده های جدید Xeon، بیش از 20.

حافظه نهان پردازنده چیست؟

کش بخشی از حافظه است که حداکثر سرعت دسترسی را فراهم می کند و سرعت محاسبات را افزایش می دهد. داده هایی را که پردازنده اغلب درخواست می کند ذخیره می کند، به طوری که پردازنده نیازی به دسترسی مداوم به حافظه سیستم برای آنها نداشته باشد.

همانطور که می دانید این بخشی از تجهیزات کامپیوتری است که با کندترین سرعت تبادل اطلاعات مشخص می شود. اگر پردازنده به اطلاعاتی نیاز داشته باشد، از طریق گذرگاهی به همین نام برای آن به رم می رود. پس از دریافت درخواستی از پردازنده، در جستجوی داده های مورد نیاز پردازنده شروع به کندوکاو در سالنامه های خود می کند. پس از دریافت، RAM آنها را از طریق همان گذرگاه حافظه به پردازنده ارسال می کند. این دایره برای تبادل داده همیشه خیلی طولانی بود. بنابراین، سازندگان تصمیم گرفتند که می توانند به پردازنده اجازه دهند داده ها را در جایی نزدیک ذخیره کند. روش کار کش بر اساس یک ایده ساده است.

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

چرا پردازنده به کش نیاز دارد؟

حال تصور کنید که کتابدار از این‌که مدام با کتاب‌هایی که سال به سال، روز به روز مدام از او مطالبه می‌شود، این‌طرف و آن طرف عجله کند، خسته شده است. او یک کابینت بزرگ به دست آورد که در آن کتاب‌ها و کتاب‌های درسی را که اغلب درخواست می‌شد، ذخیره می‌کرد. مابقی که قرار داده شده اند البته همچنان در همان قفسه ها نگهداری می شوند. اما اینها همیشه در دسترس هستند. چقدر با این کابینه وقت گذاشت، هم برای خودش و هم برای بقیه. این کش است.

بنابراین، حافظه نهان فقط می تواند بیشترین داده های مورد نیاز را ذخیره کند؟

آره. اما او می تواند کارهای بیشتری انجام دهد. به عنوان مثال، با ذخیره داده های اغلب مورد نیاز، می تواند وضعیت را ارزیابی کند (با کمک پردازنده) و اطلاعاتی را که در شرف نیاز است درخواست کند. بنابراین، مشتری اجاره‌ای ویدیویی که فیلم «سخت بمیر» را با قسمت اول درخواست کرده است، به احتمال زیاد قسمت دوم را درخواست خواهد کرد. و او اینجاست! در مورد کش پردازنده هم همینطور. با دسترسی به RAM و ذخیره داده های خاص، داده ها را از سلول های حافظه مجاور نیز بازیابی می کند. به چنین قطعاتی از داده ها، خطوط کش می گویند.

کش دو سطحی چیست؟

یک پردازنده مدرن دارای دو سطح است. بر این اساس، اول و دوم. آنها با حرف L از سطح انگلیسی مشخص می شوند. اولین - L1 - سریعتر است، اما حجم کمی دارد. دوم - L2 - کمی بزرگتر، اما کندتر، اما سریعتر از RAM است. کش سطح اول به یک کش دستورالعمل و یک کش داده تقسیم می شود. کش دستورالعمل مجموعه دستورالعمل هایی را که پردازنده برای محاسبات نیاز دارد ذخیره می کند. در حالی که کش داده ها مقادیر یا مقادیر مورد نیاز برای محاسبه جاری را ذخیره می کند. و حافظه نهان سطح دوم برای بارگذاری داده ها از رم کامپیوتر استفاده می شود. اصل کار سطوح کش را می توان با استفاده از مثال کتابخانه مدرسه توضیح داد. بنابراین، با پر کردن کابینت خریداری شده، کتابدار متوجه می شود که دیگر برای کتاب کافی نیست، که برای آن دائماً مجبور است در سالن بدود. اما لیست این گونه کتاب ها نهایی شده است و شما باید همان کابینت را خریداری کنید. او اولی را دور نینداخت - حیف شد - و به سادگی دومی را خرید. و حالا که اولی پر می شود، کتابدار شروع به پرکردن دومی می کند که با پر شدن اولی وارد عمل می شود، اما کتاب های لازم در آن نمی گنجد. در مورد سطوح کش هم همینطور است. و با توسعه فناوری ریزپردازنده، سطح حافظه نهان پردازنده افزایش می یابد.

آیا حافظه نهان همچنان به رشد خود ادامه خواهد داد؟

به ندرت. پیگیری فرکانس پردازنده نیز زیاد دوام نیاورد و سازندگان راه های دیگری برای افزایش قدرت پیدا کردند. در مورد کش هم همینطور. به طور خاص، حجم و تعداد سطوح را نمی توان بی پایان افزایش داد. حافظه نهان نباید به یک حافظه رم با سرعت دسترسی کم تبدیل شود یا اندازه پردازنده را به نصف اندازه مادربرد کاهش دهد. از این گذشته، سرعت دسترسی به داده ها، اول از همه، مصرف انرژی و هزینه عملکرد خود پردازنده است. از دست دادن حافظه پنهان (برخلاف بازدیدهای حافظه نهان)، که در آن پردازنده برای داده هایی که وجود ندارد به حافظه کش دسترسی پیدا می کند، نیز بیشتر شده است. داده های موجود در حافظه پنهان با استفاده از الگوریتم های مختلف به طور مداوم به روز می شوند تا احتمال ضربه به حافظه پنهان افزایش یابد.

بخوانید: 644

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

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

هابرکات - - -

مثال 1: دسترسی و عملکرد حافظه

به نظر شما چرخه دوم چقدر سریعتر از چرخه اول است؟
int arr = int جدید;

// اولین
برای (int i = 0; i< arr.Length; i++) arr[i] *= 3;

// دومین
برای (int i = 0; i< arr.Length; i += 16) arr[i] *= 3;


حلقه اول تمام مقادیر آرایه را در 3 ضرب می کند، حلقه دوم فقط هر شانزدهمین مقدار را ضرب می کند. چرخه دوم فقط کامل می شود 6 درصد کار می کندچرخه اول، اما در ماشین های مدرن هر دو چرخه تقریباً در زمان مساوی اجرا می شوند: 80 میلی‌ثانیهو 78 میلی‌ثانیهبه ترتیب (در دستگاه من).

راه حل ساده است - دسترسی به حافظه. سرعت این حلقه ها در درجه اول توسط سرعت زیرسیستم حافظه تعیین می شود و نه با سرعت ضرب اعداد صحیح. همانطور که در مثال بعدی خواهیم دید، تعداد دسترسی به رم در هر دو حالت اول و دوم یکسان است.

مثال 2: تاثیر خطوط کش

بیایید عمیق تر کاوش کنیم و سایر مقادیر مرحله را امتحان کنیم، نه فقط 1 و 16:
برای (int i = 0; i< arr.Length; i += K /* шаг */ ) arr[i] *= 3;

در اینجا زمان اجرای این حلقه برای مقادیر مختلف گام K آمده است:

لطفاً توجه داشته باشید که با مقادیر مرحله از 1 تا 16، زمان عملیات تقریباً بدون تغییر باقی می ماند. اما با مقادیر بیشتر از 16، هر بار که گام را دوبرابر می کنیم، زمان اجرا تقریباً به نصف کاهش می یابد. این بدان معنا نیست که حلقه به نحوی جادویی سریعتر شروع به کار می کند، فقط تعداد تکرارها نیز کاهش می یابد. نکته کلیدی همان زمان عملیات با مقادیر مرحله از 1 تا 16 است.

دلیل این امر این است که پردازنده های مدرن به حافظه یک بایت دسترسی ندارند، بلکه در بلوک های کوچکی به نام خطوط کش دسترسی دارند. به طور معمول اندازه رشته 64 بایت است. وقتی هر مقداری را از حافظه می خوانید، حداقل یک خط کش وارد حافظه پنهان می شود. دسترسی بعدی به هر مقدار از این ردیف بسیار سریع است.

از آنجایی که 16 مقدار int 64 بایت را اشغال می کند، حلقه هایی با مراحل 1 تا 16 به همان تعداد خط کش یا به طور دقیق تر به تمام خطوط کش آرایه دسترسی دارند. در مرحله 32، دسترسی به هر خط دوم، در مرحله 64، به هر چهارم رخ می دهد.

درک این موضوع برای برخی از تکنیک های بهینه سازی بسیار مهم است. تعداد دسترسی به آن بستگی به مکان داده ها در حافظه دارد. برای مثال، داده های تراز نشده ممکن است به جای یک دسترسی به دو دسترسی به حافظه اصلی نیاز داشته باشند. همانطور که در بالا متوجه شدیم، سرعت عملیات دو برابر کمتر خواهد بود.

مثال 3: اندازه های کش سطح 1 و 2 (L1 و L2)

پردازنده های مدرن معمولاً دارای دو یا سه سطح کش هستند که معمولاً L1، L2 و L3 نامیده می شوند. برای اطلاع از اندازه کش ها در سطوح مختلف، می توانید از ابزار CoreInfo یا تابع Windows API GetLogicalProcessorInfo استفاده کنید. هر دو روش همچنین اطلاعاتی در مورد اندازه خط کش برای هر سطح ارائه می دهند.

در دستگاه من، CoreInfo 32 کیلوبایت حافظه پنهان داده L1، 32 کیلوبایت حافظه پنهان دستورالعمل L1 و 4 مگابایت حافظه پنهان داده L2 را گزارش می دهد. هر هسته کش L1 شخصی خود را دارد، حافظه نهان L2 توسط هر جفت هسته مشترک است:

پردازشگر منطقی به نقشه کش: *--- حافظه پنهان داده 0، سطح 1، 32 کیلوبایت، Assoc 8، اندازه خط 64 *--- کش دستورالعمل 0، سطح 1، 32 کیلوبایت، Assoc 8، اندازه خط 64 ---- حافظه پنهان داده 1, Level 1, 32 KB, Assoc 8, LineSize 64 --*-- Instruction Cache 1, Level 1, 32 KB, Assoc 8, LineSize 64 **-- Unified Cache 0, Level 2, 4 MB, Assoc 16, LineSize 64 --*- Data Cache 2, Level 1, 32 KB, Assoc 8, LineSize 64 --*- Instruction Cache 2, Level 1, 32 KB, Assoc 8, LineSize 64 ---* Data Cache 3, Level 1, 32 KB, Assoc 8, LineSize 64 ---* Instruction Cache 3, Level 1, 32 KB, Assoc 8, LineSize 64 --** Unified Cache 1, Level 2, 4 MB, Assoc 16, LineSize 64
بیایید این اطلاعات را به صورت تجربی بررسی کنیم. برای انجام این کار، اجازه دهید آرایه خود را مرور کنیم، هر شانزدهمین مقدار را افزایش دهیم - راهی آسان برای تغییر داده ها در هر خط کش. وقتی به پایان رسیدیم به ابتدا برمی گردیم. بیایید اندازه های مختلف آرایه را بررسی کنیم، زمانی که آرایه دیگر در حافظه پنهان سطوح مختلف قرار نمی گیرد، باید شاهد کاهش عملکرد باشیم.

کد این است:

مراحل int = 64 * 1024 * 1024; // تعداد تکرارها
int lengthMod = arr.Length - 1; // اندازه آرایه -- قدرت دو

برای (int i = 0; i< steps; i++)
{
// x & lengthMod = x % arr.Length، زیرا توان های دو
arr[(i * 16) & lengthMod]++;
}


نتایج آزمون:

در دستگاه من، پس از 32 کیلوبایت و 4 مگابایت کاهش قابل توجهی در عملکرد وجود دارد - این اندازه‌های کش L1 و L2 هستند.

مثال 4: توازی دستورالعمل

حالا بیایید به چیز دیگری نگاه کنیم. به نظر شما کدام یک از این دو حلقه سریعتر اجرا می شود؟
مراحل int = 256 * 1024 * 1024;
int a = جدید int ;

// اولین
برای (int i = 0; i< steps; i++) { a++; a++; }

// دومین
برای (int i = 0; i< steps; i++) { a++; a++; }


به نظر می رسد که حلقه دوم تقریباً دو برابر سریعتر اجرا می شود، حداقل در تمام ماشین هایی که من آزمایش کردم. چرا؟ زیرا دستورات داخل حلقه ها وابستگی داده های متفاوتی دارند. اولین دستورات دارای زنجیره وابستگی زیر هستند:

در چرخه دوم وابستگی ها عبارتند از:

بخش‌های عملکردی پردازنده‌های مدرن قادرند تعداد معینی از عملیات خاص را به طور همزمان انجام دهند، معمولاً تعداد زیادی نیستند. به عنوان مثال، دسترسی موازی به داده ها از حافظه نهان L1 در دو آدرس امکان پذیر است و اجرای همزمان دو دستور ساده حسابی نیز امکان پذیر است. در چرخه اول، پردازنده نمی تواند از این قابلیت ها استفاده کند، اما در چرخه دوم می تواند.

مثال 5: Cache Associativity

یکی از سوالات کلیدی که هنگام طراحی کش باید به آن پاسخ داده شود این است که آیا داده های یک منطقه حافظه خاص را می توان در هر سلول کش ذخیره کرد یا فقط در برخی از آنها. سه راه حل ممکن:
  1. کش نقشه برداری مستقیمداده های هر خط کش در RAM تنها در یک مکان کش از پیش تعریف شده ذخیره می شود. ساده ترین راه برای محاسبه نگاشت این است: row_index_in_memory % number_of_cache_cells. دو خط نگاشت شده به یک سلول نمی توانند همزمان در حافظه پنهان باشند.
  2. N-entry cache جزئی انجمنی، هر خط را می توان در N مکان کش مختلف ذخیره کرد. به عنوان مثال، در یک کش 16 ورودی، ممکن است یک خط در یکی از 16 سلول تشکیل دهنده گروه ذخیره شود. به طور معمول، ردیف‌هایی با بیت‌های شاخص کم‌اهمیت مساوی در یک گروه مشترک هستند.
  3. کش کاملاً انجمنی، هر خطی را می توان در هر مکان کش ذخیره کرد. راه حل در رفتار خود معادل جدول هش است.
حافظه نهان نگاشت مستقیم مستعد مشاجره است، به عنوان مثال، وقتی دو ردیف برای یک سلول با هم رقابت می کنند، به طور متناوب یکدیگر را از حافظه پنهان خارج می کنند، کارایی بسیار پایین است. از سوی دیگر، کش های کاملاً انجمنی، اگرچه عاری از این عیب هستند، اما پیاده سازی آن بسیار پیچیده و پرهزینه است. حافظه نهان تا حدی انجمنی یک مبادله معمولی بین پیچیدگی پیاده سازی و کارایی است.

برای مثال، در دستگاه من، حافظه نهان 4 مگابایتی L2 یک کش 16 ورودی جزئی است. کل RAM بر اساس کمترین بیت های شاخص آنها به مجموعه هایی از خطوط تقسیم می شود، خطوط از هر مجموعه برای یک گروه از 16 سلول کش L2 رقابت می کنند.

از آنجایی که حافظه نهان L2 دارای 65536 سلول (4 * 2 20 / 64) است و هر گروه از 16 سلول تشکیل شده است، در مجموع 4096 گروه داریم. بنابراین، 12 بیت پایینی شاخص ردیف تعیین می کند که این ردیف به کدام گروه تعلق دارد (2 12 = 4096). در نتیجه، ردیف‌هایی با آدرس‌هایی که مضربی از ۲۶۲۱۴۴ (۴۰۹۶ * ۶۴) هستند، در گروهی از ۱۶ سلول مشترک هستند و برای فضا در آن رقابت می‌کنند.

برای تأثیرگذاری تأثیرات انجمنی، باید دائماً به تعداد زیادی ردیف از همان گروه دسترسی داشته باشیم، به عنوان مثال با استفاده از کد زیر:

عمومی استاتیک طولانی UpdateEveryKthByte (بایت arr، int K)
{
const int rep = 1024 * 1024; // تعداد تکرارها

Stopwatch sw = Stopwatch.StartNew();

int p = 0;
برای (int i = 0; i< rep; i++)
{
arr[p]++;

P += K; اگر (p >= arr.Length) p = 0;
}

Sw.Stop();
بازگشت sw.ElapsedMilliseconds.
}


روش هر عنصر Kth آرایه را افزایش می دهد. وقتی به پایان رسیدیم دوباره شروع می کنیم. پس از تعداد بسیار زیادی تکرار (2 20)، ما متوقف می شویم. من اجراهایی را برای اندازه‌های مختلف آرایه و مقادیر K مرحله انجام دادم (آبی - زمان اجرای طولانی، سفید - کوتاه):

مناطق آبی مربوط به مواردی است که با تغییرات ثابت داده ها، حافظه پنهان قادر به جاسازی نیست همه داده های مورد نیاز به طور همزمان. رنگ آبی روشن زمان عملیاتی حدود 80 میلی ثانیه، تقریباً سفید - 10 میلی ثانیه را نشان می دهد.

بیایید به مناطق آبی بپردازیم:

  1. چرا خطوط عمودی ظاهر می شوند؟خطوط عمودی مربوط به مقادیر مرحله ای است که در آنها به تعداد زیادی ردیف (بیش از 16) از یک گروه دسترسی پیدا می شود. برای این مقادیر، حافظه نهان 16 ورودی دستگاه من نمی تواند تمام داده های لازم را در خود جای دهد.

    برخی از مقادیر بد گام دو قدرت هستند: 256 و 512. برای مثال، stride 512 و یک آرایه 8 مگابایتی را در نظر بگیرید. با این مرحله، 32 بخش در آرایه (8 * 2 20 / 262 144) وجود دارد که برای سلول ها در 512 گروه کش (262 144 / 512) با یکدیگر رقابت می کنند. 32 بخش وجود دارد، اما تنها 16 سلول در حافظه پنهان برای هر گروه وجود دارد، بنابراین فضای کافی برای همه وجود ندارد.

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

  2. چرا خطوط عمودی در مرز 4 مگابایت شکسته می شوند؟هنگامی که اندازه آرایه 4 مگابایت یا کمتر است، کش 16 ورودی مانند یک کش کاملاً ارتباطی عمل می کند، یعنی می تواند تمام داده های آرایه را بدون درگیری در خود جای دهد. بیش از 16 منطقه برای یک گروه کش مبارزه نمی کنند (262144 * 16 = 4 * 2 20 = 4 مگابایت).
  3. چرا یک مثلث آبی بزرگ در بالا سمت چپ وجود دارد؟زیرا با یک گام کوچک و یک آرایه بزرگ، حافظه پنهان قادر به جا دادن تمام داده های لازم نیست. در اینجا میزان ارتباط کش نقش ثانویه ای ایفا می کند.

    به عنوان مثال، با اندازه آرایه 16 مگابایت و گام 128، ما به هر 128 بایت دسترسی داریم، بنابراین هر خط کش آرایه دوم را اصلاح می کنیم. برای ذخیره هر خط دوم در حافظه نهان، به 8 مگابایت کش نیاز دارید، اما در دستگاه من فقط 4 مگابایت است.

    حتی اگر حافظه نهان کاملاً ارتباطی باشد، اجازه نمی دهد 8 مگابایت داده در آن ذخیره شود. توجه داشته باشید که در مثالی که قبلاً مورد بحث قرار گرفت، با گام 512 و اندازه آرایه 8 مگابایت، ما فقط به 1 مگابایت حافظه پنهان برای ذخیره تمام داده های لازم نیاز داریم، اما این امر به دلیل ناکافی بودن ارتباط کش غیرممکن است.

  4. چرا سمت چپ مثلث به تدریج شدت می یابد؟حداکثر شدت در مقدار گام 64 بایت رخ می دهد که برابر با اندازه خط کش است. همانطور که در مثال های اول و دوم دیدیم، دسترسی متوالی به همان ردیف عملاً هیچ هزینه ای ندارد. فرض کنید با یک مرحله 16 بایتی، چهار دسترسی به حافظه به قیمت یک بایت داریم.

    از آنجایی که تعداد تکرارها در آزمون ما برای هر مقدار مرحله یکسان است، یک گام ارزانتر منجر به زمان اجرای کمتر می شود.

اثرات کشف شده در مقادیر پارامترهای بزرگ باقی می مانند:

تداعی کش چیز جالبی است که می تواند تحت شرایط خاصی خود را نشان دهد. برخلاف سایر مشکلاتی که در این مقاله به آن پرداخته شد، آنقدرها جدی نیست. این قطعاً چیزی نیست که در هنگام نوشتن برنامه نیاز به توجه مداوم داشته باشد.

مثال 6: پارتیشن بندی کش نادرست

در ماشین های چند هسته ای، ممکن است با مشکل دیگری روبرو شوید - انسجام کش. هسته های پردازنده دارای کش های جزئی یا کاملا مجزا هستند. در دستگاه من، کش های L1 مجزا هستند (طبق معمول)، و همچنین دو کش L2 به اشتراک گذاشته شده توسط هر جفت هسته وجود دارد. جزئیات ممکن است متفاوت باشد، اما به طور کلی، پردازنده های چند هسته ای مدرن دارای حافظه پنهان سلسله مراتبی چند سطحی هستند. علاوه بر این، سریع‌ترین و همچنین کوچک‌ترین حافظه‌های پنهان به هسته‌های جداگانه تعلق دارند.

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

بیایید این مشکل را با کد زیر نشان دهیم:

private static int s_counter = new int ;

خلأ خصوصی UpdateCounter (موقعیت int)
{
برای (int j = 0; j< 100000000; j++)
{
s_counter = s_counter + 3;
}
}


اگر در ماشین چهار هسته ای خود این روش را با پارامترهای 0، 1، 2، 3 به طور همزمان از چهار رشته فراخوانی کنم، زمان اجرا خواهد بود. 4.3 ثانیه. اما اگر متد را با پارامترهای 16، 32، 48، 64 فراخوانی کنم، زمان اجرا فقط خواهد بود 0.28 ثانیه.

چرا؟ در حالت اول، هر چهار مقدار پردازش شده توسط رشته ها در هر زمان معین احتمالاً در یک خط کش ختم می شوند. هر بار که یک هسته مقداری را افزایش می‌دهد، سلول‌های کش حاوی آن مقدار در هسته‌های دیگر را نامعتبر علامت‌گذاری می‌کند. پس از این عملیات، تمام هسته های دیگر باید خط را دوباره کش کنند. این باعث می شود مکانیسم کش غیر قابل اجرا باشد و عملکرد را از بین ببرد.

مثال 7: پیچیدگی سخت افزار

حتی در حال حاضر، زمانی که اصول عملیات کش برای شما مخفی نیست، سخت افزار همچنان شما را شگفت زده می کند. پردازنده‌ها از نظر روش‌های بهینه‌سازی، اکتشافات و سایر ظرافت‌های پیاده‌سازی با یکدیگر تفاوت دارند.

حافظه نهان L1 برخی از پردازنده ها در صورتی که به گروه های مختلف تعلق داشته باشند می تواند به دو سلول به صورت موازی دسترسی داشته باشد، اما اگر به یک گروه تعلق داشته باشند، فقط به صورت متوالی. تا آنجا که من می دانم، برخی حتی می توانند به بخش های مختلف یک سلول به صورت موازی دسترسی داشته باشند.

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

در اینجا یک مثال دیگر از ویژگی های سخت افزاری عجیب و غریب آورده شده است:

خصوصی استاتیک int A, B, C, D, E, F, G;

خلأ استاتیک خصوصی Weirdness()
{
برای (int i = 0; i< 200000000; i++)
{
<какой-то код>
}
}


اگر در عوض<какой-то код>سه گزینه مختلف را جایگزین کنید، می توانید نتایج زیر را دریافت کنید:

افزایش فیلدهای A، B، C، D بیشتر از افزایش فیلدهای A، C، E، G طول می کشد. نکته عجیب تر این است که افزایش فیلدهای A و C بیشتر از فیلدهای A، C طول می کشد. و E, G. من دقیقاً نمی دانم دلایل این امر چیست ، اما شاید آنها به بانک های حافظه مربوط می شوند ( بله، بله، با بانک های حافظه پس انداز معمولی سه لیتری، و نه آن چیزی که فکر می کردید). اگر نظری در این مورد دارید، لطفا در نظرات مطرح کنید.

در دستگاه من، موارد فوق مشاهده نمی شود، با این حال، گاهی اوقات نتایج غیرعادی بدی به دست می آید - به احتمال زیاد، زمانبندی کار "تنظیمات" خود را انجام می دهد.

درسی که از این مثال می‌توان گرفت این است که پیش‌بینی کامل رفتار سخت‌افزار بسیار دشوار است. آره، می توانخیلی پیش بینی کنید، اما باید مدام پیش بینی های خود را از طریق اندازه گیری و آزمایش تایید کنید.

نتیجه

امیدوارم همه چیزهایی که در بالا توضیح داده شد به شما در درک ساختار حافظه پنهان پردازنده کمک کرده باشد. اکنون می توانید این دانش را برای بهینه سازی کد خود در عمل به کار ببرید.

کش حافظه ای است که در پردازنده تعبیه شده است که پرکاربردترین داده ها (دستورات) RAM در آن نوشته می شود که به میزان قابل توجهی سرعت کار را افزایش می دهد.

اندازه کش L1 (از 8 تا 128 کیلوبایت)
اندازه کش سطح 1.
کش سطح 1 بلوکی از حافظه پرسرعت است که مستقیماً روی هسته پردازنده قرار دارد.
داده های استخراج شده از رم در آن کپی می شود.

ذخیره دستورالعمل های هسته به دلیل سرعت پردازش داده های سریع تر، عملکرد پردازنده را بهبود می بخشد (پردازش از حافظه نهان سریعتر از RAM است).

ظرفیت حافظه نهان سطح اول کوچک و بالغ بر کیلوبایت است.
به طور معمول، مدل‌های پردازنده «قدیمی‌تر» حافظه نهان L1 بزرگ‌تری دارند.
برای مدل های چند هسته ای، مقدار حافظه کش L1 برای یک هسته نشان داده شده است.

اندازه کش L2 (از 128 تا 12288 کیلوبایت)
اندازه کش سطح 2.
حافظه نهان L2 بلوکی از حافظه پرسرعت است که همان عملکردهای حافظه نهان L1 را انجام می دهد (به "ظرفیت کش L1" مراجعه کنید)، اما سرعت کمتر و ظرفیت بیشتری دارد.

اگر پردازنده ای را برای کارهای پرمصرف انتخاب می کنید، مدلی با حافظه نهان L2 بزرگ ترجیح داده می شود.
برای پردازنده های چند هسته ای، مقدار کل حافظه کش سطح دوم نشان داده شده است.

اندازه کش L3 (از 0 تا 16384 کیلوبایت)
اندازه کش سطح 3.
کش L3 یکپارچه، همراه با یک گذرگاه سیستم سریع، یک کانال تبادل داده با سرعت بالا با حافظه سیستم را تشکیل می دهد.

به عنوان یک قاعده، فقط CPU های راه حل های سرور یا نسخه های ویژه پردازنده های "رومیزی" مجهز به حافظه کش سطح سوم هستند.

به عنوان مثال، خطوط پردازنده مانند Intel Pentium 4 Extreme Edition، Xeon DP، Itanium 2، Xeon MP و سایرین دارای حافظه کش سطح سوم هستند.

Twin BiCS FLASH - فناوری جدید حافظه فلش سه بعدی

در 11 دسامبر 2019، در نشست بین المللی دستگاه های الکترونیکی IEEE (IEDM)، شرکت TOKYO-Kioxia فناوری حافظه فلش سه بعدی - Twin BiCS FLASH را معرفی کرد.

AMD Radeon Software Adrenalin Edition 2020 Driver 19.12.2 WHQL (اضافه شده)

در 10 دسامبر، AMD مگا درایور Radeon Software Adrenalin 2020 Edition 19.12.2 WHQL را معرفی کرد.

به روز رسانی تجمعی ویندوز 10 1909 KB4530684

در 10 دسامبر 2019، مایکروسافت به‌روزرسانی تجمعی KB4530684 (Build 18363.535) را برای به‌روزرسانی نوامبر 2019 ویندوز 10 (نسخه 1909) در سیستم‌های مبتنی بر پردازنده x86، x64 (amd64)، ARM64 و Windows Server 2019 (1909 x.4) منتشر کرد.

درایور NVIDIA Game Ready GeForce 441.66 WHQL

درایور NVIDIA GeForce Game Ready 441.66 WHQL شامل پشتیبانی از MechWarrior 5: Mercenaries و Detroit: Become Human است و همچنین پشتیبانی G-SYNC را برای نمایشگرهای MSI MAG251RX و ViewSonic XG270 اضافه می کند.

دیدگاه ها