Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 3.doc
Скачиваний:
15
Добавлен:
25.03.2015
Размер:
412.67 Кб
Скачать
  1. Совместно используемая кэш-память

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

  1. Некэшируемые данные

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

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

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

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

Во втором случае накладывается запрет на кэширование всех совместно используемых данных, которые в процессе выполнения программы могут быть изменены. Естественно, что для доступа к таким данным приходится обращаться к медленной основной памяти и производительность процессора падает. На первый взгляд в варианте, где запрещается кэширование только управляющей информации, производительность процессора будет выше, однако нужно учиты-вать одно обстоятельство. Дело в том, что для сохранения согласованности дан-ных, модифицируемых процессором в ходе выполнения критической секции программы, строки с копиями этих данных в кэш-памяти при выходе из кри-тической секции нужно аннулировать. Данная операция называется очисткой кэш-памяти (cache flush). Очистка необходима для того, чтобы к моменту оче-редного входа в критическую секцию в кэш-памяти не осталось «устаревших» данных. Регулярная очистка кэша при каждом выходе из критической секции снижает производительность процессора за счет увеличения времени, нужного для восстановления копий в кэш-памяти. Ситуацию можно улучшить, если вмес-то очистки всей кэш-памяти помечать только те блоки, к которым при выпол-нении критической секции было обращение, тогда при покидании критической секции достаточно очищать только эти помеченные блоки.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]