Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Цилькер Б.Я., Орлов С.А. Организация ЭВМ и систем

.pdf
Скачиваний:
2028
Добавлен:
02.05.2014
Размер:
22.66 Mб
Скачать

Мультипроцессорная когерентность кэш-памяти 5 05

туп к кэш-памяти. Тем не менее общая задержка обращения к памяти в целом умень­ шается.

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

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

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

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

акакие — нет, возлагается на программиста, что делает этот способ непрозрачным для пользователя.

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

Широковещательная запись. При широковещательной записи каждый запрос на запись в конкретную кэш-память направляется также и всем остальным кэшам системы. Это заставляет контроллеры кэшей проверить, нет ли там копии изменяе-

Мультипроцессорная когерентность кэш-памяти 5 0 7

мые битами состояния (SB, Status Bit). Следует также учитывать, что некоторым идентичным по смыслу состояниям строки кэша разработчиками различных про­ токолов присвоены разные наименования. Например, состояние строки, в кото­ рой были произведены локальные изменения, в одних протоколах называют Dirty («грязный»), а в других - Modified («модифицированный» или «измененный»).

Протокол сквозной записи. Этот протокол представляет собой расширение стандартной процедуры сквозной записи, известной по однопроцессорным систе­ мам. В нем запись в локальную кэш-память любого процессора сопровождается записью в основную память. В дополнение, все остальные кэши, содержащие ко­ пию измененного блока, должны объявить свою копию недействительной. Прото­ кол считается наиболее простым, но при большом числе процессоров приводит к значительному трафику шины, поскольку требует повторной перезагрузки из­ мененного блока в те кэши, где этот блок ранее был объявлен недействительным [211]. Кроме того, производительность процессоров при записи в совместно ис­ пользуемые переменные может упасть из-за того, что для продолжения вычисле­ ний процессоры должны ожидать, пока завершатся все операции записи [141].

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

-блок удаляется из той кэш-памяти, где он был изменен;

-другой процессор обратился к своей копии измененного блока.

Если содержимое строки в локальном кэше не модифицировалось, перезапись в основную память не производится. Доказано, что такой протокол по эффектив­ ности превосходит схему сквозной записи, поскольку необходимо переписывать только измененные блоки [211].

Несмотря на более высокую производительность, протокол обратной записи также не идеален, так как решает проблему когерентности лишь частично. Когда процессор обновляет информацию в своей кэш-памяти, внесенные изменения не наблюдаемы со стороны других процессоров до момента перезаписи измененного блока в основную память, то есть другие процессоры не знают, что содержимое по данному адресу было изменено, до тех пор пока соответствующая строка не будет переписана в основную память. Эта проблема часто решается путем наложения условия, что кэши, которые собираются изменить содержимое совместно исполь­ зуемого блока, должны получить эксклюзивные права на этот блок, как это дела­ ется в рассматриваемом позже протоколе Berkeley [141].

В работе [110] приводятся результаты сравнения среднего трафика шины для протоколов обратной и сквозной записи. Обнаружено, что когда коэффициент кэшпопаданий приближается к 100%, протокол обратной записи вообще не требует трафика шины, так как все необходимые строки находятся в кэш-памяти. В свою очередь, протоколу сквозной записи необходим, по крайней мере, один цикл шины на каждую операцию чтения, поскольку предыдущая операция записи могла ан­ нулировать копию данных в локальном кэше. В работе также доказано, что приме­ нение протокола обратной записи взамен протокола сквозной записи способно

Мультипроцессорная когерентность кэш-памяти 50 9

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

Вэтом случае строка кэша и содержимое основной памяти не согласованы.

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

восновную память, а состояние строки скорректировано на V.

Впротоколе однократной записи когерентность сохраняется благодаря тому, что когда выполняется запись, копии изменяемой строки во всех остальных ло­ кальных кэшах объявляются недействительными. Таким образом, кэш, выполня­ ющий операцию записи, становится обладателем единственной достоверной ко­ пии (при первой записи в строку такая же копия будет и в основной памяти) [ 110]. При первой записи строка переводится в состояние R, и если впоследствии такая строка удаляется из кэш-памяти, ее перезапись в основную память не требуется. При последующих изменениях строки она помечается как D и работает протокол обратной записи.

Вранее упоминавшейся работе [110] приводятся результаты сравнения прото­ колов сквозной и обратной записи также и с протоколом однократной записи. Со­ гласно Гудмену, мультипроцессорная система, состоящая из трех компьютеров PDP-11, каждый из которых имеет множественно-ассоциативную четырехканальную кэш-память емкостью 2048 байт при длине строки в 32 байта, показывает сле­ дующие показатели трафика шины: 30,76%, 17,55% и 17,38% для протоколов сквоз­ ной, обратной и однократной записи соответственно. Таким образом, показатели протокола однократной записи по сравнению с протоколами сквозной и обратной записи несколько лучше.

Протокол Synapse. Данный протокол, реализованный в отказоустойчивой муль­ типроцессорной системе Synapse N + 1, представляет собой версию протокола од­ нократной записи, где вместо статуса R используется статус D. Кроме того, переход из состояния 0 в состояние V при промахе, возникшем в ходе чтения данных дру­ гим процессором, заменен достаточно громоздкой последовательностью. Связано это с тем, что при первом кэш-промахе чтения запросивший процессор не может получить достоверную копию непосредственно из той локальной кэш-памяти, где произошло изменение данных, и вынужден обратиться напрямую к основной па­ мяти[51,138].

51 0 Глава 11. Организация памяти вычислительных систем

Протокол Berkeley. Протокол Berkeley [141] был применен в мультипроцес­ сорной системе Berkeley, построенной на базе RISC-процессоров.

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

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

Прежде всего, каждый раз, когда какой-либо процессор производит запись в свою кэш-память, изменяемая строка переводится в состояние «измененная, ча­ стная» (PD, Private Dirty). Далее, если строка является совместно используемой, на шину посылается сигнал аннулирования, и во всех локальных кэшах, где есть копия данного блока данных, эти копии переводятся в состояние «недействи­ тельная» (I, Invalid). Если при записи имел место промах, процессор получает копию блока из кэша текущего хозяина запрошенного блока. Лишь после этих дей­ ствий процессор производит запись в свой кэш.

При кэш-промахе чтения процессор посылает запрос владельцу блока, с тем чтобы получить наиболее свежую версию последнего, и переводит свою новую копию в состояние «только для чтения» (RO, Read Only). Если владельцем строки был другой процессор, он помечает свою копию блока как «разделяемую изменен­ ную» (SD, Shared Dirty).

Диаграмма состояний протокола Berkeley показана на рис. 11.10.

Сравнивая протоколы однократной записи и Berkeley, можно отметить следу­ ющее. Оба протокола используют стратегию обратной записи, при которой изме­ ненные блоки удерживаются в кэш-памяти как можно дольше. Основная память обновляется только при .удалении строки из кэша. Верхняя граница общего количества транзакций записи на шине определяется той частью протокола однократной записи, где реализуется сквозная запись, так как последняя стра­ тегия порождает на шине операцию записи при каждом изменении, иници­ ированном процессором [141]. Поскольку первая операция записи в протоко­ ле однократной записи является сквозной, она производится даже если данные не являются совместно используемыми. Это влечет дополнительный трафик шины, который возрастает с увеличением емкости кэш-памяти. Доказано, что протокол однократной записи приводит к большему трафику шины по сравне­ нию с протоколом Berkeley [141].

Мультипроцессорная когерентность кэш-памяти 5 1 3

в состоянии S действует сквозная запись. Наблюдающие кэши при обновле­ нии своих копий используют процедуру сквозной записи. Кроме того, наблю­ дающие кэши, обнаружившие у себя копию строки, возбуждают специальную «разделяемую» линию шины с тем, чтобы записывающий контроллер мог при­ нять решение о том, в какое состояние переводить строку, в которую была про­ изведена запись. «Разделяемая» линия при кэш-промахе чтения служит для информирования контроллера локальной кэш-памяти о месте, откуда посту­ пила копия строки: из основной памяти или другого кэша. Таким образом, со­ стояние S применяется только к тем данным, которые действительно исполь­ зуются совместно [162, 212].

Рис. 11.12. Протокол Firefly

Протокол имеет преимущества перед ранее описанными в том, что стратегия сквозной записи привлекается лишь по логической необходимости. Когда ячейка перестает быть совместно используемой, нужна только одна дополнительная опе­ рация записи, которая производится последней кэш-памятью, содержащей эту ячейку. Это приводит к тому, что протокол Firefly существенно экономнее по тра­ фику шины по сравнению с прочими протоколами [211]. С другой стороны, стра­ тегия сквозной записи остается в силе до тех пор, пока строка кэша будет совмест­ но используемой, даже если фактически чтение строки и запись в нее производит только один процессор. Отсюда — увеличение трафика шины, что доказывает не­ перспективность использования данного протокола в будущих разработках про­ токолов обеспечения когерентности кэш-памяти.

Протокол Dragon. Протокол применен в мультипроцессорной системе Xerox Dragon и представляет собой независимую версию протокола Firefly.

17 Зак. 470 ;

5 1 4 Глава 1 1 . Организация памяти вычислительных систем

В протоколе реализована процедура записи с обновлением. Строка кэша может иметь одно из пяти состояний [162,212]:

- Invalid (I) - копия, хранящаяся в кэше, недействительна;

-Read Private (RP) — существует лишь одна копия блока, и она совпадает с содер­ жимым основной памяти;

-Private Dirty (PD) — существует лишь одна копия блока, и она не совпадает с со­ держимым основной памяти;

-Shared Clean (SC) — имеется несколько копий блока, и все они идентичны со­ держимому основной памяти;

-Shared Dirty (SO) — имеется несколько копий блока, не совпадающих с содер­ жимым основной памяти.

Дополнительное состояние SO предназначено для предотвращения записи в основную память. Диаграмма состояний для данного протокола приведена на рис. 11.13.

Рис. 11.13. Протокол Dragon

Протокол MESI. Безусловно, среди известных протоколов наблюдения самым популярным является протокол MESI (Modified/Exclusive/Shared/Invalid). Про­ токол MESI широко распространен в коммерческих микропроцессорных систе­ мах, например на базе микропроцессоров Pentium и PowerPC. Так, его можно обна­ ружить во внутреннем кэше и контроллере внешнего кэша i82490 микропроцессора Pentium, в процессоре i860 и контроллере кэш-памяти МС88200 фирмы Motorola,

Протокол был разработан для кэш-памяти с обратной записью. Одной из ос­ новных задач протокола MESI является откладывание на максимально возмож-