Колко пространство на страницата се използва за процесора. Какво представлява кеш паметта на твърдия диск и за какво служи? Кеш архитектури и принципи

Колко пространство на страницата се използва за процесора. Какво представлява кеш паметта на твърдия диск и за какво служи? Кеш архитектури и принципи

Кеш-памет (кеш памет, пари в брой, буфер- англ.) - използва се в цифрови устройства като високоскоростен клипборд. Кеш паметта може да се намери на компютърни устройства като процесори, мрежови карти, CD устройства и много други.

Принципът на работа и архитектурата на кеша могат да варират значително.

Например кешът може да служи като обикновен клипборда . Устройството обработва данните и ги прехвърля към високоскоростен буфер, където контролерът предава данните към интерфейса. Такъв кеш има за цел да предотвратява грешки, да проверява целостта на данните за хардуера или да кодира сигнал от устройство в разбираем сигнал за интерфейса, без забавяне. Тази система се използва например в CD/DVD CD устройства.

В друг случай кешът може да служи за съхраняване на често използван код и по този начин ускорява обработката на данни. Това означава, че устройството не трябва да изчислява или търси отново данните, което би отнело много повече време от четенето им от кеша. В този случай размерът и скоростта на кеша играят много важна роля.

Тази архитектура най-често се среща на твърди дискове и централни процесори ( процесор).

Когато устройствата работят, в кеша може да се зареди специален фърмуер или диспечерски програми, които биха работили по-бавно с ROM(Памет само за четене).

Повечето съвременни устройства използват смесен тип кеш , който може да служи като клипборд, както и да съхранява често използван код.

Има няколко много важни функции, реализирани за кеша на процесорите и видеочиповете.

Обединяване на изпълнителни единици . Централните процесори и видео процесорите често използват бърз споделен кеш между ядрата. Съответно, ако едно ядро ​​е обработило информация и тя е в кеша и се получи команда за същата операция или за работа с тези данни, тогава данните няма да бъдат обработени отново от процесора, а ще бъдат взети от кеш за по-нататъшна обработка. Ядрото ще бъде разтоварено, за да обработи други данни. Това значително повишава производителността при подобни, но сложни изчисления, особено ако кешът е голям и бърз.

Споделен кеш, също така позволява на ядрата да работят директно с него, заобикаляйки бавния .

Кеширайте за инструкции. Има или споделен, много бърз L1 кеш за инструкции и други операции, или специален кеш за тях. Колкото повече инструкции се съхраняват в един процесор, толкова по-голям кеш за инструкции се изисква. Това намалява латентността на паметта и позволява на блока с инструкции да функционира почти независимо. Когато е пълен, блокът с инструкции започва периодично да не се използва, което забавя скоростта на изчисление.

Други функции и характеристики.

Прави впечатление, че в процесор(централни процесори), прилож корекция на хардуерни грешки (ECC), защото малка грешка в кеша може да доведе до една непрекъсната грешка по време на по-нататъшната обработка на тези данни.

IN процесорИ GPUсъществува йерархия на кеша , което ви позволява да разделите данните за отделните ядра и общите. Въпреки че почти всички данни от кеша от второ ниво все още се копират на третото, общо ниво, но не винаги. Първото ниво на кеша е най-бързо, а всяко следващо е по-бавно, но с по-голям размер.

За процесорите се счита за нормално трии по-малко кеш нива. Това позволява баланс между скорост, размер на кеша и разсейване на топлината. Трудно е да се намерят повече от две кеш нива във видео процесорите.

Размер на кеша, въздействие върху производителността и други характеристики.

Естествено, толкова по-голям е кеша, толкова повече данни може да съхранява и обработва, но има сериозен проблем.

Голям кеш- Това голям бюджет. В сървърни процесори ( процесор), кешът може да използва до 80% транзистор бюджет. Първо, това се отразява на крайната цена, и второ, потреблението на енергия и разсейването на топлината се увеличават, което не е сравнимо с повишената с няколко процента производителност.

Един от важните фактори, който повишава производителността на процесора, е наличието на кеш памет, или по-скоро нейния обем, скорост на достъп и разпределение между нивата.

От доста време почти всички процесори са оборудвани с този тип памет, което още веднъж доказва полезността на нейното присъствие. В тази статия ще говорим за структурата, нивата и практическото предназначение на кеш паметта, което е много важно. характеристики на процесора.

Какво е кеш памет и нейната структура

Кеш паметта е свръхбърза памет, използвана от процесора за временно съхраняване на данни, които са най-често достъпни. Така можем накратко да опишем този вид памет.

Кеш паметта е изградена на тригери, които от своя страна се състоят от транзистори. Група транзистори заема много повече място от същите кондензатори, които съставляват RAM. Това води до много трудности при производството, както и ограничения в обема. Ето защо кеш паметта е много скъпа памет, но има незначителни обеми. Но от тази структура идва основното предимство на такава памет - скоростта. Тъй като джапанките не се нуждаят от регенерация и времето на забавяне на портата, на която са сглобени, е малко, времето за превключване на джапанката от едно състояние в друго се случва много бързо. Това позволява на кеш паметта да работи на същите честоти като съвременните процесори.

Също така важен фактор е разположението на кеш паметта. Той се намира на самия процесорен чип, което значително намалява времето за достъп. Преди това кеш паметта на някои нива беше разположена извън процесорния чип, върху специален SRAM чип някъде на дънната платка. Сега почти всички процесори имат кеш памет, разположена на чипа на процесора.


За какво се използва кеша на процесора?

Както бе споменато по-горе, основната цел на кеш паметта е да съхранява данни, които често се използват от процесора. Кешът е буфер, в който се зареждат данни и въпреки малкия си размер (около 4-16 MB) модерни процесори, дава значително увеличение на производителността във всяко приложение.

За да разберем по-добре необходимостта от кеш памет, нека си представим организирането на паметта на компютър като офис. RAM ще бъде шкаф с папки, до които счетоводителят периодично има достъп, за да извлече големи блокове от данни (т.е. папки). И таблицата ще бъде кеш памет.

Има елементи, които са поставени на бюрото на счетоводителя, които той препраща няколко пъти в рамките на един час. Например, това могат да бъдат телефонни номера, някои примери за документи. Този тип информация се намира точно на масата, което от своя страна увеличава скоростта на достъпа до тях.

По същия начин могат да се добавят данни от тези големи блокове данни (папки) към таблицата за бърза употреба, например документ. Когато този документ вече не е необходим, той се поставя обратно в шкафа (в RAM), като по този начин изчиства таблицата (кеш паметта) и освобождава тази таблица за нови документи, които ще бъдат използвани в следващия период от време.

Също така с кеш паметта, ако има някакви данни, които е най-вероятно да бъдат достъпни отново, тогава тези данни от RAM се зареждат в кеш паметта. Много често това се случва чрез съвместно зареждане на данните, които е най-вероятно да бъдат използвани след текущите данни. Тоест има предположения какво ще се използва „след това“. Това са сложните принципи на работа.

Нива на кеша на процесора

Съвременните процесори са оборудвани с кеш памет, която често се състои от 2 или 3 нива. Разбира се, има и изключения, но това често е така.

Най-общо може да има следните нива: L1 (първо ниво), L2 (второ ниво), L3 (трето ниво). Сега малко повече подробности за всеки от тях:

Кеш памет от първо ниво (L1)– най-бързото ниво на кеш паметта, което работи директно с ядрото на процесора, благодарение на това тясно взаимодействие, това ниво има най-кратко време за достъп и работи на честоти, близки до процесора. Това е буфер между процесора и кеша от второ ниво.

Ще разгледаме обеми на високопроизводителен процесор Intel Core i7-3770K. Този процесор е оборудван с 4x32 KB L1 кеш памет 4 x 32 KB = 128 KB. (32 KB на ядро)

Кеш от второ ниво (L2)– второто ниво е по-мащабно от първото, но в резултат на това има по-ниски „скоростни характеристики“. Съответно той служи като буфер между нивата L1 и L3. Ако погледнем отново нашия пример Core i7-3770 K, тогава размерът на L2 кеш паметта е 4x256 KB = 1 MB.

Кеш от ниво 3 (L3)– третото ниво отново е по-бавно от предишните две. Но все още е много по-бърз от RAM. Размерът на L3 кеша в i7-3770K е 8 MB. Ако предишните две нива се споделят от всяко ядро, тогава това ниво е общо за целия процесор. Цифрата е доста солидна, но не прекомерна. Тъй като, например, за процесори от серията Extreme като i7-3960X, той е 15 MB, а за някои нови процесори Xeon повече от 20.

Какво е кеш на процесора?

Кешът е част от паметта, която осигурява максимална скорост на достъп и ускорява скоростта на изчисление. Той съхранява частите от данни, които процесорът изисква най-често, така че процесорът да не се нуждае от постоянен достъп до системната памет за тях.

Както знаете, това е част от компютърното оборудване, която се характеризира с най-ниската скорост на обмен на данни. Ако процесорът се нуждае от някаква информация, тя отива в RAM чрез едноименната за него шина. След като получи заявка от процесора, той започва да се рови в аналите си в търсене на данните, от които процесорът се нуждае. При получаване RAM ги изпраща обратно към процесора по същата шина на паметта. Този кръг за обмен на данни винаги е бил твърде дълъг. Затова производителите решиха, че могат да позволят на процесора да съхранява данни някъде наблизо. Начинът, по който работи кешът, се основава на проста идея.

Мислете за паметта като за училищна библиотека. Ученикът се приближава до служителя за книга, тя отива до рафтовете, търси я, връща се при ученика, подготвя я правилно и продължава към следващия ученик. В края на деня той повтаря същата операция, когато книгите й се връщат. Ето как работи процесор без кеш.

Защо един процесор се нуждае от кеш?

А сега си представете, че на библиотекарката й е омръзнало постоянно да бърза напред-назад с книги, които непрекъснато се изискват от нея година след година, ден след ден. Той се сдоби с голям шкаф, в който съхранява най-често търсените книги и учебници. Останалите, които са поставени, разбира се, продължават да се съхраняват на същите рафтове. Но тези са винаги под ръка. Колко време спести с този шкаф и на себе си, и на другите. Това е кеша.

Значи кешът може да съхранява само най-необходимите данни?

да Но той може повече. Например, след като вече е съхранил често изисквани данни, той е в състояние да оцени (с помощта на процесора) ситуацията и да поиска информация, която е на път да бъде необходима. Така че клиент на видео под наем, който е поискал филма „Умирай трудно“ с първата част, най-вероятно ще поиска втората. И ето я! Същото важи и за кеша на процесора. Чрез достъп до RAM и съхраняване на определени данни, той също така извлича данни от съседни клетки на паметта. Такива части от данни се наричат ​​кеш линии.

Какво е кеш на две нива?

Съвременният процесор има две нива. Съответно първото и второто. Те се обозначават с буквата L от нивото на английски език. Първият - L1 - е по-бърз, но е с малък обем. Вторият - L2 - е малко по-голям, но по-бавен, но по-бърз от RAM. Кешът от първо ниво е разделен на кеш за инструкции и кеш за данни. Кешът за инструкции съхранява набора от инструкции, необходими на процесора за изчисления. Докато кешът на данните съхранява количества или стойности, необходими за текущото изчисление. А кешът от второ ниво се използва за зареждане на данни от RAM паметта на компютъра. Принципът на работа на нивата на кеша може също да бъде обяснен с помощта на пример от училищна библиотека. И така, след като напълни закупения шкаф, библиотекарят разбира, че вече няма достатъчно за книги, за които непрекъснато трябва да тича из залата. Но списъкът с такива книги е финализиран и трябва да закупите същия шкаф. Той не изхвърли първия - жалко - и просто купи втория. И сега, когато първият се напълни, библиотекарят започва да попълва втория, който влиза в действие, когато първият се напълни, но необходимите книги не се побират в него. Същото е и с нивата на кеша. И с развитието на микропроцесорната технология нивата на кеша на процесора се увеличават по размер.

Кешът ще продължи ли да расте?

Едва ли. Преследването на честотата на процесора също не продължи дълго и производителите намериха други начини за увеличаване на мощността. Същото с кеша. Конкретно казано, обемът и броят на нивата не могат да се увеличават безкрайно. Кешът не трябва да се превръща в друга RAM памет с ниска скорост на достъп или да намалява размера на процесора до половината от размера на дънната платка. В крайна сметка скоростта на достъп до данни е преди всичко консумацията на енергия и цената на производителността на самия процесор. Пропуските в кеша (за разлика от попаденията в кеша), при които процесорът осъществява достъп до кеш паметта за данни, които не са там, също са зачестили. Данните в кеша се актуализират постоянно, като се използват различни алгоритми, за да се увеличи вероятността за попадение в кеша.

Прочетено: 644

Почти всички разработчици знаят, че кешът на процесора е малка, но бърза памет, която съхранява данни от наскоро посетените области на паметта - определението е кратко и доста точно. Въпреки това, познаването на скучните подробности за механизмите на кеша е необходимо, за да се разберат факторите, които влияят на производителността на кода.

В тази статия ще разгледаме редица примери, илюстриращи различни характеристики на кеш паметта и тяхното въздействие върху производителността. Примерите ще бъдат на C#; изборът на език и платформа не оказва голямо влияние върху оценката на ефективността и крайните заключения. Естествено, в разумни граници, ако изберете език, на който четенето на стойност от масив е еквивалентно на достъп до хеш-таблица, няма да получите интерпретируеми резултати. Бележките на преводача са в курсив.

Habracut - - -

Пример 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 msИ 78 msсъответно (на моята машина).

Решението е просто - достъп до паметта. Скоростта на тези цикли се определя основно от скоростта на подсистемата на паметта, а не от скоростта на умножението на цели числа. Както ще видим в следващия пример, броят на достъпите до RAM е еднакъв както в първия, така и във втория случай.

Пример 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 или функцията GetLogicalProcessorInfo на Windows API. И двата метода също предоставят информация за размера на реда на кеша за всяко ниво.

На моята машина CoreInfo отчита 32 KB L1 кеша за данни, 32 KB L1 кеша за инструкции и 4 MB L2 кеша за данни. Всяко ядро ​​има свои лични L1 кешове, L2 кешове се споделят от всяка двойка ядра:

Карта на логическия процесор към кеша: *--- Кеш данни 0, ниво 1, 32 KB, Assoc 8, LineSize 64 *--- Instruction Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64 -*-- Кеш данни 1, Ниво 1, 32 KB, Assoc 8, LineSize 64 -*-- Кеш за инструкции 1, Ниво 1, 32 KB, Assoc 8, LineSize 64 **-- Унифициран кеш 0, Ниво 2, 4 MB, Assoc 16, LineSize 64 --*- Кеш за данни 2, ниво 1, 32 KB, Assoc 8, LineSize 64 --*- Кеш за инструкции 2, ниво 1, 32 KB, Assoc 8, LineSize 64 ---* Data Cache 3, ниво 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
Нека проверим тази информация експериментално. За да направим това, нека преминем през нашия масив, като увеличаваме всяка 16-та стойност - лесен начин за промяна на данните във всеки кеш ред. Когато стигнем до края, се връщаме в началото. Нека проверим различните размери на масива; трябва да видим спад в производителността, когато масивът вече не се побира в кешове на различни нива.

Кодът е:

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 KB и 4 MB - това са размерите на 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: Асоциативност на кеша

Един от ключовите въпроси, на които трябва да се отговори при проектирането на кеш памет, е дали данните от определена област на паметта могат да се съхраняват във всяка клетка на кеша или само в някои от тях. Три възможни решения:
  1. Кеш за директно картографиране,Данните на всеки кеш ред в RAM се съхраняват само в едно, предварително дефинирано местоположение на кеша. Най-лесният начин за изчисляване на картографирането е: row_index_in_memory % number_of_cache_cells. Два реда, нанесени на една и съща клетка, не могат да бъдат едновременно в кеша.
  2. N-entry частичен асоциативен кеш, всеки ред може да се съхранява в N различни местоположения на кеша. Например, в кеш с 16 записа, ред може да се съхранява в една от 16-те клетки, които съставляват групата. Обикновено редовете с равни най-малко значими битове индекси споделят една група.
  3. Напълно асоциативен кеш, всеки ред може да се съхранява във всяко място на кеша. Решението е еквивалентно на хеш таблица по своето поведение.
Директно картографираните кешове са склонни към конкуренция, например, когато два реда се конкурират за една и съща клетка, последователно се изгонват един друг от кеша, ефективността е много ниска. От друга страна, напълно асоциативните кешове, въпреки че нямат този недостатък, са много сложни и скъпи за изпълнение. Частично асоциативните кешове са типичен компромис между сложността на изпълнението и ефективността.

Например, на моята машина 4 MB L2 кеш е частично асоциативен кеш с 16 записа. Цялата RAM е разделена на набори от редове според най-малко значимите битове от техните индекси, редовете от всеки комплект се конкурират за една група от 16 L2 кеш клетки.

Тъй като L2 кешът има 65 536 клетки (4 * 2 20 / 64) и всяка група се състои от 16 клетки, имаме общо 4 096 групи. По този начин долните 12 бита на индекса на реда определят към коя група принадлежи този ред (2 12 = 4096). В резултат на това редове с адреси, кратни на 262 144 (4096 * 64), споделят една и съща група от 16 клетки и се конкурират за място в нея.

За да влязат в сила ефектите на асоциативността, трябва постоянно да имаме достъп до голям брой редове от една и съща група, например, като използваме следния код:

public static long UpdateEveryKthByte(byte arr, int K)
{
const int rep = 1024 * 1024; // брой итерации

Хронометър sw = Хронометър.StartNew();

int p = 0;
за (int i = 0; i< rep; i++)
{
arr[p]++;

Р += К; if (p >= arr.Length) p = 0;
}

Sw.Stop();
return sw.ElapsedMilliseconds;
}


Методът увеличава всеки K-ти елемент от масива. Когато стигнем до края, започваме отначало. След доста голям брой итерации (2 20) спираме. Направих серии за различни размери на масива и стойности на K стъпка (синьо - дълго време на изпълнение, бяло - кратко):

Сините зони съответстват на онези случаи, когато при постоянни промени в данните кешът не може да се приспособи всички необходими данни наведнъж. Ярко син цвят показва време на работа от около 80 ms, почти бяло - 10 ms.

Нека се заемем със сините зони:

  1. Защо се появяват вертикални линии?Вертикалните линии съответстват на стойностите на стъпките, при които се осъществява достъп до твърде много редове (повече от 16) от една група. За тези стойности кешът с 16 записа на моята машина не може да побере всички необходими данни.

    Някои от лошите стойности на крачка са степени на две: 256 и 512. Например, помислете за крачка 512 и масив от 8 MB. С тази стъпка има 32 секции в масива (8 * 2 20 / 262 144), които се конкурират помежду си за клетки в 512 кеш групи (262 144 / 512). Има 32 секции, но има само 16 клетки в кеша за всяка група, така че няма достатъчно място за всички.

    Други стойности на стъпки, които не са степени на две, просто са нещастни, което причинява голям брой посещения на едни и същи кеш групи и също така води до появата на вертикални сини линии на фигурата. В този момент любителите на теорията на числата са поканени да помислят.

  2. Защо вертикалните линии се прекъсват на границата от 4 MB?Когато размерът на масива е 4 MB или по-малко, кешът с 16 записа се държи като напълно асоциативен кеш, тоест може да побере всички данни в масива без конфликти. За една кеш група се борят не повече от 16 области (262 144 * 16 = 4 * 2 20 = 4 MB).
  3. Защо горе вляво има голям син триъгълник?Тъй като с малка стъпка и голям масив, кешът не може да побере всички необходими данни. Степента на асоциативност на кеша тук играе второстепенна роля; ограничението е свързано с размера на L2 кеша.

    Например, с размер на масива от 16 MB и стъпка от 128, ние осъществяваме достъп до всеки 128-ми байт, като по този начин модифицираме всеки втори ред на кеша на масива. За да съхранявате всеки втори ред в кеша, имате нужда от 8 MB кеш, но на моята машина имам само 4 MB.

    Дори ако кешът беше напълно асоциативен, той не би позволил 8 MB данни да бъдат съхранени в него. Обърнете внимание, че във вече обсъдения пример със стъпка от 512 и размер на масива от 8 MB ни трябва само 1 MB кеш, за да съхраним всички необходими данни, но това е невъзможно поради недостатъчна асоциативност на кеша.

  4. Защо лявата страна на триъгълника постепенно придобива интензивност?Максималната интензивност възниква при стойност на стъпка от 64 байта, което е равно на размера на реда на кеша. Както видяхме в първия и втория пример, последователният достъп до един и същ ред не струва почти нищо. Да кажем, че със стъпка от 16 байта имаме четири достъпа до паметта на цената на един.

    Тъй като броят на итерациите е еднакъв в нашия тест за всяка стойност на стъпка, по-евтината стъпка води до по-малко време за изпълнение.

Откритите ефекти се запазват при големи стойности на параметрите:

Асоциативността на кеша е интересно нещо, което може да се прояви при определени условия. За разлика от другите проблеми, обсъдени в тази статия, той не е толкова сериозен. Определено не е нещо, което изисква постоянно внимание при писане на програми.

Пример 6: фалшиво разделяне на кеша

На многоядрени машини може да срещнете друг проблем - кохерентността на кеша. Процесорните ядра имат частично или напълно отделни кеш памети. На моята машина кешовете L1 са отделни (както обикновено) и има също два кеша L2, споделени от всяка двойка ядра. Подробностите може да варират, но като цяло съвременните многоядрени процесори имат многостепенни йерархични кешове. Освен това най-бързият, но и най-малкият кеш принадлежи на отделни ядра.

Когато едно ядро ​​модифицира стойност в своя кеш, други ядра вече не могат да използват старата стойност. Стойността в кешовете на други ядра трябва да се актуализира. Освен това трябва да се актуализира цялата кеш линия, тъй като кешовете работят с данни на ниво ред.

Нека демонстрираме този проблем със следния код:

private static int s_counter = нов int;

private void UpdateCounter(int позиция)
{
за (int j = 0; j< 100000000; j++)
{
s_брояч = s_брояч + 3;
}
}


Ако на моята четириядрена машина извикам този метод с параметри 0, 1, 2, 3 едновременно от четири нишки, тогава времето за изпълнение ще бъде 4,3 секунди. Но ако извикам метода с параметри 16, 32, 48, 64, тогава времето за изпълнение ще бъде само 0,28 секунди.

Защо? В първия случай всичките четири стойности, обработени от нишки във всеки даден момент, вероятно ще се окажат в един кеш ред. Всеки път, когато едно ядро ​​увеличава стойност, то маркира кеш клетките, съдържащи тази стойност в други ядра, като невалидни. След тази операция всички други ядра ще трябва отново да кешират реда. Това прави механизма за кеширане неработещ, убивайки производителността.

Пример 7: Хардуерна сложност

Дори сега, когато принципите на работа на кеша не са тайна за вас, хардуерът ще ви поднесе изненади. Процесорите се различават един от друг по методи за оптимизация, евристика и други тънкости на изпълнение.

Кешът L1 на някои процесори може да има достъп до две клетки паралелно, ако те принадлежат към различни групи, но ако принадлежат към една и съща група, само последователно. Доколкото знам, някои дори могат да имат паралелен достъп до различни четвъртини на една и съща клетка.

Процесорите може да ви изненадат с умни оптимизации. Например, кодът от предишния пример за фалшиво споделяне на кеш памет не работи на домашния ми компютър по предназначение - в най-простите случаи процесорът може да оптимизира работата и да намали негативните ефекти. Ако промените малко кода, всичко си идва на мястото.

Ето още един пример за странни хардуерни странности:

private static 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 KB)
Размер на кеша ниво 1.
Кешът от ниво 1 е блок от високоскоростна памет, разположен директно върху ядрото на процесора.
Данните, извлечени от RAM, се копират в него.

Съхраняването на основни инструкции подобрява производителността на процесора поради по-високата скорост на обработка на данни (обработката от кеша е по-бърза, отколкото от RAM).

Капацитетът на кеша от първо ниво е малък и възлиза на килобайти.
Обикновено "по-старите" модели процесори имат по-голям L1 кеш.
За многоядрени модели е посочено количеството L1 кеш памет за едно ядро.

Размер на L2 кеша (от 128 до 12288 KB)
Размер на кеша ниво 2.
L2 кеша е блок от високоскоростна памет, който изпълнява същите функции като L1 кеша (вижте "Капацитет на L1 кеша"), но има по-ниска скорост и по-голям капацитет.

Ако избирате процесор за задачи, изискващи ресурси, тогава моделът с голям L2 кеш ще бъде за предпочитане.
За многоядрени процесори се посочва общото количество кеш памет от второ ниво.

Размер на L3 кеша (от 0 до 16384 KB)
Размер на кеша ниво 3.
Интегрираният L3 кеш, комбиниран с бърза системна шина, образува високоскоростен канал за обмен на данни със системната памет.

По правило само централните процесори за сървърни решения или специални издания на „настолни“ процесори са оборудвани с кеш памет от трето ниво.

Например процесорни линии като Intel Pentium 4 Extreme Edition, Xeon DP, Itanium 2, Xeon MP и други имат кеш памет от трето ниво.

Twin BiCS FLASH - нова технология за 3D флаш памет

На 11 декември 2019 г., на IEEE International Electronic Devices Meeting (IEDM), TOKYO-Kioxia Corporation обяви технологията за 3D флаш памет - Twin BiCS FLASH.

AMD Radeon Software Adrenalin Edition 2020 Драйвер 19.12.2 WHQL (добавен)

На 10 декември AMD представи мега драйвера Radeon Software Adrenalin 2020 Edition 19.12.2 WHQL.

Windows 10 Кумулативна актуализация 1909 KB4530684

На 10 декември 2019 г. Microsoft пусна кумулативна актуализация KB4530684 (компилация 18363.535) за актуализация на Windows 10 ноември 2019 г. (версия 1909) на x86, x64 (amd64), ARM64 и Windows Server 2019 (1909) процесори за x64-базирани системи.

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 монитори.

изгледи