بزرگنمايي:
سیاست و بازاریابی - طراحی کش و سیستم کشینگ یکی از مهمترین اتفاقات در تاریخ کامپیوتر به شمار میرود. تمام پردازندههای امروزی از آنهایی که در موبایلها استفاده میشوند تا پردازندههای قدرتمند سرورها همگی حافظهی کش دارند. اما کش چیست و چرا وجود آن در پردازنده اهمیت دارد؟
تقریبا تمام پردازندهها از پردازندههای کممصرف و کمتوانی مانند Cortex-A5 آرم تا پردازندههای قدرتمندی همچون Core i7 اینتل همگی از حافظهی پرسرعتی بهنام کش (Cache) بهره میبرند. حتی میکروکنترلرهای ردهبالا نیز عموما کَشِ کوچکی دارند. با وجود اینکه در طراحی آنها مصرف انرژی اهمیت زیادی دارد و کش نیز انرژی مصرف میکند، اما مزیتهای حافظهی کش آنقدر مهم هستند که استفاده از کش را توجیه میکند. کشینگ و استفاده از کش اختراع شد تا یک مشکل جدی را حل کند. در دهههای اولیهی ظهور کامپیوتر، حافظهی اصلی بهشدت کند و بسیار گران بود و از طرفی پردازندهها نیز چندان سریع نبودند. در دههی 1980 اختلاف سرعت بین حافظه و پردازنده افزایش یافت و سرعت کلاکِ میکروپروسسورها مدام در حال افزایش بود. در این شرایط همچنان حافظهها کند بودند و درواقع نمیتوانستند پا به پای پردازندهها دسترسی به اطلاعات را فراهم کنند. اینجا بود که لزوم ساخت حافظههای سریعتر حس شد. در نمودار زیر میتوانید رشد سرعت حافظههای DRAM و CPUها را طی سالهای 1980 تا 2000 مشاهده کنید:
در سال 1980 کش در میکروپروسسورها وجود نداشت. در سال 1995 استفاده از سطح دوم کش رواج یافت. حافظه کش چیست و چطور کار میکند؟
کش به زبان ساده یک حافظهی بسیار سریع است که دقیقا درکنار واحدهای منطقی پردازندهی مرکزی قرار میگیرد. البته قطعا حافظهی کش بیش از این تعریف یک خطی در قدرت و سرعت پردازنده کاربرد و تأثیر دارد. برای درک ابتدایی ساختار و کاربرد کش، یک حافظهی فرضی بدون نقص را در نظر بگیرید. سیستم ذخیرهسازی جادویی ما، بینهایت سریع است و توانایی ذخیرهسازی بینهایت تراکنش داده را دارد. همچنین دادههای موجود در سیستم مذکور، برای همیشه امن هستند. قطعا چنین حافظهای وجود خارجی ندارد، اما اگر این سیستم توسعه پیدا میکرد، طراحی پردازندهها بسیار آسان میشد. پردازندهها در چنین فرضیهای تنها برای انجام فرایندهای ریاضی به واحدهای منطقی نیاز پیدا میکردند. یک سیستم هم برای مدیریت تبادل دادهها مورد استفاده قرار میگرفت. ازآنجاکه سیستم جادویی فرضی، امکان ارسال و دریافت آنی تمامی اعداد را داشت، هیچیک از واحدهای منطقی پردازنده، نیازی به منتظر ماندن برای تبادل دادهها نداشتند. همانطور که میدانیم، سیستم جادویی فرضیهی بالا وجود ندارد و احتمال توسعهی آن نیز به صفر میل میکند. بهجای سیستم مذکور، درحالحاضر درایوهای حالت جامد را در دست داریم که حتی بهترین نمونهها در میان آنها نیز توانایی مدیریت تمامی تبادلهای دادهای موردنیاز پردازندههای عادی را ندارند.
برای رفع چالش بالا، باید سیستم ذخیرهسازی دادهی دیگری بین پردازنده و حافظه ذخیره سازی اصلی اضافه کنیم. حافظهی جدید، باید سریعتر از درایو بوده و توانایی مدیریت تمامی فرایندهای تبادل داده را بهصورت همزمان داشته باشد. از همه مهمتر، این حافظه باید هرچه بیشتر به پردازنده نزدیک باشد. حافظهای که ترکیبی از پیشنیازها را داشته باشد، در کامپیوترهای شخصی وجود دارد و آن را بهنام رم (RAM) میشناسیم. به بیان بهتر، نام DRAM برای این نوع از حافظه استفاده میشود که توانایی تبادل دادهها را با سرعتی بسیار بیشتر از هر درایو ذخیرهسازی دارد.
حافظههای SRAM با وجود سرعت بیشتر، باز هم محدودیت فضا دارند. حافظههای مبتنی بر ترانزیستور، فضای بسیار بیشتری نسبت به DRAM اشغال میکنند. یک ماژول SRAM با ابعاد فیزکی نزدیک به یک ماژول DDR4، تنها 100 مگابایت حافظهی ذخیرهسازی دارد. البته ازآنجاکه SRAM با فرایندی شبیه به ساخت CPU تولید میشود، میتوان از آن در داخل تراشهی پردازندهی مرکزی استفاده و حافظه را هرچه نزدیکتر به واحدهای منطقی جانمایی کرد. در مراحل بالا، در هر مرتبه که یک فرایند ذخیرهسازی بین درایو ذخیرهسازی و پردازنده اضافه کردیم، سرعت افزایش پیدا کرد و ظرفیت کمتر شد. هنوز هم میتوان در فرایندهای بالا، مراحلی را اضافه کرد تا حافظههایی با ظرفیت کمتر و سرعت بیشتر، به سیستم اضافه شوند. باتوجهبه توضیحات بالا، اکنون میتوان تعریف فنی و دقیقتری از حافظهی کش ارائه کرد. حافظهی کش، تعدادی بلوک حافظهی SRAM است که همگی در داخل پردازنده قرار دارند. این واحدها وظیفه دارند تا واحدهای منطقی پردازنده را همیشه مشغول نگه دارند. آنها داده را با سرعتهایی بسیار بالا به واحدهای منطقی ارسال کرده و از آنها دریافت میکنند. کش یا پارکینگ طبقاتی
همانطور که دیدید، کش به این دلیل ایجاد شد که هیچ سیستم جادویی ذخیرهسازی برای پاسخ به نیازهای شدید دادهای واحدهای منطقی پردازنده وجود ندارد. پردازندههای مدرن مرکزی و گرافیکی امروزی، همگی دارای تعدادی بلوک SRAM هستند که ازلحاظ داخلی بهصورت سلسلهمراتبی دستهبندی شدهاند. درنهایت، ترتیبی از حافظههای کش شبیه به تصویر زیر، جانمایی شدهاند.
درتصویر بالا، نمای نزدیکی از یک هستهی پردازندهی رومیزی اینتل اسکایلیک را مشاهده میکنید. واحدهای ALU و رجیستر در بالا و سمت چپ تصویر دیده میشوند که در داخل چهارضلعی سبز قرار دارند. در سمت راست و بالای تصویر، حافظهی کش L1 در چهارضلعی سفید دیده میشود. این حافظه ظرفیت محدود 32 کیلوبایتی دارد. همانطور که میبینید، L1 مانند رجیستر در فاصلهی بسیار نزدیک به واحدهای منطقی قرار دارد و سرعتی برابر با آنها را ارائه میکند. چهارضلعی سفیدرنگ دیگر در تصویر بالا، کش موسوم به Level 1 Instruction را نشان میدهد که آن هم ظرفیت محدود 32 کیلوبایتی دارد. همانطور که از نام حافظه بر میآید، وظیفهی ذخیرهسازی دستورهای متعددی را برعهده دارد که آمادهی تقسیمشدن به عملیات کوچکتر موسوم به μops هستند و درنهایت برای ALU ارسال میشوند. برای این دستورها نیز یک حافظهی کش وجود دارد که بهنام L0 شناخته میشود. این حافظه کوچکتر است و در فاصلهای نزدیکتر نسبت به حافظهی L1 قرار میگیرد. L0 تنها توانایی ذخیرهسازی 1،500 عملیات را دارد. شاید از خود بپرسید که چرا بلوکهای حافظهی SRAM در پردازنده کوچک هستند و آنها را در ظرفیتهای مگابایتی تولید نمیکنند. دادهها و دستورالعملهایی که در کش نگهداری میشوند، فضایی برابر با واحدهای منطقی در تراشهی پردازنده اشغال میکنند. درنتیجه افزایش ابعاد آنها منجر به افزایش ابعاد کل قالب تراشه میشود. البته دلیل اصلی پایین بودن ظرفیت در حد کیلوبایت این است که با افزایش ابعاد سیستم ذخیرهسازی، زمان موردنیاز برای دسترسی به داده هم افزایش پیدا میکند. حافظهی L1 باید سرعت عمل بسیار زیادی داشته باشد. به همین دلیل باید بین ابعاد و سرعت تعادل ایجاد شود. برای دسترسی به داده در این حافظه و استخراج آن، حداقل به پنج سیکل کلاک نیاز داریم.
تصویر بالا از تراشهی اینتل Kaby Lake، چهار هسته را در سمت چپ و مرکز نشان میدهد (نیمی از تراشه در سمت راست، توسط پردازندهی گرافیکی یکپارچه اشغال شده است). هر هسته، مجموعهای اختصاصی از حافظههای کش L1 و L2 دارد که در چهارضلعیهای سفید و زرد میبینید. البته هستهها مجهز به یک لایهی سوم از حافظهی SRAM نیز هستند. کش L3 یا Level 3 در اطراف یک هستهی تکی دیده شده، اما با هستههای دیگر به اشتراک گذاشته میشود. درواقع هر هسته میتواند آزادانه به دادههای موجود در کش L3 دیگر دسترسی پیدا کند. این حافظهها ظرفیت بسیار بیشتری به کشهای دیگر دارند و عموما بین دو تا 32 مگابایت ظرفیت ارائه میکنند. البته سرعت آنها کمتر است و بهصورت میانگین به 30 چرخهی کلاک میرسد. از همه مهمتر، اگر هستهای به دادههای موجود در بلوک کش در فاصلهی دور نیاز داشته باشد، سرعت کاهش پیدا میکند. در تصویر زیر، یک هستهی تکی در معماری AMD Zen 2 را مشاهده میکنید. کش L1 با ظرفیت 32 کیلوبایت در مستطیلهای سفید، کش L2 با ظرفیت 512 کیلوبایت در مستطیلهای زرد و کش بزرگ چهار مگابایتی L3 در مستطیل قرمز دیده میشود.
کش، با افزایش سرعت تبادل داده به واحدهای منطقی و نگه داشتن یک کپی از دستورالعملهای رایج و پرکاربرد در فاصلهای نزدیک به واحدها، قدرت و بهرهوری پردازنده را افزایش میدهد. اطلاعاتی که در کش ذخیره شده، به دو بخش تقسیم میشود: خود داده و موقعیت آن در حافظهی ذخیرهسازی اصلی سیستم. موقعیت یا آدرس، بهنام برچسب یا تگ کش شناخته میشود. وقتی پردازنده، یک عملیات را با نیاز به خواندن یا نوشتن داده از حافظه اجرا میکند، ابتدا تگهای موجود در کش L1 بررسی میشوند. اگر تگ مناسب در L1 موجود باشد، دسترسی به داده بهسرعت رخ میدهد (Cache Hit)، اگر هم تگ در حافظهی کش سطح پایین پیدا نشود، رخداد موسوم به Cache Miss اتفاق میافتد. در چنین وضعیتی یک تگ جدید در L1 ساخته شده و سایر بخشهای معماری پردازنده، وارد عمل میشود تا داده را در کشهای سطوح دیگر جستوجو کند. درنهایت شاید پردازنده مجبور به مراجعه به حافظهی ذخیرهسازی اصلی بشود. ازطرفی برای ایجاد فضا در حافظهی L1، همیشه باید بخش دیگر از داخل L2 خارج شود. فرایندی که در بالا توضیح داده شد باعث میشود که همیشه، دادهها در روندی تصادفی جابهجا شوند که البته فرایند در چند چرخهی محدود پردازنده رخ میدهد. برای رسیدن به چنین عملکردی به ساختاری پیچیده نیاز داریم که مدیریت SRAM و دادهها را برعهده بگیرد. به بیان سادهتر، اگر یک هستهی پردانده تنها یک واحد منطقی داشته باشد، حافظهی L1 بسیار یادهتر میشود، اما ازآنجاکه چندین واحد منطقی در پردازنده داریم، کش برای حفظ جریان دادهها به چندین اتصال نیاز پیدا میکند. با استفاده از نرمافزارهای رایگان مانند CPU-Z میتوانید اطلاعاتی کلی از ساختار پردازندهی مرکزی خود به دست بیاورید. درک این اطلاعات، کمک شایانی به درک بهتر ساختار کش میکند. یکی از مهمترین المانهای اطلاعاتی، set associative نام دارد که قوانین و دستورالعملهای چگونگی کپی کردن بلوکهای داده از حافظهی سیستم به کش را مشخص میکند.
در طراحی کش، ساختار و دستورالعمل مهم دیگری هم باید مدنظر قرار بگیرد. در این ساختار زمان ذخیرهی داده روی کش یا حافظهی اصلی سیستم، مشخص میشود. ساختار مذکور بهنام Write policies شناخته میشود که اکثر پردازندههای مدرن از سیاست موسوم به write-back بهره میبرند. به بیان دیگر وقتی داده روی یک سطح از حافظهی کش نوشته میشود، کمی تأخیر نیاز خواهد بود تا حافظهی اصلی با یک کپی از دادهی مذکور، بهروز شود. در اکثر از موارد، توقف در ارسال داده تا زمانیکه داده در کش باشد، ادامه پیدا میکند. تنها زمانیکه داده از کش خارج شود، حافظهی رم اطلاعات را دریافت میکند. طراحان پردازنده، برای تصمیمگیری بین انتخابهای گوناگون مقدار، نوع و سیاستهای اجرایی کش، نیاز به ظرفیت بیشتر در پردازنده را با پیچیدگی بیشتر و فضای بیشتر قالب تراشه، در وضعیتی تعادلی بررسی میکنند. در یک دههی گذشته، پایینترین سطح حافظهی کش تغییر زیادی را تجربه نکرده است. درمقابل، ابعاد حافظهی L3 روند افزایشی را سپری کرد. 10 سال پیش، برای خرید پردازندهای با 12 مگابایت کش L3 باید هزینهای حدود هزار دلار پرداخت میشد. امروز با پرداخت هزینهای نصف، پردازنده با 64 مگابایت حافظهی کش دراختیار کاربران قرار دارد. چرا ظرفیت حافظهی کش CPU مدام در حال افزایش است؟
دلیل اینکه مدام ظرفیت حافظهی کش افزایش مییابد آن است که با افزایش حافظهی کش، شانس دسترسی به اطلاعات در این حافظه بیشتر شده و نیاز به رم کمتر میشود و این موضوع بهمعنی افزایش بازده سیستم خواهد بود.
در نمودار بالا که از بررسی انندتک تهیه شده است میتوانید تأثیر اضافه شدن حافظهی 128 مگابایتی L4 Cache را در کاهش تأخیر در هر کلاک مشاهده کنید. خط قرمز مربوط به پردازندهای است که حافظهی L4 دارد. دقت داشته باشید که برای فایلهای سنگین، سرعت آن تقریبا دو برابر دیگر پردازندههای اینتل است. طراحی کش چه تأثیری روی بازده دارد؟
تأثیر اضافه شدن کش به CPU ارتباط مستقیم به نرخ مراجعات موفق پردازنده به کش دارد. هرچه دفعات مراجعهی CPU کمتر با شکست روبهرو شود، بازده پردازنده افزایش مییابد. در ادامه چند مثال برای این موضوع ارائه میکنیم تا دید بهتری نسبت به آن داشته باشید. تصویر کنید که یک CPU مجبور باشد اطلاعات مشخصی را 100 بار پشت سر هم از L1 بخواند. حافظهی L1 تأخیر یک نانوثانیه دارد و هر 100 بار نیز حافظه با موفقیت اطلاعات را میخواند. به این ترتیب پردازنده 100 نانوثانیه برای انجام این عملیات زمان صرف میکند. حال تصور کنید که همان CPU با نرخ 99 درصد اطلاعات را از L1 بخواند و صدمین مراجعهی آن به L1 بدون پاسخ بماند و مجبور باشد به L2 مراجعه کنید. تأخیر L2 ده سیکل یا 10 نانوثانیه است به این ترتیب پردازنده 99 نانوثانیه برای کسب اطلاعات از L1 و 10 نانوثانیه برای کسب اطلاعات از L2 صرف میکند. این بدین معنی است که اگر یک درصد از مراجعات پردازنده به حافظهی L1 بدون پاسخ بماند 10 درصد سرعت پردازنده کاهش مییابد. در دنیای واقعی حافظهی L1 بین 95 تا 97 درصد مراجعات پردازنده را پاسخ میدهد، اما همان دو درصد اختلاف میتواند تأثیر محسوسی در سرعت پردازش امور داشته باشد. تازه این برای زمانی است که مطمئن باشیم اطلاعاتی که در L1 یافت نشده است حتما در L2 وجود دارد. اما در دنیای واقعی بعضی اوقات اطلاعات مورد نیاز پردازنده حتی در L3 و L4 نیز وجود ندارد و پردازنده مجبور به مراجعه به رم است. اگر پردازنده مجبور به کسب اطلاعات از رم باشد آنوقت سیکل پاسخدهی به 80 تا 120 نانوثانیه افزایش مییابد. بیشتر بخوانید: چه تفاوتی بین Core i3 با Core i5 و Core i7 اینتل وجود دارد؟ معماری ARM چیست؟ چه تفاوتی با x86 اینتل دارد؟
وقتی پردازندههای قدیمی سری بولدوزر AMD را با رقبای اینتلی آن مقایسه کنیم، مبحث طراحی کش و تأثیر آن روی بازده، به یک عامل بسیار مهم تبدیل میشود؛ عاملی که معادلات بازی را بر هم میزند. بسیاری از کارشناسان، یکی از دلایل مهم عقب ماندن AMD از Intel در سالهای گذشته در قدرت و بازدهی پردازندهها را طراحی کش میدانند. پردازندههای سری بولدوزر AMD از مشکل Cache Contention رنج میبردند. این مشکل زمانی رخ میداد که دو رشته یا Thread متفاوت اطلاعات را روی یک سکتور از کش ذخیره میکردند. این مشکل تأثیر بسیار منفی روی بازده هر دو Thread داشت. تصور کنید که یک هسته برای کسب اطلاعات مدنظر خود به کش مراجعه میکند، اما هستهای دیگر اطلاعات مدنظر خود را روی همان بخش از حافظه کپی کرده است. در این صورت هسته مجبور است یک بار تمام سطوح کش را چک کرده و سپس به رم مراجعه کرده و مجددا اطلاعات مدنظر خود را در سطح اول کش بنویسد. این مشکل حتی در پردازندههای مجهز به معماری Streamroller AMD نیز وجود داشت و حتی تلاش این شرکت برای اختصاص 96 کیلوبایت به L1 Code Cache هم مؤثر نبود. از طرفی حتی استفاده از فناوری HSA یا معماری ناهمگن نیز در این باره چندان مؤثر نبود. البته AMD با معرفی معماری Zen در سالهای اخیر سهم عمدهای از چالشها را برطرف کرد و حتی موفق به کسب سهم بازار بیشتر از اینتل شد. به هر حال، کش مبحث فوقالعاده پیچیدهای است که در سرعت پردازش دستورها نقش مهمی را ایفا میکند و بهنظر میرسد مدیریت بهتر آن در پردازندههای اینتل یکی از مهمترین دلایل برتری محصولات این شرکت در رقابت با پردازندههای AMD بود. مشخصات فنی کامل، قیمت پردازنده در فروشگاههای اینترنتی و مقایسهی کامل انواع CPU را در بخش محصولات مشاهده کنید؛ انواع CPU اینتل از جمله سری Core i3، Core i5 و Core i7 و انواع پردازنده مرکزی AMD رایزن (Ryzen) برای مقایسه و خرید دردسترس کاربران است. ورود به بخش پردازنده