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

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

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

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

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

Что такое кэш память процессора

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

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

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

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

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

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

Например, для кода это означает, что в цикле выполняется вызов функции, и эта функция находится в другом месте в адресном пространстве. Функция может быть удалена в памяти, но вызовы этой функции будут близки по времени. Простое вычисление может показать, насколько теоретически могут быть эффективные кеши. Предположим, что доступ к основной памяти занимает 200 циклов, а доступ к кеш-памяти занимает 15 циклов. Это улучшение на 5%.

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

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

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

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

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

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

От объема кэша 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 кэша.

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

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

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

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

Структура и для чего служит кэш

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

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

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

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



Рисунок 2: Процессор с кэшем уровня 3. Рисунок 2 показывает три уровня кеша и вводит номенклатуру, которую мы будем использовать в остальной части документа. Для программистов эти варианты дизайна невидимы. Кроме того, у нас есть процессоры с несколькими ядрами, и каждое ядро ​​может иметь несколько потоков. Разница между ядром и потоком заключается в том, что отдельные ядра имеют отдельные копии всех аппаратных ресурсов. Ядра могут запускаться полностью независимо, если только они не используют одни и те же ресурсы - например, соединения с внешней стороной - в то же время.

Такое решение использовано в устаревших процессорах 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.

С другой стороны, потоки разделяют практически все ресурсы процессора.


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

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

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

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

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

Поскольку тегу требуется пространство в дополнение к фактической памяти, неэффективно выбрать слово в качестве детализации кеша. Поскольку соседняя память, вероятно, будет использоваться вместе, она также должна быть загружена в кеш вместе. Таким образом, записи, хранящиеся в кэшах, - это не отдельные слова, а, наоборот, строки? из нескольких смежных слов. В ранних кэшах эти строки имели длину 32 байта; теперь норма составляет 64 байта.

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

Как правило, кэш-памятью третьего уровня 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.

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

Последние модели процессоров 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, за счет более высокой тактовой частоты самого процессора и шины обмена информацией с памятью.) Из изложенного выше сделаем вывод: кэш-память улучшает взаимодействие между быстрым процессором и более медленной оперативной памятью, а также позволяет минимизировать периоды ожидания, возникающие при обработке данных. Решающую роль в этом играет кэш-память второго уровня, расположенная в кристалле процессора.

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

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

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

Структура и для чего служит кэш

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

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

Первые обладатели такого вида кэш-памяти были процессоры Intel 80386 (386-е) и располагалась она на материнской плате. В будущем, на более новых процессорах Intel 80486 (486-е) добавили память такого типа на сам кристалл процессора, при этом сохранив ее и на материнской плате. По этой особенности их разделили на два уровня, то что находится на самом кристалле стала называться кэшем первого уровня (L1), а та что на материнской плате – кэшем второго уровня (L2). Но в наше время, кэш второго уровня также перенесли на кристалл процессора. Между собой эти типы памяти работают по двум возможным схемам: инклюзивная (дублирование находящегося в памяти в обоих уровнях) и эксклюзивная (данные на каждом уровне эксклюзивны).

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

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

Большинство современных процессоров оснащены кэш-памятью двух или трех уровней (теперь третий может располагаться на материнской плате):

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

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

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

Подводим итог

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