Уровни кэш-памяти
На маркировке современных ЦП, помимо тактовой частоты и количества потоков, можно встретить такое понятие как размер кэша 1,2 и 3 уровней. Как он определяется и на что влияет? Давайте разбираться простым языком.
- Кэш первого уровня (L1) – самая важная и быстрая микросхема в архитектуре ЦП. Один процессор может вместить количество модулей, равных числу ядер. Примечательно, что микросхема может хранить в памяти самые востребованные и важные данные только со своего ядра. Объем массива зачастую ограничен показателем в 32-64 КБ.
- Кэш второго уровня (L2) – падение скорости компенсируется увеличением объема буфера, который доходит до 256, а то и 512 КБ. Принцип действия такой же, как и у L1, а вот частота запроса к памяти ниже, ввиду хранения в ней менее приоритетных данных.
- Кэш третьего уровня (L3) – самый медленный и объемный раздел среди всех перечисленных. И все равно этот массив гораздо быстрее оперативной памяти. Размер может достигать 20, и даже 60 МБ, если речь касается серверных чипов. Польза от массива огромна: он является ключевым звеном обмена данными между всеми ядрами системы. Без L3 все элементы чипа были бы разрознены.
В продаже можно встретить как двух- так и трехуровневую структуру памяти. Какая из них лучше? Если вы используете процессор лишь для офисных программ и казуальных игр, то никакой разницы не почувствуете. Если же система собирается с прицелом под сложные 3D-игры, архивацию, рендеринг и работу с графикой, то прирост в некоторых случаях будет колебаться от 5 до 10%.Кэш третьего уровня оправдан лишь в том случае, если вы намерены регулярно работать с многопоточными приложениями, требующими регулярные сложные расчеты. По этой причине в серверных моделях нередко используют кэш L3 больших объемов. Хотя бывают случаи, что и этого не хватает, а потому приходится дополнительно ставить так называемые модули L4, которые выглядят как отдельная микросхема, подключаемая к материнской плате.
Кэш-память процессора
Можно считать, что в этой архитектуре есть несколько параллельно и согласованно работающих каналов прямого отображения, где контроллеру кэша приходится принимать решение о том, в какую из строк набора помещать очередной блок данных. В простейшем случае каждый блок памяти может помещаться в одну из двух строк (Two Way Set-Associative Cache — двухканальный наборно – ассоциативный кэш). Такой кэш должен содержать два банка памяти тегов. Номер набора (индекс), в котором может отображаться затребованный блок данных, однозначно определяется средней частью адреса (как номер строки в кэше прямого отображения). Строка набора, отображающая требуемый блок, определяется сравнением тегов (как и в ассоциативном кэше), параллельно выполняемым для всех каналов кэша. Кроме того, с каждым набором должен быть связан признак, определяющий строку набора, подлежащую замещению новым блоком данных в случае кэш-промаха (на рисунке 3.26 в ее сторону указывает стрелка). Кандидатом на замещение обычно выбирается строка, к которой дольше всего не обращались (алгоритм LRU — Least Recently Used). При относительно большом количестве каналов (строк в наборе) прибегают к некоторому упрощению — алгоритм Pseudo-LRU для четырех строк (Four Way Set Associative Cache) позволяет принимать решения, используя всего 3 бита.
Возможно также применение алгоритма замещения FIFO (первым вошел — первым вышел) или даже случайного (random) замещения, что проще, но менее эффективно. Наборно-ассоциативная архитектура широко применяется для первичного кэша современных процессоров.
Рисунок 3.26 – Двухканальный наборно – ассоциативный кэш |
Объем кэшируемой памяти определяется так же, как и в предыдущем варианте, но здесь фигурируют объем одного банка (а не всего кэша) и разрядность относящихся к нему ячеек тега.
Ассоциативный кэш
В отличие от предыдущих, у полностью ассоциативного кэша любая его строка может отображать любой блок памяти, что существенно повышает эффективность использования его ограниченного объема. При этом все биты адреса кэшированного блока, за вычетом битов, определяющих положение (смещение) данных в строке, хранятся в памяти тегов. В такой архитектуре для определения наличия затребованных данных в кэш-памяти требуется сравнение со старшей частью адреса тегов всех строк, а не одной или нескольких, как при прямом отображении или наборно-ассоциативной архитектуре. Естественно, последовательный перебор ячеек памяти тегов отпадает — на это может уйти слишком много времени. Остается параллельный анализ всех ячеек, что является сложной аппаратной задачей, которая пока решена только для небольших объемов первичного кэша в некоторых процессорах.
Лекция 12
Предыдущая33343536373839404142434445464748Следующая
Дата добавления: 2016-02-24; просмотров: 280;
Два уровня кэш-памяти процессора
Большинство жестких дисков и некоторых других компонентов компьютера используют всего один уровень кэш – памяти. В отличие от них, кэш – память процессора является двухуровневой, в которой кэш 1-го уровня (L1) меньше и быстрее, а кэш 2-го уровня немного медленнее первого, но при этом намного быстрее, чем оперативная память. Кэш L1 разделен на две части, а именно, на кэш команд и на кэш данных. В кэше команд хранится набор инструкций, которые необходимы процессору для вычислений, в то время как кэш данных хранит значения, которые необходимы для текущего исполнения. Кэш L2 отвечает за загрузку данных из основной памяти. Опять же, возвращаясь к нашей библиотеке.
Рассмотрим, например, ящик библиотекаря как кэш L1. В один из сильно загруженных работой дней, когда посетителей много, спрос на книги велик, а ящик в столе заполнен, возникает риск его переполнения. В этом случае на помощь библиотекарю приходит рядом стоящий книжный шкаф (L2). В него библиотекарь будет складывать книги, когда не останется места в ящике стола. Теперь, когда у него спросят некоторые популярные книги, то он сначала посмотрит в ящик стола и если не найдет там запрашиваемой книги, то пойдет к книжному шкафу. Который, как вы, наверное, догадались, в нашей аналогии играет роль кэш-памяти второго уровня.
Аналогичным образом, в процессоре, когда кэш L1заполнен, данные сохраняются в кэш-память L2. Процессор в первую очередь ищет данные в первом кэше L1, и если они не будут найдены, то далее разыскиваются в L2. Если данные не будут найдены в L2, то следует запрос в оперативную память, и в последнюю очередь запрос делается к жесткому диску.
Структура кэша
Система кэш-памяти процессора состоит из двух блоков — контроллера кэш-памяти и собственно самой кэш-памяти. Она представлена на рисунке 1.
Рис.1. Структура и функционирование кэша
Кэш память
Это место, где хранится содержание кэша. Кэш-память процессора изготавливают в виде микросхем статической памяти (Static Random Access Memory, сокращенно — SRAM). По сравнению с другими типами памяти, статическая память обладает очень высокой скоростью работы. Однако, эта скорость зависит также от объема конкретной микросхемы. Чем значительней объем микросхемы, тем сложнее обеспечить высокую скорость ее работы. Если такая особенность учтена производителем, то кэш-память процессора содержит несколько блоков, называемых уровнями. В большинстве процессоров используется трехуровневая система кэша:
Кэш-память первого уровня – очень маленькая, но самая быстрая микросхема памяти. Ее объем не превышает нескольких десятков килобайт. Работает она без каких-либо задержек. В ней содержатся данные, которые чаще всего используются процессором. Количество микросхем памяти, как правило, равно количеству его ядер. Каждое ядро имеет доступ только к своей микросхеме
Кэш-память второго уровня немного медленнее кэш-памяти первого, но и объем ее более существенный (около несколько сотен килобайт)
Служит она для временного хранения важной информации, вероятность запроса которой ниже, чем у информации, находящейся в первом уровне
Кэш-память третьего уровня – еще более объемная, но и более медленная схема памяти. Тем не менее, она быстрее оперативной памяти. Ее размер может достигать нескольких десятков мегабайт
В отличие от 1 и 2 уровней, она является общей для всех ядер процессора. Служит для временного хранения важных данных с относительно низкой вероятностью запроса, а также для обеспечения взаимодействия ядер процессора между собой.
Ее размер может достигать нескольких десятков мегабайт. В отличие от 1 и 2 уровней, она является общей для всех ядер процессора. Служит для временного хранения важных данных с относительно низкой вероятностью запроса, а также для обеспечения взаимодействия ядер процессора между собой.
Контроллер кэш памяти
Это устройство, управляющее содержанием кэша, получением необходимой информации из оперативной памяти, передачей ее процессору, а также возвращением в оперативную память результатов вычислений. Когда ядро процессора обращается к контроллеру за какими-то данными, тот проверяет, есть ли эти данные в кэш-памяти. Если это так, ядру моментально отдается информация из кэша. В противном случае ядру приходится ожидать поступления данных из медленной оперативной памяти. Ситуация, когда в кэше не оказывается нужных данных, называется кэш-промахом. Задача контроллера – сделать так, чтобы кэш-промахи происходили как можно реже, а в идеале – чтобы их не было вообще.
Размер кэша процессора по сравнению с размером оперативной памяти несоизмеримо мал. В нем может находиться лишь копия крошечной части данных, хранимых в оперативной памяти. Но, не смотря на это, контроллер допускает кэш-промахи не часто. Эффективность его работы определяется несколькими факторами:
- Размером и структурой кэш-памяти. Чем больше ресурсов имеет в своем распоряжении контроллер, тем ниже вероятность кэш-промаха
- Эффективностью алгоритмов, по которым контроллер определяет, какая именно информация понадобится процессору в следующий момент времени
- Сложностью и количеством задач, одновременно решаемых процессором. Чем сложнее задачи и чем их больше, тем чаще «ошибается» контроллер
Как посмотреть объем кэш памяти процессора
1. Командная строка
Это самый простой способ потому что вам не нужно ничего устанавливать. Нажмите сочетание клавиш Win+R и в открывшемся окне наберите cmd. Затем нажмите Enter. В открывшейся командной строке выполните такую команду:
Утилита отобразит общий размер кэша L2 и L3 для всех ядер в килобайтах. Чтобы получить более подробные данные, вам понадобится другая программа. Если вам нужно только цифровое значение, например, для скрипта, то его можно отфильтровать с помощью утилиты findstr:
Но здесь можно посмотреть только объем кэша L2 и L3. Об кэше L1 у этой команды информации нет.
2. Диспетчер задач
Общий объем кэша можно посмотреть также в диспетчере задач Windows. Для этого нажмите сочетание клавиш Ctrl+Shift+Esc, а когда откроется окно диспетчера задач нажмите на кнопку Подробнее. Далее вам надо перейти на вкладку Производительность, а потом ЦП и здесь вы увидите общий объем кэша всех уровней. А именно размер кэша L2, L3 и L1:
3. Кэш память в CPU-Z
Лучший способ узнать объем кэш памяти процессора — это воспользоваться очень популярной утилитой CPU-Z. Это небольшая утилита, которая отображает подробную информацию о процессоре, оперативной памяти и материнской плате. Скачать её можно по этой ссылке.
На главной странице программы вы можете видеть информацию по кэшу в разделе Cache:
Здесь выводится размер одного блока кэша и количество таких блоков. Например, у моего процессора по одному блоку на каждое ядро кэша L1 и L2, а кэш L3 разделен на два блока, которыми пользуются все ядра. Более подробную информацию о состоянии кэша вы можете посмотреть в на вкладке Caches:
Здесь отображается то же самое, а также сведения об архитектуре кэша и о том в сколько потоков может работать эта память.
Недостатки кэша
Аппаратный кэш — очень дорогая в производстве структура. К тому же он обычно энергозависим: стоит выключить устройство — все данные потеряются.
Программный кэш не решит всех вопросов, связанных с памятью. Он ограничен по размеру, а специфические алгоритмы не позволяют хранить в нем что-то неограниченное количество времени
Для долговременного хранения важной информации он не подходит.
Алгоритма кэширования, оптимального в любых ситуациях, не существует. Поэтому алгоритм выбирают разработчики в зависимости от целей конкретной программы: он обычно довольно узкоспециализированный и не подходит для широкого спектра задач.
Закэшировать «весь интернет» или всю память не получится — размер кэша довольно маленький.
Это не минусы в классическом понимании: кэшем все равно пользуются все. Просто надо понимать, что это специализированный инструмент со своей сферой использования.
Какие типы кэш-памяти используются в процессорах
Кэш-память подразделяется на уровни: чем меньше цифра после «L» в спецификациях — тем ближе данная память к процессору.
Как работает кэш процессора
Кэш процессора нередко называют сверхоперативной памятью. Данные передаются из ОЗУ в кэш L3 (самый объемный и самый медленный), затем в L2 и, наконец, в L1. Когда процессор ищет данные для выполнения операции, то сначала пытается найти их в кэше 1-го кровня. Если не находит, обращается к L2, а затем в L3. Рассмотрим особенности каждого уровня кэш памяти.
Кэш L1 — первого уровня
Кэш первого уровня называют также кэш-памятью 1-го уровня, первичной кэш-памятью или Level 1 Cache. Находится в самом ЦП — самая быстрая, поскольку работает с той же скоростью, что и процессор. И задержка минимальная. Кэш L1 примерно в 100 раз быстрее ОЗУ. Кэш-память первого уровня подразделяется на два типа: кэш-память инструкций (L1i) и кэш-память для хранения данных (L1d), необходимых ЦП. Объем данного уровня кэш-памяти наименьший: обычно от нескольких килобайт до 1 МБ. ЦП, у которого есть только L1 называют процессором с одноуровневым кэшем.
Кэш L2 — второго уровня
Кэш второго уровня или вторичный кэш часто более объемный, чем L1. Данную память называют также Level 2 Cache. Может находится внутри ЦП или на отдельной микросхеме или сопроцессоре вне ЦП. В случае, когда находится вне ЦП, подключается к процессору с помощью высокоскоростной шины. Поэтому не возникает задержек из-за трафика по главной системной шине. По скорости кэш L2 уступает кэш-памяти 1-го уровня, но примерно в 25 раз превосходит по скорости оперативную память. Объем: от нескольких сотен килобайт до 16 МБ. Если у процессора есть кэш L1 и L2, то такой кэш называют двухуровневым.
Кэш L3 — третьего уровня
Кэш L3 (Level 3 Cache) называют еще и кэшем третьего уровня, реже: третичным кэшем, Ternary Cache (T-Cache). L3 — специальная память, которая была разработана для повышения производительности кэша L1 и L2. Предусмотрена не во всех процессорах, преимущественно в высокопроизводительных чипах. Медленнее кэша 1-го и 2-го уровней, но быстрее оперативной памяти. Объем больше, чем у вторичного кэша: от 1 до 128 мегабайт. При наличии у процессора кэш-памяти L1, L2 и L3 — кэш трехуровневый. Кэш заметно увеличивает быстродействие ноутбука или настольного ПК. Вскоре у процессоров может появиться и четвертый уровень кэша.
Суперскалярность
Как только транзисторный бюджет позволил, в микропроцессорах было реализовано несколько конвейеров. Так микропроцессоры стали суперскалярными (super-scalar).
В ранних суперскалярных микропроцессорах было реализовано два конвейера. В некоторых продвинутых микропроцессорах их число доходит до 4 и даже 6! Код команд по мере поступления из памяти разбрасывается на разные конвейеры. Потенциально за один машинный такт суперскалярный процессор способен выполнить четыре (или шесть) команды одновременно, т.е. теоретический прирост скорости в 4 раза достигается только за счет простого размножения конвейеров и небольшого усложнения логики.
Назначение кэш памяти
Процессор работает с данными, хранящимися в оперативной памяти. Однако скорость работы оперативной памяти и процессора существенно различаются: если бы процессор напрямую общался с оперативной памятью, то большую часть времени простаивал бы. Именно для сокращения задержек доступа к оперативной памяти и применяется кэшпамять, которая значительно более скоростная в сравнении с оперативной. Фактически если оперативная память используется для того, чтобы сгладить задержки доступа к данным на накопителе (HDD-диске, SSD-накопителе или флэшпамяти), то кэш процессора применяется для нивелирования задержек доступа к самой оперативной памяти. В этом смысле оперативную память можно рассматривать как кэш накопителя. Однако между оперативной памятью и кэшем процессора есть одно очень серьезное различие: кэш процессора полностью прозрачен для программиста, то есть нельзя адресовать программным образом находящиеся в нем данные.
Есть и другая причина, по которой необходимо использовать кэш как промежуточное звено между процессором и оперативной памятью. Дело в том, что процесс чтения и записи данных в оперативную память происходит не отдельными байтами, а пакетами, состоящими как минимум из четырех 64-разрядных ячеек. Это позволяет повысить эффективность работы памяти. Однако процессор загружает данные в свои регистры в виде байт, слов, двойных слов или даже четверных слов. В любом случае он не работает с пакетами данных. То есть минимальная единица информации, считываемая из оперативной памяти, всегда больше той минимальной единицы информации, с которой работает процессор. Возникает вопрос: если из памяти считывается целый пакет данных, а требуется, к примеру, только одно двухбайтовое слово, то куда девать все остальные байты? Отбрасывать их было бы крайне нерентабельно, поскольку велика вероятность, что если сейчас процессору требуются данные, расположенные по одному адресу в оперативной памяти, то в следующий момент он запросит данные, находящиеся по соседнему адресу. А потому считанный пакет данных из оперативной памяти нужно где-то временно сохранить, то есть требуется промежуточная память для временного хранения считываемых данных. Аналогично запись в оперативную память происходит пакетами данных, но эти пакеты нужно где-то предварительно сформировать, то есть опять-таки нужна временная память или кэш.
Что такое кэш-память процессора
Решая любую задачу, процессор компьютера получает из оперативной памяти необходимые блоки информации. Обработав их, он записывает в память результаты вычислений и получает для обработки следующие блоки. Это продолжается, пока задача не будет выполнена. Все упомянутые операции производятся на очень высокой скорости. Однако, даже самая быстрая оперативная память работает медленнее любого «неторопливого» процессора. Каждое считывание из нее информации и обратная ее запись отнимают много времени. В среднем, скорость работы оперативной памяти в 16 – 17 раз ниже скорости процессора. Не смотря на такой дисбаланс, процессор не простаивает и не ожидает каждый раз, когда оперативная память «выдает» или «принимает» данные. Он почти всегда работает на максимальной скорости. И все благодаря наличию у него кэш-памяти. Кэш-память процессора – это небольшая, но очень быстрая память. Она встроена в процессор и является своеобразным буфером, сглаживающим перебои в обмене данными с более медленной оперативной памятью. Кэш-память часто называют сверхоперативной памятью. Кэш нужен не только для выравнивания дисбаланса скорости. Процессор обрабатывает данные более мелкими порциями, чем те, в которых они хранятся в оперативной памяти. Поэтому кэш-память играет еще и роль своеобразного места для «перепаковки» и временного хранения информации перед ее передачей процессору, а также возвращением результатов обработки в оперативную память.
Хранение информации — регистры и память
Как говорилось ранее, процессор выполняет поступающие на него команды. Команды в большинстве случаев работают с данными, которые могут быть промежуточными, входными или выходными. Все эти данные вместе с инструкциями сохраняются в регистрах и памяти.
Регистры
Регистр — минимальная ячейка памяти данных. Регистры состоят из триггеров (англ. latches/flip-flops). Триггеры, в свою очередь, состоят из логических элементов и могут хранить в себе 1 бит информации.
Прим. перев. Триггеры могут быть синхронные и асинхронные. Асинхронные могут менять своё состояние в любой момент, а синхронные только во время положительного/отрицательного перепада на входе синхронизации.
По функциональному назначению триггеры делятся на несколько групп:
- RS-триггер: сохраняет своё состояние при нулевых уровнях на обоих входах и изменяет его при установке единице на одном из входов (Reset/Set — Сброс/Установка).
- JK-триггер: идентичен RS-триггеру за исключением того, что при подаче единиц сразу на два входа триггер меняет своё состояние на противоположное (счётный режим).
- T-триггер: меняет своё состояние на противоположное при каждом такте на его единственном входе.
- D-триггер: запоминает состояние на входе в момент синхронизации. Асинхронные D-триггеры смысла не имеют.
Для хранения промежуточных данных ОЗУ не подходит, т. к. это замедлит работу процессора. Промежуточные данные отсылаются в регистры по шине. В них могут храниться команды, выходные данные и даже адреса ячеек памяти.
На данный момент этот блок не поддерживается, но мы не забыли о нём!Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
Память (ОЗУ)
ОЗУ (оперативное запоминающее устройство, англ. RAM) — это большая группа этих самых регистров, соединённых вместе. Память у такого хранилища непостоянная и данные оттуда пропадают при отключении питания. ОЗУ принимает адрес ячейки памяти, в которую нужно поместить данные, сами данные и флаг записи/чтения, который приводит в действие триггеры.
Прим. перев. Оперативная память бывает статической и динамической — SRAM и DRAM соответственно. В статической памяти ячейками являются триггеры, а в динамической — конденсаторы. SRAM быстрее, а DRAM дешевле.
Что такое кэш-память на компьютере
Кэш-память хранит самые важные временные файлы, которые могут понадобиться в ближайшее время. Например, когда вы смотрите видео в интернете, оно постепенно загружается и содержится в кэш-памяти браузера до тех пор, пока вы не закончите. Затем видео удаляется за ненадобностью. Так что, по сути, включая фильм в интернете, вы всё равно скачиваете его на компьютер и удаляете после просмотра.
Кэш-память используется и в Windows. Обычно там хранятся результаты вычислений программ. Обычно кэш своевременно удаляется, но есть виды, которые накапливаются и захламляют систему, потому что компьютер не может определить, нужна ли ещё эта информация или уже нет. Есть четыре вида кэш-памяти, которые нуждаются в постоянной очистке.
- DNS-кэш, который хранит запросы компьютера к другим серверам сети. Необходим для того, чтобы не тратить время на повторные обращения, вся необходимая информация хранится в кэш-памяти. Когда нужно полностью обновить данные с сервера, тогда меняется и DNS-кэш. Соответственно, сами собой данные не удаляются, поэтому даже ненужные сохраняются там.
- Thumbnail-кэш. Thumbnail дословно переводится как «ноготь большого пальца», а образно обозначает в английском языке миниатюры картинки, превью или эскизы. Компьютер сохраняет в кэш-памяти иконки картинок, видеофайлов или значков программ, поэтому прогружает миниатюры во второй раз значительно быстрее. Но если сами картинки уже удалены, их миниатюры из кэша не исчезают.
- Кэш оперативной памяти. Сама оперативная память тоже хранит в себе временные файлы по технологии cache. И некоторые файлы не очищаются из-за ошибок или багов.
- Кэш браузера. Уже было упомянуто о кэшировании видео для онлайн-просмотра, но это не всё. Каждая картинка, элементы дизайна, анимация на сайтах сохраняются в кэш-память. Часть веб-страниц полностью хранится во временной памяти, чтобы сократить время их прогрузки. Всё это накапливается, и даже уже неиспользуемые сайты продолжают занимать место.
Повышение стабильности и плавности игры
Встроенный кэш является одной из ключевых технологий, которая позволяет повысить стабильность и плавность игрового процесса. Он помогает уменьшить задержки и лаги, снизить время загрузки игры, а также улучшить общую производительность.
Основная функция встроенного кэша заключается в сохранении данных, которые игра часто использует. Это может включать текстуры, модели персонажей, звуковые эффекты и другие ресурсы, необходимые для игрового процесса. Когда игра запущена, она быстро получает доступ к этим данным из кэша, вместо того чтобы загружать их снова с жесткого диска или интернета. Это существенно сокращает время, необходимое для обработки и отображения игровой информации, что позволяет улучшить стабильность и плавность игры.
Встроенный кэш также помогает снизить задержки и лаги, связанные с недостаточной скоростью интернет-соединения. Когда игра запускается, она загружает и сохраняет необходимые данные в кэш, а затем использует их для отображения игрового контента. Это позволяет сократить время, которое игра тратит на загрузку данных с серверов, и уменьшить задержки и лаги, вызванные медленным интернет-соединением. Таким образом, встроенный кэш способствует повышению стабильности игры и снижению вероятности возникновения проблем, связанных с подключением к интернету.
Кроме того, встроенный кэш может улучшить общую производительность игры. Загрузка и отображение данных из кэша происходит намного быстрее, чем при загрузке с жесткого диска или интернета. Это позволяет игре работать более плавно и быстро обрабатывать информацию. Благодаря этому игровой процесс становится более отзывчивым и комфортным для игроков.
Почему не нужно использовать программы для оптимизации памяти
На многих сайтах компьютерной тематики обязательно найдутся ссылки на программы, которые обещают в один клик улучшить работу нашего компьютера и превратить старенький медленный компьютер в скоростной «космолет». Мы уже писали о том, что подобные «однокликовые» оптимизаторы как минимум бесполезны, и что к вопросу оптимизации необходимо подходить совершенно иначе — более продуманно и уж никак не с инструментом вида «в один клик». Также встречаются и оптимизаторы оперативной памяти, которые в линейке бесполезных утилит стоят особо высоко, потому что они не только не приносят никакой пользы, но и снижают скорость работы вашего компьютера. И сейчас я объясню почему.
Виды кэша
Аппаратная реализация используется процессором, системой, различными низкоуровневыми, то есть близкими к «железу» процессами. Кэш-память отличается от обычного хранилища данных на физическом уровне, она принципиально другая.
Программная реализация используется программами и сервисами. У каждого приложения она своя. Это по сути код, который описывает, как размещать, кэшировать и хранить данные. При этом сама информация находится в обычных участках памяти: на жестком диске, SSD, сервере. На аппаратном, «железном» уровне такой кэш практически не отличается от простого хранилища данных.
Если о кэше заходит речь в контексте веба, баз данных и других подобных систем, то обычно имеется в виду программный. С аппаратными кэшами работают инженеры и низкоуровневые программисты.
Встроенный кэш: определение и принцип работы
Основной принцип работы встроенного кэша основан на использовании принципа локальности времени и пространства. Локальность времени означает, что данные, к которым недавно был произведен доступ, скорее всего будут использованы снова в ближайшем будущем. Локальность пространства означает, что данные, находящиеся рядом в памяти, скорее всего будут использованы последовательно.
Встроенный кэш разделяется на несколько уровней: L1, L2, и, в случае многоядерных процессоров, L3. Уровень L1 является самым близким к процессору и самым быстрым, а уровень L3 — самым дальним и медленным. Каждый уровень кэша имеет свой размер и время доступа к данным.
Когда процессор получает команду на доступ к данным, он сначала проверяет наличие этих данных в кэше более высокого уровня (L1, L2), и, в случае отсутствия данных, производит запрос к кэшу более низкого уровня (или к оперативной памяти, если данные отсутствуют во всех уровнях кэша). В случае нахождения данных в кэше, процессор может сразу начать последующие операции с этими данными, что позволяет сократить время доступа и увеличить производительность работы системы.
Однако, встроенный кэш имеет ограниченный объем, поэтому не все данные могут поместиться в него. Чтобы определить, какие данные будут храниться в кэше, используются специальные алгоритмы, такие как алгоритмы замещения (например, алгоритм LRU — Least Recently Used) и алгоритмы предсказания (например, алгоритмы предсказания ветвлений).
Уровень кэша (L) | Размер | Скорость доступа |
L1 | От нескольких десятков до нескольких сотен килобайт | От 1 до 4 тактов процессора |
L2 | От нескольких сотен килобайт до нескольких мегабайт | От 3 до 10 тактов процессора |
L3 | От нескольких мегабайт до нескольких десятков мегабайт | От 10 до 30 тактов процессора |
Как работает встроенный кэш в играх: этапы и механизмы
Этапы работы встроенного кэша в играх:
1. Загрузка ресурсов:
Первым этапом работы встроенного кэша в игре является загрузка всех необходимых ресурсов, таких как текстуры, аудио и видео файлы. Загрузка происходит на начальном этапе игры и может быть разделена на несколько фаз в зависимости от их типа.
2. Компиляция и оптимизация:
На этом этапе встроенный кэш проводит компиляцию и оптимизацию ресурсов для более эффективного использования. Он преобразует входные данные в формат, который будет оптимально работать с аппаратными средствами устройства, на котором запускается игра.
3. Кэширование:
Самым важным этапом работы встроенного кэша является кэширование ресурсов. Во время игры ресурсы, которые уже были загружены, сохраняются в кэше. Это позволяет быстро получать к ним доступ без необходимости повторной загрузки с диска или сетевого хранилища.
4. Обновление кэша:
Обновление кэша происходит в случае, если ресурсы были изменены или обновлены. Встроенный кэш отслеживает изменения и автоматически обновляет необходимые ресурсы, чтобы игра продолжала работать с последними версиями.
Механизмы работы встроенного кэша в играх:
1. Буферизация:
Один из основных механизмов работы встроенного кэша в играх — буферизация. Он сохраняет в памяти заранее загруженные данные, чтобы они были готовы к использованию в необходимый момент. Это позволяет значительно сократить время, требуемое для загрузки данных с диска или сети во время игры.
2. Компрессия:
Кэш в играх может использовать компрессию для уменьшения размера хранимых данных. Это позволяет экономить память и увеличивает эффективность работы игры. При необходимости данные могут быть разархивированы непосредственно перед использованием.
3. Ключевые слова и идентификаторы:
Для быстрого доступа к кэшированным ресурсам встроенный кэш использует ключевые слова и идентификаторы. Они позволяют быстро найти необходимые ресурсы и ускоряют процесс доступа к данным.
Встроенный кэш в играх является одним из важных элементов для достижения высокого качества и производительности игрового процесса. Он позволяет минимизировать время загрузки ресурсов, уменьшить нагрузку на дисковую подсистему и повысить общую отзывчивость игры.
Эволюция микропроцессора
Когда первые CMOS-микропроцессоры в начале 70-ых были представлены на рынке, они вызывали смех у гигантов компьютеростроения. Вычислительные мощности микропроцессоров были ничтожными, быстродействие смехотворным, а возможности — просто детскими. По своим характеристикам они подходили разве что для микрокалькуляторов и для игрушечных наручных часов. Для серьезной вычислительной техники гиганты индустрии создавали своих монстров на другой технологической базе и считали, что «мелкашки» всегда останутся в нише несерьезной техники.
Но с начала 70-ых CMOS-технология не стояла на месте. Эмпирический закон масштабирования Деннарда подсказал, что CMOS-технология способна повысить быстродействие микросхем, если уменьшить размеры её элементов. Поэтому с начала 80-ых годов начался неумолимый ход уменьшения технологического процесса в производстве микроэлектроники.
Чем меньше становился техпроцесс, тем большим становился бюджет транзисторов в распоряжении проектировщиков. И с уменьшением размеров транзисторов на подложке одного и того же размера можно было разместить больше функционала, больше систем, реализовать более богатые возможности, «научить» микропроцессор делать то, что под силу было раньше только самым мощным суперкомпьютерам. И, конечно же, малые размеры позволяли увеличивать тактовую частоту процессора, разгоняя его до космических скоростей.
А теперь всё вместе
На иллюстрации ниже вы видите примерную серверную конфигурацию 2012 года с 2-мя процессорами Intel Sandy Bridge, каждый из которых имеет N ядер. У всех ядер процессора общий кэш третьего уровня L3. Каждый из процессоров имеет прямую связь со своим банком памяти, и имеет доступ к банку памяти соседнего процессора через быструю шину связи QuickPath Interconnect. Через эту же шину процессоры согласуют свои кэши, так что запись данных в кэше одного процессора видна всем ядрам другого процессора.
Иллюстрация взята с сайта Mechanical Sympathy
Если на процессоре имеется 8 вычислительных ядер, и таких процессоров на сервере два, в распоряжении многопоточного приложения оказывается 16 полноценных вычислительных ядер, которые потенциально могут выполнять 16 потоков приложения одновременно. А если каждое ядро еще и поддерживает многопоточность, то вы в итоге можете получить параллельное исполнение 32 потоков!
Из-за такой конфигурации при исполнении программы на ней проявятся интересные нюансы:
- если поток программы исполняется на ядре C1 процессора в сокете Socket 1, а данные находятся в банке памяти, принадлежащем процессору из Socket 2, доступ к этим данным будет медленнее через QPI, чем если они были в родном банке памяти. Из-за того что банки памяти разделены, мы наблюдаем неединообразный доступ к памяти (Non-uniform memory access, NUMA). Следовательно, чтобы данные извлекались быстро, они должны быть в банке памяти того процессора, где исполняется ваша программа
- если ваш поток исполнялся на C1 процессора в сокете Socket 1, а потом планировщик перебросил его на C2 процессора в сокете Socket 2, потоку после «пробуждения» придется заново вытаскивать из памяти все данные, так как они остались в кэшах процессора Socket 1. Следовательно, чтобы поток работал быстро, надо его «прикрепить» (pin) к определенному процессору и не давать планировщику перетаскивать его на другой процессор. Будет еще лучше, если поток все время будет работать только на одном и том же ядре, так как у него всегда будут «под рукой» данные из кэша L1 и L2. А еще лучше, чтобы вообще никакой другой поток на этом ядре не работал. Тогда в кэшах L1 и L2 всегда будут данные только данного потока.
- у каждого процессора имеется свой собственный кэш L1 и L2. Как было сказано выше, данные в кэш из памяти выбираются блоками (cache line). Если ваши данные не влеказют в размер такого блока, процессору придется тратить дополнительное время на выборку данныъ из памяти. Следовательно, чтобы этого не происходило, при тонкой настрйоке приложения постарайтесь подогнать размеры ваших объектов под размеры cache-line процессора на PROD. А еще было бы идеально, чтобы вся ваша программа помещалась в кэше процессора. К счастью размеры кэшей современных процессоров сейчас стали просто гиганстскими.