Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_Obespechenie_soglasovannosti_kesh-pamyati_protsessorov.doc
Скачиваний:
3
Добавлен:
28.06.2024
Размер:
591.36 Кб
Скачать

Обеспечение согласованности кэш-памяти микропроцессоров в мультипроцессорных системах

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

Предположим, что МП 1 считал некоторую строку данных из ОЗУ в свою внутреннюю КП и изменил данные в этой строке в процессе работы. Если МП 2 прочитает эту же строку данных из ОЗУ, то он может получить неправильное, не измененное значение.

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

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

Программные механизмы обеспечения когерентности.

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

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

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

Аппаратные способы обеспечения когерентности.

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

Как известно, в однопроцессорных системах существует два основных механизма обновления оперативной памяти:

  • сквозная запись (write through – WT), которая подразумевает, что как только изменилась информация во внутренней кэш-памяти, эта же информация копируется в то же место оперативной памяти. Но если в системе несколько кэшей содержат одну и ту же строку памяти, то изменение строки в МП 1 не меняет кэш МП 2, тогда МП 2 прочитает из кэша старую информацию, которая к этому времени уже не актуальна.

  • отложенная запись (write back – WB, обратная запись), при которой микропроцессор после изменения информации во внутреннем кэше отражает это изменение в оперативной памяти не сразу, а лишь в тот момент, когда происходит вытеснение данной строки из кэш-памяти в оперативную. То есть существуют определенные моменты времени, когда информация, предположим, по адресу x имеет разные значения: МП 1 ее обновил, а в оперативной памяти осталось старое значение. Если в этот момент другой микропроцессор (МП 2), использующий ту же оперативную память, обратится по адресу x в ОЗУ, то он прочитает оттуда старую информацию, которая к этому времени уже не актуальна.

Таким образом, в мультипроцессорной системе ни WT, ни WB не могут обеспечить когерентность. Здесь существует два класса протоколов когерентности:

  • протоколы на основе справочника (directory based): информация о состоянии блока физической памяти содержится только в одном месте, называемом справочником (физически справочник может быть распределен по узлам системы);

  • протоколы наблюдения (snooping): каждый кэш, который содержит копию данных некоторого блока физической памяти, имеет также соответствующую копию служебной информации о его состоянии; централизованная система записей отсутствует; обычно кэши расположены на общей шине, и контроллеры всех кэшей наблюдают за шиной (просматривают ее), чтобы определять, какие обращения по адресам в пределах этого блока происходят со стороны других микропроцессоров.

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

Для поддержания когерентности применяется два основных метода:

  • Протокол записи с аннулированием (write invalidate protocol) – при выполнении записи он аннулирует другие копии, тем самым гарантирует, что процессор получит исключительные права доступа к элементу данных перед выполнением записи в этот элемент данных. Это наиболее часто используемый протокол как в схемах на основе справочников, так и в схемах наблюдения. Исключительное право доступа гарантирует, что вовремя выполнения записи не существует никаких других копий элемента данных, в которые можно писать или из которых можно читать: все другие кэшированные копии элемента данных аннулированы.

a)

b)

Рис.0. Принцип записи с аннулированием: (a) исходное состояние, (b) после изменения значения строки “x” в кэш-памяти процессора “i” все копии аннулируются.

  • Протокол записи с обновлением (write update protocol) – вызывает немедленное обновление всех копий элемента данных в случае записи в этот элемент данных. Этот тип протокола также называется протоколом записи с трансляцией (write broadcast protocol) или протоколом широковещательной записи. Отметим, что стратегия записи с обновлением требует широковещательной передачи новых данных по сети межсоединений, что возможно не при любой топологии сети.

a)

b)

Рис.0. Принцип записи с обновлением: (a) исходное состояние, (b) после изменения значения строки “x” в кэш-памяти процессора “i” все копии обновляются.

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

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

В общем случае для поддержания когерентности в мультипроцессорных системах имеются следующие возможности:

  • совместно используемая кэш-память;

  • некэшируемые данные;

  • широковещательная запись;

  • протоколы наблюдения;

  • протоколы на основе справочника.

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

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

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

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

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

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

Широковещательная запись. При широковещательной (broadcasting) записи каждый запрос на запись в конкретную кэш-память направляется также и всем остальным кэшам системы. Это заставляет контроллеры кэшей проверить, нет ли там копии изменяемого блока. Если такая копия найдена, то она аннулируется или обновляется, в зависимости от применяемой схемы (с аннулированием или обновлением). Метод широко­вещательной записи связан с дополнительными групповыми операциями с памятью (транзакциями), поэтому он реализован лишь в больших вычислительных системах.