ПОД_2.1 (1184242)
Текст из файла
Казачкин Дмитрий, 522 гр.
Многоуровневый кэш
(параметры, эффективность, учет при программировании).
Кэш (иногда также называется «сверхоперативной памятью») – промежуточный буфер памяти с быстрым доступом, содержащий копию той информации, которая хранится в памяти с менее быстрым доступом, но с наибольшей вероятностью может быть оттуда запрошена.
Доступ к данным в кэше идёт быстрее, чем выборка исходных данных из медленной памяти или их перевычисление, что делает среднее время доступа короче. При этом, в отличии от оперативной памяти, данные в кэше не адресуемы непосредственно, напротив, кэш прозрачен для программиста.
В задачи кэша входит обеспечение быстрого доступа к интенсивно используемым данным, согласование интерфейсов процессора и контроллера памяти, упреждающая загрузка данных и отложенная запись данных.
Многоуровневый кэш – система из нескольких кэшей, организованных иерархически, при этом каши разных уровней иерархии обладают разными характеристиками. Кэш-память уровня N+1 как правило больше по размеру и медленнее по скорости обращения и передаче данных, чем кэш-память уровня N. У кэша меньшего размера меньше задержка при обращении (latency), но за это приходится платить частотой попадания (hit rate), которая также ниже.
Как правило, в современных архитектурах используется кэш, имеющий как минимум 2 уровня. При этом уровни существенно отличаются целым рядом характеристик:
-
Объем
-
Политика записи (немедленная / отложенная запись)
-
Тип организации (прямое отображение / полная ассоциативность / частичная ассоциативность)
-
Число портов (интерфейсов доступа к памяти)
-
Размер строки
Первый, наиболее "близкий" к процессору (условно обозначаемый Level 1 или сокращенно L1), обычно реализуется на быстрой двухпортовой синхронной статической памяти, работающей на полной частоте ядра процессора. Объем L1-кэша весьма невелик и редко превышает 128 Кб, поэтому он должен хранить только самые-самые необходимые данные. Зато на обработку двух полноразрядных ячеек уходит всего один такт.
Процессоры x86 оснащаются не истинно двухпортовой памятью. Двухпортовый у нее лишь интерфейс, а ядро памяти состоит из нескольких независимых банков - обычно восьми, реализованных на однопортовых матрицах и параллельный доступ возможен лишь к ячейкам разных банков).
Кэш первого уровня традиционно разделяется на две (как правило, равные) половины: кэш инструкций (L1I) и кэш данных (L1D). Это разделение предусматривается так называемой «гарвардской архитектурой» процессора, теоретической разработкой для построения современных CPU. В L1I, соответственно, аккумулируются только команды (с ним работает декодер), а в L1D — только данные (они впоследствии, как правило, попадают во внутренние регистры процессора). Ранее, в процессорах Intel-486 использовалась «принстонская архитектура» – смешанный кэш для команд и данных.
Кэш команд может быть реализован только для чтения, следовательно, не требует реализации никаких алгоритмов обратной записи, что делает этот кэш проще, дешевле и быстрее. Кроме того, многие современные процессоры имеют конвейерную архитектуру, при которой блоки конвейера работают параллельно. Таким образом, выборка команды и доступ к данным команды осуществляется на разных этапах конвейера, а использование раздельной кэш-памяти позволяет выполнять эти операции параллельно.
По сути, L1 является неотъемлемой частью процессора, поскольку расположен на одном с ним кристалле и входит в состав функциональных блоков. Некоторые процессоры без L1 кэша не могут функционировать. На других его можно отключить, но тогда значительно падает производительность процессора.
Между кэшем первого уровня и оперативной памятью расположен кэш второго уровня (условно обозначаемый Level 2 или сокращенно L2). Он реализуется на однопортовой конвейерной статической памяти (BSRAM) и зачастую работает на пониженной тактовой частоте.
Поскольку однопортовая память значительно дешевле, объем L2 кэша зачастую достигает нескольких мегабайт. Между тем, скорость доступа к нему относительно невелика (хотя, естественно, многократно превосходит скорость доступа к основной памяти).
В то время как кэш первого уровня на каждое ядро свой у всех процессоров, в современных многоядерных процессорах возможны разные политики организации кэша второго и последующих уровней:
• есть процессоры с общим (shared) кэшем второго уровня на все ядра (решение Intel)
• есть на каждое ядро свой кэш второго уровня (решение AMD)
Существую различные архитектуры многоуровневого кэша, связанные с дублированием информации. Первая хронологически архитектура - включающая (inclusive). Кэш второго уровня, построенный по inclusive-архитектуре, всегда дублирует содержимое кэша первого уровня, а потому эффективная емкость сверхоперативной памяти обоих иерархий равна.
Пусть кэш L2 заполнен полностью и треуется считать дополнительную ячейку. Обнаружив, что все кэш-линейки заняты, кэш второго уровня избавляется от наименее ценной из них, стремясь при этом найти линейку, которая еще не была модифицирована, поскольку в противном случае ее еще придется выгружать в основную оперативную память, а это - время. Затем кэш второго уровня передает полученные из памяти данные кэшу первого уровня. Если кэш первого уровня также заполнен под завязку, ему приходится избавляться от одной из строк по сценарию, описанному выше.
Таким образом, загруженная порция данных присутствует и кэш-памяти первого уровня, и в кэш-памяти второго, что не есть хорошо. Между тем, многие процессоры построенные именно по включающей архитектуре. В процессорах Intel Pentium II, III, IV реализована частично включающая архитектура, когда дублируется лишь часть данных.
Другая архитектура - исключающая (exclusive). Кэш-подсистема, построенная по exclusive-архитектуре, никогда не хранит избыточных копий данных и потому эффективная емкость сверхоперативной памяти определяется суммой размеров сверхоперативной памяти всех иерархий. Кэш-первого уровня никогда не уничтожает кэш-линейки при нехватке места.
Даже если они не были модифицированы - данные в обязательном порядке вытесняются в кэш-второго уровня, помещаясь на то место, где находилась только что переданная кэшу первого уровня линейка. Т.е. кэш первого и кэш второго уровней как бы обмениваются друг с другом своими линейками, а потому сверхоперативная память используется весьма эффективно. Впервые эксклюзивная кэш-подсистема была реализована в процессоре AMD Athlon.
Критерием эффективной работы кэша можно считать уменьшение среднего времени доступа к памяти по сравнению с системой без кэш-памяти. В таком случае среднее время доступа можно оценить следующим образом:
Tср = (Thit x Rhit) + (Tmiss x (1 - Rhit))
где Thit - время доступа к кэш-памяти в случае попадания (включает время на идентификацию промаха или попадания), Tmiss - время, необходимое на загрузку блока из основной памяти в строку кэша в случае кэш-промаха и последующую доставку запрошенных данных в процессор, Rhit - частота попаданий.
Очевидно, что чем ближе значение Rhit к 1, тем ближе значение Tср к Thit. Частота попаданий определяется в основном архитектурой кэш-памяти и ее объемом. Влияние наличия и отсутствия кэш-памяти и ее объема на рост производительности ЦП показано в приведенной ниже таблице.
Размер и эффективность кэш-памяти | ||
Размер кэш-памяти | Частота попаданий, % | Рост производительности, % |
Нет кэш-памяти, DRAM с 2 TW | - | 0 |
16 Кб | 81 | 35 |
32 Кб | 86 | 38 |
64 Кб | 88 | 39 |
128 Кб | 89 | 39 |
Чтобы учесть устройство кэша при программировании, следует в блочных алгоритмах следить за объемом анализируемых на каждой итерации данных. Идеальный вариант - попадание блока целиком в кэш L1. Худший – превышение эффективного размера кэша, что приведет к огромному числу пересылок данных, как между уровнями кэша, так и между кэшем и памятью. Если же данные в кэш не помещаются, лучше обрабатывать многомерные массивы по строкам (последовательным участкам памяти), а не по столбцам.
Требуется также учитывать ассоциативность кэша и количество банков в нем, не следует использовать циклы с шагом, кратным числу банков памяти.
Возможны ситуации, когда полезно отключить отдельные уровни кэширования. Отключение кэша второго и третьего уровней обычно используется в математических задачах, например, при обсчёте полигонов, когда объём данных меньше размера кэша. В этом случае, можно сразу записать все данные в кэш, а затем производить их обработку. Возможна и обратная ситуация: в задачах, связанных с многочисленными обращениями к ограниченной области памяти, например, СУБД, при отключении кэша L2 производительность может упасть в десятки раз.
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.