Сайт о телевидении

Сайт о телевидении

» » Какой уровень кеш памяти в процессоре лучше. Кэширование внешних накопителей. Попадания и промахи

Какой уровень кеш памяти в процессоре лучше. Кэширование внешних накопителей. Попадания и промахи

Хеллоу ребята Поговорим о процессоре, а если быть точнее то о его кэше. Кэш у процессора может быть разный, например у меня сейчас Pentium G3220 (1150 сокет), это современный проц и в нем 3 мб кэша. Но при этом у старой модели Pentium D965 (775 сокет) кэша 4 мб. Но при этом G3220 в несколько раз быстрее чем D965, это я к тому, что кэш это хорошо, но главное чтобы кэш был современный. Кэш-память у старых процов намного медленнее, чем у новых, учтите это.

Давайте поговорим о некоторых устройствах, от которых зависит быстродействие. Вот смотрите, возьмем жесткий диск, есть ли у него кэш? Да, есть, но он мал, хотя и немного влияет на производительность. Потом идет что? Потом идет оперативная память, все с чем работает программа или процессор, все это помещается в оперативку. Если нет данных в оперативке, то они считываются с жесткого диска, а это очень медленно. А вот оперативка уже очень быстрая, ее может быть достаточно много. Но оперативка быстрая по сравнению с жестким диском, для процессора она все таки не очень быстрая и поэтому у последнего есть еще свой кэш, который уже реактивно супер быстрый!

Кэш процессора на что влияет? Именно в этом кэше процессор хранит то, чем часто пользуется, ну то есть всякие там команды и инструкции. Соответственно чем его больше, тем лучше, но это не совсем так. Вот сколько у вас кэша? Если не знаете, то я еще покажу как это узнать, тут все просто. Ну так вот, смотрите какая интересная ситуация, опять вернемся к старым процам. Вроде бы если много кэша, то это хорошо. Но есть процессор Q9650 (775 сокет), у которого 12 мб кэша, но он и близко не дотягивает до современных моделей Core i5 а то и Core i3. В i5 кэша в да раза меньше, то есть просто 6 мб, а в i3 его еще меньше - всего 3 мб.

Я понимаю что вообще современные процы куда быстрее, чем старые. Но я не о том. Кеш кэшу рознь, в топовом Q9650 просто медленный кэш по сравнению с процами на современном сокете. Поэтому толку от тех 12 мб никакого нет. Это все я к тому, что не гонитесь за количеством, гонитесь за качеством. Ну вот так. Это все я вам написал на заметку, надеюсь что вам пригодится

Вот на этой картинке по простому указан принцип работы кэша:

А вот другая картинка, тут также указано еще одно устройство, это контроллер, который как раз говорит о том есть ли данные в кэша или нет:

Кэш-память супер быстрая. Я не настолько разбираюсь в процах, но самому было бы интересно узнать, вот если бы этого кэша было… 100 мб.. или даже 1 гб.. был бы процессор быстрее? Это конечно даже сейчас фантастика, но уже сейчас есть процы с огромным количеством кэша.. около 30 мб или больше.. Я не уверен в этом, но вроде бы эта кэш-память очень дорогая и ее вообще сложно засунуть в проц, я имею ввиду большой обьем

Ну а теперь давайте я покажу как узнать сколько кэша в процессоре. Если у вас Windows 10, то это отлично, ибо она умеет показывать все кэши, там ведь есть три уровня. Хотя вроде бы самый главный это третий уровень, он же и самый большой. Итак, смотрите, открываете диспетчер задач и идете в на вкладку Производительность и вот нам на вкладке ЦП вы можете увидеть инфу о кэше, вот она:

Вот тут видно, что у меня Pentium G3220, достаточно неплохой процессор, хоть и недорогой. Но реально быстрее многих моделей на 775 сокете, которые можно назвать околотоповые и которые имеют намного больше кэша… Вот такие дела…

Но скажу вот по чесноку, что это не есть четкий способ посмотреть сколько кэша у проца. Я советую использовать утилиту CPU-Z, если вы думаете типа: да это прога, нада ставить и все такое, а ну его… То стойте! Эту программу используют крутые оверлокеры, которые разгоняют свои процы. Утилита при установке не создает кучу файлов и на самом деле установка это просто распаковка проги в Program Files, потом cpuz.exe можно куда угодно скопировать и запускать, работать будет! Просто запустили и все, она собрала инфу и вы смотрите! Скачать ее можно легко в интернете, благо она есть на каждом углу. Только смотрите, чтобы вирусов не хапанули.. Для этого качайте например на софт-портале.. Так и пишите в поиске CPU-Z софт портал. Работает CPU-Z почти на всех версиях винды, ну кроме самих древних…

А вообще можете скачать вот на этом сайте: cpuid.com, я просто честно говоря не знал о нем и привык качать с других сайтов!

Ну что, надеюсь что скачать вы ее сможете без проблем. Теперь запускаете и вот тут вам о процессоре все как на ладони. Вот я запустил CPU-Z и вот что она показала о моем Pentium G3220:

Там где я обвел рамочкой, вот там и отображается кэш. Что такое way, ну вот там написано 8-way, 12-way, ну вот что это я не знаю, уж простите. Но вот как видите тут четко видно не только кэш, но и другая инфа, частота, ядра (Cores) и потоки (Threads). Ну так вот, что еще интересно, так это то что тут показывает у вас один кэш или два. Ну вот у меня тут написано просто 3 MBytes, то есть у меня просто 3 мб кэша.

А вот например что касается топового Q9650, то там немного другая ситуация, хоть там и 12 мб кэша, но это по сути два блока по 6 мб и CPU-Z это определяет:

Тут кстати еще как видите есть разгон до 4 ГГц, это неплохо. Кстати такой разгон вполне может быть и на воздушном охлаждении. Но это уже совсем другая история…

Кстати еще что интересно, что в моделях на 775 сокете нет кэша третьего уровня L3… То есть там только L1 и L2.., а я не знал…

Так что вот такие вот дела. Надеюсь что все написал понятно. Еще раз повторю, не гонитесь вы за количеством. Вот я не очень жалею, но тем не менее.. Короче взял я и собрал себе комп на 1150 сокете. Ну думаю, все ништяк. Но как мне стало немного обидно, когда я узнал, что сокет 1151 вышел вот и что он стоит также, а то и чуть дешевле.. Но там реально быстрее процы уже идут.. Ну ладно. Я просто брал комп на века, но зато я обрадовался что моя плата, а это Asus Gryphon Z87 поддерживает процессоры на ядре Devil’s Canyon! Вот это был подарок, ведь раньше Intel заявляла что эти процессоры будут поддерживаться только чипсетом Z97, а я взял то блин Z87!

Короче вот такие дела

На этом все ребята. Надеюсь все у вас будет нормуль и данная инфа была вам полезной, удачи

На главную! кэш процессор 30.07.2016

virtmachine.ru

Влияние кэш-памяти на производительность компьютера

Всем пользователям хорошо известны такие элементы компьютера, как процессор, отвечающий за обработку данных, а также оперативная память (ОЗУ или RAM), отвечающая за их хранение. Но далеко не все, наверное, знают, что существует и кэш-память процессора(Cache CPU), то есть оперативная память самого процессора (так называемая сверхоперативная память).

Функция кэш-памяти

В чем же состоит причина, которая побудила разработчиков компьютеров использовать специальную память для процессора? Разве возможностей ОЗУ для компьютера недостаточно?

Действительно, долгое время персональные компьютеры обходились без какой-либо кэш-памяти. Но, как известно, процессор – это самое быстродействующее устройство персонального компьютера и его скорость росла с каждым новым поколением CPU. В настоящее время его скорость измеряется миллиардами операций в секунду. В то же время стандартная оперативная память не столь значительно увеличила свое быстродействие за время своей эволюции.

Вообще говоря, существуют две основные технологии микросхем памяти – статическая память и динамическая память. Не углубляясь в подробности их устройства, скажем лишь, что статическая память, в отличие от динамической, не требует регенерации; кроме того, в статической памяти для одного бита информации используется 4-8 транзисторов, в то время как в динамической – 1-2 транзистора. Соответственно динамическая память гораздо дешевле статической, но в то же время и намного медленнее. В настоящее время микросхемы ОЗУ изготавливаются на основе динамической памяти.

Примерная эволюция соотношения скорости работы процессоров и ОЗУ:

Таким образом, если бы процессор брал все время информацию из оперативной памяти, то ему пришлось бы ждать медлительную динамическую память, и он все время бы простаивал. В том же случае, если бы в качестве ОЗУ использовалась статическая память, то стоимость компьютера возросла бы в несколько раз.

Именно поэтому был разработан разумный компромисс. Основная часть ОЗУ так и осталась динамической, в то время как у процессора появилась своя быстрая кэш-память, основанная на микросхемах статической памяти. Ее объем сравнительно невелик – например, объем кэш-памяти второго уровня составляет всего несколько мегабайт. Впрочем, тут стоить вспомнить о том, что вся оперативная память первых компьютеров IBM PC составляла меньше 1 МБ.

Кроме того, на целесообразность внедрения технологии кэширования влияет еще и тот фактор, что разные приложения, находящиеся в оперативной памяти, по-разному нагружают процессор, и, как следствие, существует немало данных, требующих приоритетной обработки по сравнению с остальными.

История кэш-памяти

Строго говоря, до того, как кэш-память перебралась на персоналки, она уже несколько десятилетий успешно использовалась в суперкомпьютерах.

Впервые кэш-память объемом всего в 16 КБ появилась в ПК на базе процессора i80386. На сегодняшний день современные процессоры используют различные уровни кэша, от первого (самый быстрый кэш самого маленького объема – как правило, 128 КБ) до третьего (самый медленный кэш самого большого объема – до десятков МБ).

Сначала внешняя кэш-память процессора размещалась на отдельном чипе. Со временем, однако, это привело к тому, что шина, расположенная между кэшем и процессором, стала узким местом, замедляющим обмен данными. В современных микропроцессорах и первый, и второй уровни кэш-памяти находятся в самом ядре процессора.

Долгое время в процессорах существовали всего два уровня кэша, но в CPU Intel Itanium впервые появилась кэш-память третьего уровня, общая для всех ядер процессора. Существуют и разработки процессоров с четырехуровневым кэшем.

Архитектуры и принципы работы кэша

На сегодняшний день известны два основных типа организации кэш-памяти, которые берут свое начало от первых теоретических разработок в области кибернетики – принстонская и гарвардская архитектуры. Принстонская архитектура подразумевает единое пространство памяти для хранения данных и команд, а гарвардская – раздельное. Большинство процессоров персональных компьютеров линейки x86 использует раздельный тип кэш-памяти. Кроме того, в современных процессорах появился также третий тип кэш-памяти – так называемый буфер ассоциативной трансляции, предназначенный для ускорения преобразования адресов виртуальной памяти операционной системы в адреса физической памяти.

Упрощенно схему взаимодействия кэш-памяти и процессора можно описать следующим образом. Сначала происходит проверка наличия нужной процессору информации в самом быстром - кэше первого уровня, затем - в кэше второго уровня, и.т.д. Если же нужной информации в каком-либо уровне кэша не оказалось, то говорят об ошибке, или промахе кэша. Если информации в кэше нет вообще, то процессору приходится брать ее из ОЗУ или даже из внешней памяти (с жесткого диска).

Порядок поиска процессором информации в памяти:

Именно таким образом Процессор осуществляет поиск инфоромации

Для управления работой кэш-памяти и ее взаимодействия с вычислительными блоками процессора, а также ОЗУ существует специальный контроллер.

Схема организации взаимодействия ядра процессора, кэша и ОЗУ:


Кэш-контроллер является ключевым элементом связи процессора, ОЗУ и Кэш-памяти

Следует отметить, что кэширование данных – это сложный процесс, в ходе которого используется множество технологий и математических алгоритмов. Среди базовых понятий, применяющихся при кэшировании, можно выделить методы записи кэша и архитектуру ассоциативности кэш-памяти.

Методы записи кэша

Существует два основных метода записи информации в кэш-память:

  1. Метод write-back (обратная запись) – запись данных производится сначала в кэш, а затем, при наступлении определенных условий, и в ОЗУ.
  2. Метод write-through (сквозная запись) – запись данных производится одновременно в ОЗУ и в кэш.

Архитектура ассоциативности кэш-памяти

Архитектура ассоциативности кэша определяет способ, при помощи которого данные из ОЗУ отображаются в кэше. Существуют следующие основные варианты архитектуры ассоциативности кэширования:

  1. Кэш с прямым отображением – определенный участок кэша отвечает за определенный участок ОЗУ
  2. Полностью ассоциативный кэш – любой участок кэша может ассоциироваться с любым участком ОЗУ
  3. Смешанный кэш (наборно-ассоциативный)

На различных уровнях кэша обычно могут использоваться различные архитектуры ассоциативности кэша. Кэширование с прямым отображением ОЗУ является самым быстрым вариантом кэширования, поэтому эта архитектура обычно используется для кэшей большого объема. В свою очередь, полностью ассоциативный кэш обладает меньшим количеством ошибок кэширования (промахов).

Заключение

В этой статье вы познакомились с понятием кэш-памяти, архитектурой кэш-памяти и методами кэширования, узнали о том, как она влияет на производительность современного компьютера. Наличие кэш-памяти позволяет значительно оптимизировать работу процессора, уменьшить время его простоя, а, следовательно, и увеличить быстродействие всей системы.

biosgid.ru

Галерея эффектов кэшей процессоров

Почти все разработчики знают, что кэш процессора - это такая маленькая, но быстрая память, в которой хранятся данные из недавно посещённых областей памяти - определение краткое и довольно точное. Тем не менее, знание «скучных» подробностей относительно механизмов работы кэша необходимо для понимания факторов влияющих на производительность кода.

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

Habracut - - -

Пример 1: доступ к памяти и производительность
Как вы думаете, насколько второй цикл быстрее первого? int arr = new int;

For (int i = 0; i // второй for (int i = 0; i Пример 2: влияние строк кэша Копнём глубже - попробуем другие значения шага, не только 1 и 16: for (int i = 0; i

Обратите внимание, при значениях шага от 1 до 16 время работы практически не изменяется. Но при значениях больше 16, время работы уменьшается примерно вдвое каждый раз когда мы увеличиваем шаг в два раза. Это не означает, что цикл каким-то магическим образом начинает работать быстрее, просто количество итераций при этом так же уменьшается. Ключевой момент - одинаковое время работы при значениях шага от 1 до 16.

Причина этого в том, что современные процессоры осуществляют доступ к памяти не побайтно, а небольшими блоками, которые называют строками кэша. Обычно размер строки составляет 64 байта. Когда вы читаете какое-либо значение из памяти, в кэш попадает как минимум одна строка кэша. Последующий доступ к какому-либо значению из этой строки происходит очень быстро. Из-за того, что 16 значений типа int занимают 64 байта, циклы с шагами от 1 до 16 обращаются к одинаковому количеству строк кэша, точнее говоря, ко всем строкам кэша массива. При шаге 32, обращение происходит к каждой второй строке, при шаге 64, к каждой четвёртой. Понимание этого очень важно для некоторых способов оптимизации. От места расположения данных в памяти зависит число обращений к ней. Например, из-за невыровненных данных может потребоваться два обращения к оперативной памяти, вместо одного. Как мы выяснили выше, скорость работы при этом будет в два раза ниже.

Пример 3: размеры кэшей первого и второго уровня (L1 и L2)
Современные процессоры, как правило, имеют два или три уровня кэшей, обычно их называют L1, L2 и L3. Для того, чтобы узнать размеры кэшей различных уровней, можно воспользоваться утилитой CoreInfo или функцией Windows API GetLogicalProcessorInfo. Оба способа так же предоставляют информацию о размере строки кэша для каждого уровня. На моей машине CoreInfo сообщает о кэшах данных L1 объёмом по 32 Кбайт, кэшах инструкций L1 объёмом по 32 Кбайт и кэшах данных L2 объёмом по 4 Мбайт. Каждое ядро имеет свои персональные кэши L1, кэши L2 общие для каждой пары ядер: Logical Processor to Cache Map: *--- Data Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64 *--- Instruction Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64 -*-- Data Cache 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 Проверим эту информацию экспериментально. Для этого, пройдёмся по нашему массиву инкрементируя каждое 16-ое значение - простой способ изменить данные в каждой строке кэша. При достижении конца, возвращаемся к началу. Проверим различные размеры массива, мы должны увидеть падение производительности когда массив перестаёт помещаться в кэши разных уровней. Код такой: int steps = 64 * 1024 * 1024; // количество итераций int lengthMod = arr.Length - 1; // размер массива -- степень двойки

for (int i = 0; i {

// x & lengthMod = x % arr.Length, ибо степени двойки

Arr[(i * 16) & lengthMod]++; } Результаты тестов:

На моей машине заметны падения производительности после 32 Кбайт и 4 Мбайт - это и есть размеры кэшей L1 и L2.

Пример 4: параллелизм инструкций
Теперь давайте взглянем на кое-что другое. По вашему мнению, какой из этих двух циклов выполнится быстрее? int steps = 256 * 1024 * 1024; int a = new int;

For (int i = 0; i // второй for (int i = 0; i Пример 5: ассоциативность кэша Один из ключевых вопросов, на который необходимо дать ответ при проектировании кэша - могут ли данные из определённой области памяти храниться в любых ячейках кэша или только в некоторых из них. Три возможных решения:

  1. Кэш прямого отображения, данные каждой строки кэша в оперативной памяти хранятся только в одной заранее определённой ячейке кэша. Простейший способ вычисления отображения: индекс_строки_в_памяти % количество_ячеек_кэша. Две строки, отображённые на одну и ту же ячейку, не могут находится в кэше одновременно.
  2. N-входовый частично-ассоциативный кэш, каждая строка может храниться в N различных ячейках кэша. Например, в 16-входовом кэше строка может храниться в одной из 16-ти ячеек составляющих группу. Обычно, строки с равными младшими битами индексов разделяют одну группу.
  3. Полностью ассоциативный кэш, любая строка может быть сохранена в любую ячейку кэша. Решение эквивалентно хеш-таблице по своему поведению.
Кэши прямого отображения подвержены конфликтам, например, когда две строки соревнуются за одну ячейку, поочерёдно вытесняя друг-друга из кэша, эффективность очень низка. С другой стороны, полностью ассоциативные кэши, хотя и лишены этого недостатка, очень сложны и дороги в реализации. Частично-ассоциативные кэши - типичный компромисс между сложностью реализации и эффективностью. К примеру, на моей машине кэш L2 размером в 4 Мбайт является 16-входовым частично-ассоциативным кэшем. Вся оперативная память разделена на множества строк по младшим битам их индексов, строки из каждого множества соревнуются за одну группу из 16 ячеек кэша L2.

Так как кэш L2 имеет 65 536 ячеек (4 * 220 / 64) и каждая группа состоит из 16 ячеек, всего мы имеем 4 096 групп. Таким образом, младшие 12 битов индекса строки определяют к какой группе относится эта строка (212 = 4 096). В результате, строки с адресами кратными 262 144 (4 096 * 64) разделяют одну и ту же группу из 16-ти ячеек и соревнуются за место в ней.

Чтобы эффекты ассоциативности проявили себя, нам необходимо постоянно обращаться к большому количеству строк из одной группы, например, используя следующий код: public static long UpdateEveryKthByte(byte arr, int K) {

const int rep = 1024 * 1024; // количество итераций

Stopwatch sw = Stopwatch.StartNew();

For (int i = 0; i p += K; if (p >= arr.Length) p = 0; } sw.Stop();

return sw.ElapsedMilliseconds;

} Метод инкрементирует каждый K-ый элемент массива. По достижении конца, начинаем заново. После довольно большого количества итераций (220), останавливаемся. Я сделал прогоны для различных размеров массива и значений шага K. Результаты (синий - большое время работы, белый - маленькое):

Синим областям соответствуют те случаи, когда при постоянном изменении данных кэш не в состоянии вместить все требуемые данные одновременно. Яркий синий цвет говорит о времени работы порядка 80 мс, почти белый - 10 мс.

Разберёмся с синими областями:

  1. Почему появляются вертикальные линии? Вертикальные линии соответствуют значениям шага при которых осуществляется доступ к слишком большому числу строк (больше 16-ти) из одной группы. Для таких значений, 16-входовый кэш моей машины не может вместить все необходимые данные.

    Некоторые из плохих значений шага - степени двойки: 256 и 512. Для примера рассмотрим шаг 512 и массив в 8 Мбайт. При этом шаге, в массиве имеются 32 участка (8 * 220 / 262 144), которые ведут борьбу друг с другом за ячейки в 512-ти группах кэша (262 144 / 512). Участка 32, а ячеек в кэше под каждую группу только 16, поэтому места на всех не хватает.

    Другие значения шага, не являющиеся степенями двойки, просто невезучие, что вызывает большое количество обращений к одинаковым группам кэша, а так же приводит к появлению вертикальных синих линий на рисунке. На этом месте любителям теории чисел предлагается задуматься.

  2. Почему вертикальные линии обрываются на границе в 4 Мбайт? При размере массива в 4 Мбайт или меньше, 16-входовый кэш ведёт себя так же как и полностью ассоциативный, то есть может вместить все данные массива без конфликтов. Имеется не более 16-ти областей ведущих борьбу за одну группу кэша (262 144 * 16 = 4 * 220 = 4 Мбайт).
  3. Почему слева вверху находится большой синий треугольник? Потому, что при маленьком шаге и большом массиве кэш не в состоянии уместить все необходимые данные. Степень ассоциативности кэша играет тут второстепенную роль, ограничение связано с размером кэша L2. Например, при размере массива в 16 Мбайт и шаге 128, мы обращаемся к каждому 128-му байту, таким образом, модифицируя каждую вторую строку кэша массива. Чтобы сохранить каждую вторую строку в кэше, необходим его объём в 8 Мбайт, но на моей машине есть только 4 Мбайт.

    Даже если бы кэш был полностью ассоциативным, это не позволило бы сохранить в нём 8 Мбайт данных. Заметьте, что в уже рассмотренном примере с шагом 512 и размером массива 8 Мбайт, нам необходим только 1 Мбайт кэша, чтобы сохранить все нужные данные, но это невозможно сделать из-за недостаточной ассоциативности кэша.

  4. Почему левая сторона треугольника постепенно набирает свою интенсивность? Максимум интенсивности приходится на значение шага в 64 байта, что равно размеру строки кэша. Как мы увидели в первом и во втором примере, последовательный доступ к одной и той же строке практически ничего не стоит. Скажем, при шаге в 16 байт, мы имеем четыре обращения к памяти по цене одного. Так как количество итераций равно в нашем тесте при любом значении шага, то более дешёвый шаг в результате даёт меньшее время работы.
Обнаруженные эффекты сохраняются и при больших значениях параметров:

Ассоциативность кэша - интересная штука, которая может проявить себя при определённых условиях. В отличие от остальных рассмотренных в этой статье проблем, она не является настолько серьёзной. Определённо, это не то, что требует постоянного внимания при написании программ.

Пример 6: ложное разделение кэша
На многоядерных машинах можно столкнуться с другой проблемой - согласование кэшей. Ядра процессора имеют частично или полностью раздельные кэши. На моей машине кэши L1 раздельны (как и обычно), так же имеются два кэша L2, общие для каждой пары ядер. Детали могут различаться, но в целом современные многоядерные процессоры имеют многоуровневые иерархические кэши. Причём самые быстрые, но и самые маленькие кэши, принадлежат индивидуальным ядрам.

Когда одно из ядер модифицирует значение в своём кэше, другие ядра больше не могут использовать старое значение. Значение в кэшах других ядер должно быть обновлено. Более того, должна быть обновлена полностью вся строка кэша, так как кэши оперируют данными на уровне строк.

Продемонстрируем эту проблему на следующем коде: private static int s_counter = new int;

private void UpdateCounter(int position)

{

for (int j = 0; j { s_counter = s_counter + 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;

private static void Weirdness()

{

for (int i = 0; i { } } Если вместо подставить три разных варианта, можно получить следующие результаты:

Инкрементирование полей A, B, C, D занимает больше времени, чем инкрементирование полей A, C, E, G. Что ещё страннее, инкрементирование полей A и C занимает больше времени, чем полей A, C и E, G. Не знаю точно каковы причины этого, но возможно они связаны с банками памяти (да-да, с обычными трёхлитровыми сберегательными банками памяти, а не то, что вы подумали). Имеющих соображения на этот счёт, прошу высказываться в комментариях.

У меня на машине вышеописанного не наблюдается, тем не менее, иногда бывают аномально плохие результаты - скорее всего, планировщик задач вносит свои «коррективы».

Из этого примера можно вынести следующий урок: очень сложно полностью предсказать поведение железа. Да, можно предсказать многое, но необходимо постоянно подтверждать свои предсказания с помощью измерений и тестирования.

Заключение
Надеюсь, что всё рассмотренное помогло вам понять устройство кэшей процессоров. Теперь вы можете использовать полученные знания на практике для оптимизации своего кода. * Source code was highlighted with Source Code Highlighter. Метки:

Все процессоры с конца 90-х годов имеют внутреннюю кэш-память (или просто кэш). Кэш — это быстродействующая память, в которую переносятся команды и данные, непосредственно обрабатываемые процессором.

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

Это означает, что если данные, необходимые процессору, находятся в кэш-памяти, то задержек с обработкой не возникает. В противном случае процессор должен получить данные из основной памяти, что существенно уменьшает быстродействие системы.

Для того чтобы качественно разобраться с принципом работы кэшпамяти обоих уровней, рассмотрим на примере бытовую ситуацию.

Вы приходите в кафе пообедать ежедневно, в одно и то же время, и садитесь всегда за один и тот же столик. Всегда заказываете стандартный набор из трех блюд.

Официант бегает на кухню, повар их раскладывает на поднос и затем вам приносят заказ. И вот, скажем, на третий день официант, чтобы лишний раз не бегать на кухню, к назначенному времени встречает вас с уже готовым горячим обедом на подносе.

Вы не ждете заказ и сэкономили массу времени. Поднос с вашими блюдами — это и есть кэш первого уровня. Но на четвертый день вам вдруг захотелось добавить еще одно блюдо, допустим, десерт.

Хотя вас в назначенное время уже ждал поднос с заказом, но за десертом официанту все равно пришлось бежать на кухню.

А на пятый — снова меню из трех наименований. На шестой — опять десерт, но отличающийся от предыдущего. И официант, не зная, что вы из десерта захотите заказать (да и вообще не зная, будете ли вы что-либо заказывать), решается на следующий шаг: рядом с вашим столиком ставит шкафчик с несколькими наименованиями десерта.

И если вы изъявите желание, все под рукой, на кухню бежать не надо. Шкафчик с десертом — это кэш второго уровня.

От объема кэша L1 (от 16 до 128 Кбайт) и L2 (от 64 Кбайт до 512 Кбайт, в Pentium III Хеоп и AMD Opteron до 4 Мбайт) существенно зависит производительность процессора.

У процессоров Intel Pentium III и процессоров Celeron на его основе размер кэша L1 составляет 32 Кбайт. У Intel Pentium 4, а также на его базе Celeron и Хеоп-версий — всего 20 Кбайт. Процессоры AMD Duron, Athlon (включая ХР/МР) и Opteron, а также VIA СЗ содержат 128 Кбайт L1 кэша.

Современные двухъядерные процессоры имеют кэш первого уровня для каждого ядра в отдельности, поэтому иногда в описании кэша мы можем встретить цифру 128×2. Это означает, что каждое ядро процессора обладает 128 Кбайт кэш-памяти первого уровня.

Размер кэша L1 важен для получения высокой производительности в большинстве распространенных задач (офисные приложения, игры, большинство серверных приложений и т.п.). Особенно сильно его эффективность проявляется для поточных вычислений (например, обработка видеоизображения).

Это одна из причин того, что Pentium 4 относительно малоэффективен для большинства распространенных применений (хотя это компенсируется высокой тактовой частотой). Кэш L1 всегда работает (обменивается информацией с ядром процессора) на внутренней частоте процессора.

В отличие от него, кэш L2 в разных моделях процессоров работает с разной частотой (и соответственно производительностью). Начиная с Intel Pentium II во многих процессорах применялся кэш L2, работающий на частоте, вполовину меньшей, чем внутренняя частота процессора.

Такое решение использовано в устаревших процессорах Intel Pentium III (до 550 МГц) и устаревших AMD Athlon (в некоторых из них внутренний кэш L2 работал на трети частоты ядра процессора). Объем кэша L2 также различен для разных процессоров.

В устаревших, а также некоторых более новых процессорах Intel Pentium III объем кэша L2 составляет 512 Кбайт, в остальных Pentium III — 256 Кбайт. Процессор Intel Celeron на основе Pentium III выпускался с 128 и 256 Кбайт кэша L2, а на основе Pentium 4 — только со 128 Кбайт. В различных вариантах Xeon-версии Intel Pentium 4 присутствует до 4 Мбайт кэш-памяти L2.

В новых процессорах Pentium 4 (некоторые серии с частотой 2000 МГц и все — для частот выше) имеется 512 Кбайт кэша L2, в остальных Pentium 4 -256 Кбайт. В процессорах Хеоп (на основе Pentium 4) бывает 256 или 512 Кбайт кэша L2.

Кроме того, в них присутствует еще кэш-память третьего уровня L3. Интегрированная кэш-память L3 в сочетании с быстрой системной шиной формирует высокоскоростной канал обмена данными с системной памятью.

Как правило, кэш-памятью третьего уровня L3 комплектуются только процессоры для серверных решений или специальные модели «настольных» процессоров. Кэш-памятью L3 обладают, например, такие линейки процессоров, как Xeon DP, Itanium 2, Xeon MP.

Процессор AMD Duron имеет 128 Кбайт кэша L1 и 64 Кбайт кэша L2. В процессорах Athlon (кроме наиболее старых), Athlon MP и большинстве вариантов Athlon ХР присутствует 128 Кбайт кэша L1 и 256 Кбайт кэша L2, а в новейших Athlon ХР (2500+, 2800+, 3000+ и выше) — 512 Кбайт кэша L2. AMD Opteron содержит 1 Мбайт кэш-памяти L2.

Последние модели процессоров Intel Pentium D, Intel Pentium M, Intel Core 2 Duo выпускаются с 6 Мбайт кэш-памяти L2, a Core 2 Quad — 12 Мбайт кэш-памяти L2.

Последний на момент написания данной книги процессор фирмы Intel Core i7 обладает 64 Кбайт кэш-памяти L1 для каждого из 4 ядер, а также 256 Кбайт памяти L2 также для каждого ядра. Помимо кэш памяти первого и второго уровней процессор обладает и общей для всех ядер кэш-памятью третьего уровня, равной 8 Мбайт.

Для процессоров, у которых возможен разный размер кэша L2 (или в случае Intel Xeon MP — L3) у одной и той же модели, этот размер должен быть указан при продаже (от него, разумеется, зависит цена процессора). Если процессор продается в «коробочной» упаковке (поставка In-Box), на ней обычно указывается размер кэш-памяти.

Для обычных пользовательских задач (в том числе игр) важнее скорость кэша L2, чем его объем; для серверных задач, наоборот, важнее объем. Наиболее продуктивные серверы, особенно с большим объемом оперативной памяти (несколько гигабайт), требуют максимального объема и максимальной скорости кэша L2.

Непревзойденными по этим параметрам остаются Хеоп-версии процессоров Pentium III. (Процессор Xeon MP оказывается все же более производительны в серверных задачах, чем Pentium III Xeon, за счет более высокой тактовой частоты самого процессора и шины обмена информацией с памятью.) Из изложенного выше сделаем вывод: кэш-память улучшает взаимодействие между быстрым процессором и более медленной оперативной памятью, а также позволяет минимизировать периоды ожидания, возникающие при обработке данных. Решающую роль в этом играет кэш-память второго уровня, расположенная в кристалле процессора.

Основная память компьютера – это устройство с очень низкой скоростью обмена данных. И если процессору необходимы какие-то данные для работы, то он посылает запрос через шину памяти, и производится поиск этих нужных данных.

Только потом они отправляются непосредственно в процессор. Все это занимает очень много времени по компьютерным меркам. А вот, что если бы данные хранились где-то рядом с процессором?

Как раз кэш-память работает на основе этой идеи. И для того чтобы понять концепцию, для наглядности возьмем пример работы обычной библиотеки.

Назначение кеш памяти

Что же такое кэш-память или кэш (по англ. cache memory, cache):

В широком смысле, подразумевается любая память с быстрым доступом , где хранится часть данных с другого носителя с более медленным доступом;

В узком смысле - это сверхоперативный вид памяти, который используется для повышения скорости доступа микропроцессора к оперативной памяти.

Предположим, что в библиотеке работает один библиотекарь. Если человек приходит и просит первый том Пушкина, то библиотекарь идет к далекой книжной полке, находит книгу и приносит ее посетителю.

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

Вот пример того, как библиотека, то есть система работает без кэш-памяти .

Зачем нужна кэш-память?

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

Но, когда книга вернулась, библиотекарь не возвращает ее на полку, а кладет в ящик стола (этакая местная оперативная кэш-память ).

Теперь, когда следующий человек приходит и просит эту книгу, библиотекарю уже нужно просто открыть данный ящик. Аналогичным образом кэш-память хранит элементы данных, к которым часто обращается процессор.

Таким образом, каждый раз, запрашиваются эти данные, и процессор получает их из кэша, минуя долгий путь в основную медленную память.

Хранит ли кэш только часто используемые данные? Как функционирует и работает кэш оперативной памяти ?

Кэш – это такая очень умная часть памяти, которая автоматически осуществляет поиск любых данных, которые могут понадобиться в ближайшем будущем. Опять же, вернемся за примером к нашей библиотеке.

Когда человек просит первый томик Пушкина, то библиотекарь приносит также второй том:-) И когда человек прочитает первую книгу, аероятнее всего, что он может попросить второй томик. А когда он это сделает, ходит далеко не надо... тот уже будет лежать в ящике.

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

Эти смежные блоки данных, которые и передаются в кэш, называются кэш-линиями. Подробнее о понятии кэш-памяти можно посмотреть в этом видео:

Уровни кэш памяти

Большинство жестких дисков используют один уровень кэш-памяти . Но кэш имеет два уровня, где уровень L1 меньше и быстрее, а уровень L2, несколько медленнее (но все равно быстрее, чем основная внутренняя память ).

Лучшая бесплатная программа HDDScan для проверки жестких дисков

И снова возвратимся за примером к нашей библиотеке, на примере ее работы становится понятна как работает внешняя память компьютера .

Рассмотрим ящик библиотекаря в качестве кэша L1. Когда спрос на книги высок, и в ящике уже довольно много книг (нет места складывать) и вероятность того, что там найдется нужная, снижается.

Память L2 кэш

Здесь и появляется неодходимость L2. Представим L2 как книжный шкаф возле стола библиотекаря. Когда маленький ящик стола заполнен, библиотекарь начинает ставить книги в этот шкаф. И теперь, если книга не найдена в ящике сразу, надо взять ее из шкафа, не отходя далеко.

Аналогичным образом, когда кэш L1 заполнен, данные сохраняются в L2. Процессор в первую очередь ищет данные в L1, если они не будут найдены, то он обратится уже к L2. Если там тоже данные не найдены в L2, то идет обращение к основной памяти.

Двухуровневый кэш процессора

Кэш двух уровней у процессора – хорошая идея? Безусловно, да.

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

Когда же данные не найдены ни в первом, ни во втором уровне кэша, только тогда посылается запрос в основную память. На это тратится много процессорного времени.

Но если кэш-память работает так быстро, почему бы не выполнять его достаточно большой, чтобы хранить все данные оперативной памяти в нем?

Причина в том, что высокая скорость обходится очень дорого. Поэтому необходимо рациональное использование ресурсов кэш-памяти.

Хотя в последнее время, размеры кэш-памяти все увеличиваются, а цены растут не сильно, поэтому компьютеры работают все быстрее и быстрее.

То есть, наш библиотекарь обзаводится ящиком стола все большего размера, а шкафчик, стоящий рядом становится более вместительным! Еще в тему - двухядерные процессоры - правильно конфигурируем Windows.

Кэширование жесткого диска

Дисковая кэш-память (disk cache ), или кэш-память жестского диска - принцип построения кэш-памяти на основе динамического оперативного запоминающего устройства (типа DRAM), которое хранит наиболее часто используемые данные и команды, доступ к которым производится из внешней памяти.

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

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

1. Нужно затратить определенное время, чтобы магнитная головка записи-чтения подошла к искомой дорожке.

2. Поскольку при движении головка вибрирует, то необходимо немного времени, чтобы она успокоилась.

3. Наконец, требуется время, чтобы головка нашла искомый сектор.

Методы кэширования, используемые для оперативной памяти, применяются и для кэширования информации, хранимой на жестких дисках.

Кэш-память диска заполняется не только требуемым сектором, но и секторами, непосредственно следующими за ним, так как известно, что в большинстве случаев взаимосвязанные данные хранятся в соседних секторах.

Этот метод известен также как метод опережающего чтения (Read Ahead). При работе с многозадачными системами желательно иметь жесткий дик (винчестер) с мультисегментной кэш-памятью, которая для каждой из задач отводит свою часть кэша.

Кстати, если у вас недостаточно знаний о том, как лучше просканировать и протестировать жесткий диск , то обязательно посмотрите
подробный и бесплатный виде-оурок на эту тему:
как проверить винчестер на работоспособность

Кэш-память процессора

Кэш-памятью сейсас комплектуется большинство современных центральных процессоров. А первоначально кэш-память располагалась не на самом процессоре, а на материнской плате.

Кэш-память процессора на компьютере выполняет функции буфера между процессором и оперативной памятью.

Если кэш-память располагается между самим процессором и оперативной памятью, то при непосредственном обращении процессора к памяти сначала производится поиск необходимых данных в кэш-памяти .

Кэш-памяти процессора делятся на несколько видов:

Cache L1 - это «кэш-память первого уровня». Является промежуточной сверхоперативной памятью, находится на самом кристалле процессора, в ней размещаются наиболее часто используемые данные.

Работает эта память на частоте процессора. Время доступа к ней существенно меньше, чем к данным в основной оперативной памяти. Этим достигается ускорение работы процессора.

Cache L2 - «кэш-память второго уровня». Это промежуточная сверхоперативная память, которая имеет быстродействие ниже памяти первого уровня, но выше основной оперативной памяти. Ее размер обычно составляет от нескольких сотен килобайт до нескольких мегабайт.

Cache L3 - «кэш-память третьего уровня». Тоже промежуточная сверхоперативная память, имеющая быстродействие ниже памяти второго уровня, но выше основной оперативной памяти. Ее размер обычно составляет от одного до нескольких мегабайт.


Секреты и тонкости работы на компьютере

Windows был построен для использования на максимум машин с разными конфигурациями, и поэтому она обычно не оптимизирована для вашего компьютера и использования. Я также приглашаю вас, чтобы прочитать наши другие статьи статьи об оптимизации ваших компьютеров, если это уже сделано. «Не оптимизации», это на уровне процессора. Наши процессоры имеют кэшей, которые позволяют им положить в памяти некоторые данные для ускорения восстановления своих данных в будущем: http://fr.wikipedia.org/wiki/M%C3%A9moire_cache по словам процессоров, вы можете иметь 2 или 3 уровнях ()) кэша. По умолчанию Windows использует кэш L2 (Level 2) 256 Кбайт, который означает, что если ваш процессор может использовать больше пространства, (что обычно происходит и будет больше времени будет проходить с учетом постоянной эволюции процессоров), ограниченный Windows возможности вашего процессора! И я даже не говорить не кэш L3, потому что Windows не использовать его, это как если вы не имеете этот третий кэш-память является крупнейшим из 3 уровней процессор!

Его процессор информация:

Первое, что сделать это знать возможности CPU (процессор), это:

  • Скачать CPU – Z:-http://www.cpuid.com/softwares/cpu-z.html
  • Установите его и открыть его
  • Чтобы увидеть различные уровни кэша, у вас есть 2 возможности: 1 вкладку Нижний правый или 2

Для увеличения L2 кэша в Windows:

  1. В меню «Пуск», найдите и откройте «regedit» (база данных реестра) (как в любой манипуляции в базе данных реестра, рекомендуется выполнить резервное копирование его компьютера в случае возникновения проблем)
  2. Дважды щелкните на HKEY_LOCAL_MACHINE > система > CurrentControlSet > управления > Менеджер сессий > Управление памятью
  3. в правом окне вы должны найти ключ с именем «SecondLevelDataCache», щелкните правой кнопкой мыши на нем и нажмите «Изменить»
  4. Нажмите кнопку «Десятичная»
  5. И замените значение true вашего процессора. В моем случае, CPU – Z говорит мне 2 x 256, так что положить в моем случае значение 512.
  6. Нажмите кнопку «ОК»

Чтобы включить кэш L3 в Windows:

  1. Шаг 1-2 так же, как L2 и поэтому прибывают в том же окне на шаге 3.
  2. В свободной зоне в правом окне, щелкните правой кнопкой мыши и нажмите на «Новый» > «DWORD 32 бита»
  3. Переименуйте новый ключ на «ThirdLevelDataCache» (без кавычек)
  4. Щелкните правой кнопкой мыши на этот новый ключ переименован и нажмите «Изменить»
  5. Нажмите кнопку «Десятичная»
  6. Измените значение, что ваш процессор обозначается CPU – Z: в моем случае, я 3MBytes, так что я должен сделать 3 x 1024, что означает, что я должен положить 3072 как значение.
  7. Нажмите кнопку «ОК».

Перезагрузите компьютер. 1 после перезагрузки, ваш компьютер может быть немного медленнее, чем обычно, что из того факта, что Windows необходимо включить эти новые данные, но позже, ваш компьютер должен быть быстрее и мощнее! Лично я не медленно во время перезагрузки, 1-й, но я заметил улучшение в скорости программ, особенно на уровне multi-tasking, несмотря на тот факт, что ВОЗ уже SSD на моем компьютере! Примечание: этот трюк не разгона, и поэтому нет никакого риска перегрева, который может быть найден в оверклокинга.

Кэш центрального процессора

Функционирование

Диаграмма кэша памяти ЦПУ

Кэш - это память с большей скоростью доступа, предназначенная для ускорения обращения к данным, содержащимся постоянно в памяти с меньшей скоростью доступа (далее «основная память»). Кэширование применяется ЦПУ , жёсткими дисками , браузерами и веб-серверами .

Кэш состоит из набора записей. Каждая запись ассоциирована с элементом данных или блоком данных (небольшой части данных), которая является копией элемента данных в основной памяти. Каждая запись имеет идентификатор , определяющий соответствие между элементами данных в кэше и их копиями в основной памяти.

Когда клиент кэша (ЦПУ, веб-браузер, операционная система) обращается к данным, прежде всего исследуется кэш. Если в кэше найдена запись с идентификатором, совпадающим с идентификатором затребованного элемента данных, то используются элементы данных в кэше. Такой случай называется попаданием кэша . Если в кэше не найдено записей, содержащих затребованный элемент данных, то он читается из основной памяти в кэш, и становятся доступным для последующих обращений. Такой случай называется промахом кэша . Процент обращений к кэшу, когда в нём найден результат, называется уровнем попаданий или коэффициентом попаданий в кэш.

Например, веб-браузер проверяет локальный кэш на диске на наличие локальной копии веб-страницы, соответствующей запрошенному URL. В этом примере URL - это идентификатор, а содержимое веб-страницы - это элементы данных.

Если кэш ограничен в объёме, то при промахе может быть принято решение отбросить некоторую запись для освобождения пространства. Для выбора отбрасываемой записи используются разные алгоритмы вытеснения .

При модификации элементов данных в кэше выполняется их обновление в основной памяти. Задержка во времени между модификацией данных в кэше и обновлением основной памяти управляется так называемой политикой записи .

В кэше с немедленной записью каждое изменение вызывает синхронное обновление данных в основной памяти.

В кэше с отложенной записью (или обратной записью ) обновление происходит в случае вытеснения элемента данных, периодически или по запросу клиента. Для отслеживания модифицированных элементов данных записи кэша хранят признак модификации (изменённый или «грязный» ). Промах в кэше с отложенной записью может потребовать два обращения к основной памяти: первое для записи заменяемых данных из кэша, второе для чтения необходимого элемента данных.

В случае, если данные в основной памяти могут быть изменены независимо от кэша, то запись кэша может стать неактуальной . Протоколы взаимодействия между кэшами, которые сохраняют согласованность данных, называют протоколами когерентности кэша .

Кэш центрального процессора

Ряд моделей центральных процессоров (ЦП) обладают собственным кэшем, для того чтобы минимизировать доступ к оперативной памяти (ОЗУ), которая медленнее, чем регистры . Кэш-память может давать значительный выигрыш в производительности, в случае когда тактовая частота ОЗУ значительно меньше тактовой частоты ЦП. Тактовая частота для кэш-памяти обычно ненамного меньше частоты ЦП.

Уровни кэша

Кэш центрального процессора разделён на несколько уровней. Для универсальных процессоров - до 3. Кэш-память уровня N+1 как правило больше по размеру и медленнее по скорости обращения и передаче данных, чем кэш-память уровня N.

Самой быстрой памятью является кэш первого уровня - L1-cache. По сути, она является неотъемлемой частью процессора, поскольку расположена на одном с ним кристалле и входит в состав функциональных блоков. Состоит из кэша команд и кэша данных. Некоторые процессоры без L1 кэша не могут функционировать. На других его можно отключить, но тогда значительно падает производительность процессора. L1 кэш работает на частоте процессора, и, в общем случае, обращение к нему может производиться каждый такт (зачастую является возможным выполнять даже несколько чтений/записей одновременно). Латентность доступа обычно равна 2−4 тактам ядра. Объём обычно невелик - не более 128 Кбайт.

Вторым по быстродействию является L2-cache - кэш второго уровня. Обычно он расположен либо на кристалле, как и L1, либо в непосредственной близости от ядра, например, в процессорном картридже (только в слотовых процессорах). В старых процессорах - набор микросхем на системной плате. Объём L2 кэша от 128 Кбайт до 1−12 Мбайт. В современных многоядерных процессорах кэш второго уровня, находясь на том же кристалле, является памятью раздельного пользования - при общем объёме кэша в 8 Мбайт на каждое ядро приходится по 2 Мбайта. Обычно латентность L2 кэша, расположенного на кристалле ядра, составляет от 8 до 20 тактов ядра. В отличие от L1 кэша, его отключение может не повлиять на производительность системы. Однако, в задачах, связанных с многочисленными обращениями к ограниченной области памяти, например, СУБД , производительность может упасть в десятки раз.

Кэш третьего уровня наименее быстродействующий и обычно расположен отдельно от ядра ЦП, но он может быть очень внушительного размера - более 32 Мбайт. L3 кэш медленнее предыдущих кэшей, но всё равно значительно быстрее, чем оперативная память. В многопроцессорных системах находится в общем пользовании.

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

Ассоциативность кэша

Одна из фундаментальных характеристик кэш-памяти - уровень ассоциативности - отображает её логическую сегментацию. Дело в том, что последовательный перебор всех строк кэша в поисках необходимых данных потребовал бы десятков тактов и свёл бы на нет весь выигрыш от использования встроенной в ЦП памяти. Поэтому ячейки ОЗУ жёстко привязываются к строкам кэш-памяти (в каждой строке могут быть данные из фиксированного набора адресов), что значительно сокращает время поиска. С каждой ячейкой ОЗУ может быть связано более одной строки кэш-памяти: например, n -канальная ассоциативность (англ. n -way set associative ) обозначает, что информация по некоторому адресу оперативной памяти может храниться в n местах кэш-памяти.

При одинаковом объеме кэша схема с большей ассоциативностью будет наименее быстрой, но наиболее эффективной.

Кэширование внешних накопителей

Многие периферийные устройства хранения данных используют кэш для ускорения работы, в частности, жёсткие диски используют кэш-память от 1 до 32 Мбайт (модели с поддержкой одновременно и имеет смысл прочитать блок один раз, затем хранить одну копию блока в оперативной памяти для всех процессов;

  • доступ к некоторым блокам оперативной памяти происходит гораздо чаще, чем к другим, поэтому использование кэширования для таких блоков в целом увеличивает производительность системы;
  • для некоторых блоков памяти внешних накопителей не требуется непосредственной записи после модификации, и использование кэша для таких блоков оптимизирует использование ввода-вывода.
  • Кэширование, выполняемое операционной системой

    Кэш оперативной памяти состоит из следующих элементов:

    1. набор страниц оперативной памяти, разделённых на буферы, равные по длине блоку данных соответствующего устройства внешней памяти;
    2. набор заголовков буферов, описывающих состояние соответствующего буфера;
    3. хеш-таблицы , содержащей соответствие номера блока заголовку;
    4. списки свободных буферов.

    Алгоритм работы кэша с отложенной записью

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

    1. пытается найти в хеш-таблице заголовок буфера с заданным номером;
    2. в случае, если полученный буфер занят, ждёт его освобождения;
    3. в случае, если буфер не найден в хеш-таблице, берёт первый буфер из хвоста списка свободных;
    4. в случае, если список свободных буферов пуст, то выполняется алгоритм вытеснения (см. ниже);
    5. в случае, если полученный буфер помечен как «грязный», выполняет асинхронную запись содержимого буфера во внешнюю память.
    6. удаляет буфер из хеш-таблицы, если он был помещён в неё;
    7. помещает буфер в хеш-таблицу с новым номером.

    Процесс читает данные в полученный буфер и освобождает его. В случае модификации процесс перед освобождением помечает буфер как «грязный». При освобождении буфер помещается в голову списка свободных буферов.

    Таким образом:

    1. если процесс прочитал некоторый блок в буфер, то велика вероятность, что другой процесс при чтении этого блока найдёт буфер в оперативной памяти;
    2. запись данных во внешнюю память выполняется только тогда, когда не хватает «чистых» буферов, либо по запросу.

    Алгоритм вытеснения

    Если список свободных буферов пуст, то выполняется алгоритм вытеснения буфера. Алгоритм вытеснения существенно влияет на производительность кэша. Существуют следующие алгоритмы:

    1. LRU (Least Recently Used) - вытесняется буфер, неиспользованный дольше всех;
    2. MRU (Most Recently Used) - вытесняется последний использованный буфер;
    3. LFU (Least Frequently Used) - вытесняется буфер, использованный реже всех;
    4. ARC (англ.) (Adaptive Replacement Cache) - алгоритм вытеснения, комбинирующий LRU и LFU, запатентованный

      Программное кэширование

      Политика записи при кэшировании

      При чтении данных кэш-память даёт однозначный выигрыш в производительности. При записи данных выигрыш можно получить только ценой снижения надёжности. Поэтому в различных приложениях может быть выбрана та или иная политика записи кэш-памяти..

      Существуют две основные политики записи кэш-памяти - сквозная запись (write-through) и отложенная запись (write-back).

      • сквозная запись подразумевает, что при изменении содержимого ячейки памяти, запись происходит синхронно и в кэш и в основную память.
      • отложенная запись подразумевает, что можно отложить момент записи данных в основную память, а записать их только в кэш. При этом данные будут выгружены в оперативную память только в случае обращения к ним какого либо другого устройства (другой ЦП, контроллер DMA) либо нехватки места в кэше для размещения других данных. Производительность, по сравнению со сквозной записью, повышается, но это может поставить под угрозу целостность данных в основной памяти, поскольку программный или аппаратный сбой может привести к тому, что данные так и не будут переписаны из кэша в основную память. Кроме того, в случае кэширования оперативной памяти, когда используются два и более процессоров, нужно обеспечивать согласованность данных в разных кэшах.

      Кэширование интернет-страниц

      В процессе передачи информации по сети может использоваться кэширование интернет-страниц - процесс сохранения часто запрашиваемых документов на (промежуточных) прокси-серверах или машине пользователя, с целью предотвращения их постоянной загрузки с сервера-источника и уменьшения трафика . Таким образом, информация перемещается ближе к пользователю. Управление кэшированием осуществляется при помощи CMS конкретного сайта для снижения нагрузки на сервер при большой посещаемости. Кэширование может производится как в память, так и в файловый кэш (