Э. Таненбаум - Архитектура компьютера (1127755), страница 83
Текст из файла (страница 83)
Это поле вмещает одну строку кэша размером 32 байта. В кэш-памяти прямого отображения заданное слово может храниться только в одном месте. Если его в этом месте нет, значит, его вообще нет в кэш-памяти. Для хранения данных в каше и извлечения их из кэша адрес разбивается на 4 компонента, как показано на рис. 4.26, б: + Поле строки указывает, какой элемент кэш-памяти содержит соответствующие данные, если они есть в кэш-памяти. Повышение производительности 333 Бит достоверности реса, которые используют этот элемент Элемент 65504-65535, 131040-131072,...
2047 96-127, 65632-65663, 131068-131099 64-95, 65600-65631, 131036-131067,... 32-63, 65568-65599, 131004-131035,... 0-31, 65536-65567, 131072-131003,... 3 2 16 Биты Строка Слово Байт Тег Рис. 4.26. Кзш-память прямого отображения (а); 32-разрядный виртуальный адрес (б) + Поле тега соответствует битам, сохраненным в поле тега элемента кэш-па- мяти. + Поле слова указывает, на какое слово в строке производится ссылка. + Поле байта обычно не используется, но если требуется только один байт, в этом поле указано, какой именно байт в слове нужен. Для кэш-памяти, поддерживающей только 32-разрядные слова, это поле всегда содержит О.
Когда центральный процессор выдает адрес памяти, аппаратура выделяет из этого адреса 11 бит поля строки и использует их для поиска в кэш-памяти одного из 2048 элементов. Если элемент действителен, то производится сравнение поля тета основной памяти и поля тега кэш-памяти. Если поля равны, значит, в кэш-памяти есть запрашиваемое слово. Такая ситуация называется кэш-попаданием. В случае кэш-попадания слово берется прямо из кэш-памяти, и тогда не нужно обращаться к основной памяти. Из элемента кэш-памяти берется только нужное слово, остальная часть элемента не используется. Если элемент кэш-памяти недействителен (недостовереи) или поля тета не совпадают, то нужного слова нет в памяти.
Такая ситуация называется кэш-промахом. В этом случае 32-байтная строка вызывается из основной памяти и сохраняется в кэш-памяти, заменяя тот элемент, который там был. Однако если существующий элемент кэш-памяти изменяется, его нужно записать обратно в основную память до того, как он будет удален. Несмотря на сложность решения, доступ к нужному слову может быть чрезвычайно быстрым.
Поскольку известен адрес, известно и точное местополо- 334 Глава 4. Уровень микроархитектуры жение слова, если оно имеется в кэш-памяти. Это значит, что нужно считать слово из кэш-памяти, доставить его пропессору и одновременно с этим проверить, правильное ли это слово (путем сравнения полей тега). Поэтому процессор в действительности получает слово из кэш-памяти одновременно или даже до того, как становится известно, запрошенное это слово или нет. При такой схеме смежные строки основной памяти помещаются в смежные алементы кзш-памяти.
Фактически в кэш-памяти может храниться до 64 Кбайт смежных данных. Однако две строки, адреса которых отличаются ровно на 64 Кбайт (65 536 байт) или на любое целое, кратное этому числу, не могут одновременно хранится в кзш-памяти (поскольку они имеют одно и то же значение поля строки). Например, если программа обращается к данным с адресом Х, а затем выполняет команду, которой требуются данные с адресом Х + 65 536 (или с любым другим адресом в той же строке), вторая команда требует перезагрузки элемента кэш-памяти. Если это происходит достаточно часто, то могут возникнуть проблемы. В действительности, если кэш-память плохо работает, лучше, чтобы ее вообще не было, поскольку при каждой операции с основной памятью считывается целая строка, а не одно слово.
Каш-память прямого отображения — это самый распространенный тип кэш-памяти, и она достаточно эффективна, поскольку коллизии, подобные описанной, случаются крайне редко или вообще не случаются'. Например, качественный компилятор может учитывать подобные коллизии при размещении команд и данных в памяти. Отметим, что указанный случай не произойдет в системе, где команды и данные хранятся раздельно, поскольку конфликтующие запросы будут обслуживаться разными кэшами.
Таким образом, мгц видим второе преимущество наличия двух кашей вместо одного — больше гибкости при разрешении конфликтных ситуаций. Ассоциативная кзш-память с множественным доступом Как было отмечено ранее, различные строки основной памяти конкурируют за право занять одну и ту же область каша. Если программе, используюшей кэш-память, изображенную на рис. 4.26, а, часто требуются слова с адресами 0 и 65 536, то будут иметь место постоянные конфликты, поскольку каждое обрашение потенциально повлечет за собой вытеснение из кэш-памяти той или иной строки. Чтобы разрешить эту проблему, нужно сделать так, чтобы в каждом элементе кэш-памяти помещалось по две и более строки.
Кэш-память с п возможными элементами для каждого адреса назтцвается и-входовой ассоциативной кзш-памятью. 4-входовая ассоциативная кэш-память изображена на рис. 4.27. Ассоциативная кэш-память с множественным доступом по сути гораздо сложнее, чем кэш-память прямого отображения, поскольку, хотя элемент кэш-памяти и можно вычислить по адресу основной памяти, требуется проверить и элементов кэш-памяти, чтобы узнать, есть ли там нужная нам строка.
Тем не менее ' 'гта самом деле подобные коллизии не столь уж и редки из-за того, что при страничном способе организации виртуальной памяти и параллельном выполнении нескольких заданий страницы как бы еперемепгиваютсяь. Разбиение программы на страницы осуществляется случайным образом, поэтому и «локальность кодах может быть иарущена.
— Примеч. научи. ред. Повышение производительности 335 практика показывает, что 2- или 4-входовая ассоциативная кэш-память дает хо- роший результат, поэтому внедрение этих дополнительных схем вполне оправ- данно. Бит достоверности Бит достоверности Бит достоверности Бит достоверности Тег Данные Тег Данные Тег Данные Тег Данные 2047 Элемент А Элемент В Элемент С Элемент й Рис. 4.27. 4-входовая ассоциативная кэш-память Использование ассоциативной кэш-памяти с множественным доступом ставит разработчика перед выбором. Если нужно поместить новый элемент в кэшпамять, какой именно из старых элементов удалить? Для большинства задач хорошо подходит алгоритм обработки элемента, который дольше всего ие использовался (Ееазг гтесеп1у ()зес1, ЕК~1).
Имеется определенный порядок каждого набора ячеек, доступных из данной ячейки памяти. Всякий раз, когда осуществляется доступ к любой строке, в соответствии с алгоритмом ЕКУ список обновляется, и маркируется элемент, к которому произведено последнее обращение. Когда требуется заменить какой-нибудь элемент, удаляется тот, который находится в конце списка, то есть тот, который использовался раньше других.
Возможен также предельный случай — 2048-входовая ассоциативная кэш-память, содержащая единственный набор из 2048 элементов. В данном случае все адреса памяти оказываются в этом наборе, поэтому при поиске требуется сравнивать нужный адрес со всеми 2048 тегами в кэш-памяти. Отметим, что для этого каждый элемент кэш-памяти должен содержать специальную логическую схему. Поскольку поле строки в данном случае нулевое, поле тега — это весь адрес за исключением полей слова и байта.
Более того, когда строка каша заменяется, возможными кандидатами на смену являются все 2048 элементов. Для хранения упорядоченного списка потребовался бы громоздкий учет использования системных ресурсов,поатому применение алгоритма Ется оказывается невозможным. (Вспомните, что список требуется обновлять при каждой операции с памятью.) Интересно, что кэш-память с большим числом входов далеко не всегда превосходит по производительности кэш-память, в которой число входов невелико, а в некоторых случаях работает даже хуже.
Поэтому число входов больше четырех встречается редко. 336 Глава 4. Уровень микроархитектуры Наконец, особой проблемой для кэш-памяти является запись. Когда процессор записывает слово, а это слово есть в кэш-памяти, он, очевидно, должен либо обновить слово, либо удалить данный элемент кэш-памяти. Практически во всех разработках имеет место обновление кэш-памяти. А что же можно сказать об обновлении копии в основной памяти7 Эту операцию можно отложить на потом до того момента, когда строка каша будет готова к замене в соответствии с алгоритмом ЕКП. Выбор труден и ни одно из решений не является предпочтительным. Немедленное обновление элемента основной памяти называется сквозной записью.
Этот подход обычно гораздо проще реализуется, и к тому же он более надежен, поскольку современная память при ошибке всегда может восстановить свое предыдущее состояние. К сожалению, при этом требуется передавать больше данных в память, поэтому в сложных проектах стремятся использовать альтернативный подход — обратную, или отложенную, запись.
С процессом записи связана еще одна проблема: что происходит, если нужно записать что-либо в ячейку, которой нет в кэш-памяти7 Должны ли данные передаваться в кэш или просто записываться в основную память? И снова ни один из ответов не является во всех отношениях лучшим. В большинстве разработок, в которых применяется обратная запись, данные передаются в кэш-память. Эта технология называется заполнением по записи (я гйе а11осайоп). С другой стороны, в тех разработках, где применяется сквозная запись, элемент в кэш-память при записи обычно не помещается, поскольку это усложняет систему.
Заполнение по записи полезно только в том случае, если имеют место повторные записи в одно и то же слово или в разные слова в пределах одной строки кэша. Эффективность кэширования является крайне важным условием повышения общей производительности системы в силу огромного разрыва между быстродействием процессора и памяти. Дискуссия об альтернативных стратегиях кэширования ведется постоянно 16, 96, 145, 149, 1971. Прогнозирование ветвлений Современные компьютеры в значительной степени конвейеризированы.
Конвейер, изображенный на рис. 4.24, имеет семь ступеней; более сложно организованные компьютеры содержат конвейеры с десятью и более ступенями. Конвейеризация лучше работает с линейным кодом, поэтому блок выборки команд может просто считывать последовательные слова из памяти и отправлять их в блок декодирования заранее, еще до того, как они понадобятся.