Организация ЭВМ и систем / 481-550
.pdf
Мультипроцессорная когерентностькэш-памяти 5 1 1
Рис.11.10.ПротоколBerkeley
Для постоянно читаемой и обновляемой строки в протоколе однократной записи необходимы считываниеэтой строки в кэш, еелокальная модификация в кэше и обратная запись в память. Вся процедуратребуетдвух операций на шине: чтения из основной памяти (ОП) и обратной записи в ОП. С другой стороны, протокол Berkeley исходит из получения прав на строку. Далее блок модифицируется в кэше. Если до удаления из кэша к строке не производилось обращение, число циклов шины будет таким же, как и в протоколе однократной записи. Однако более вероятно, что строка будет запрошена опять, тогда с позиций одиночной кэш-памяти обновление строки кэша нуждается только в одной операции чтения на шине. Таким образом, протокол Berkeley пересылает строки непосредственно между кэшами, в то время как протокол однократной записи передает блок из исходного кэша в основную память, а затем из ОП в запросившие кэши, что имеет следствием общую задержку системы памяти [141],
Протокол Illinois. Протокол Illinois, предложенный Марком Папамаркосом [175], также направлен на снижение трафика шины и, соответственно, времени ожидания процессором доступа к шине. Здесь, как и в протоколе Berkeley, главенствует идея прав владения блоком, но несколько измененная. В протоколе Illinois правом владения обладает любой кэш, где есть достоверная копия блока данных. В этом случае у одного и того же блока может быть несколько владельцев. Когда такое происходит, каждому процессору назначается определенный приоритет и источником информации становится владелец с более высоким приоритетом.
Как и в предыдущем случае, сигнал аннулирования формируется, лишь когда копии данного блока имеются и в других кэшах. Возможные сценарии для протокола Illinois представлены на рис. 11.11,
5 1 2 Глава 11. Организация памяти вычислительных систем
Рис. 11 . 11 . Протокол Illinois
Каждый раз когда какой-либо процессор производит запись в свою кэш-память, изменяемая строка переводится в состояние «измененная частная» (PD, Private Dirty). Если блок данных является совместно используемым, на шину посылается сигнал аннулирования и во всех локальных кэшах, где есть копия данного блока, эти копии переводятся в состояние «недействительная» (I, Invalid). Если при записи случился промах, процессор получает копию из кэша текущего владельца запрошенного блока. Лишь после означенных действий процессор производит запись в свой кэш. Как видно, в этой части имеет место полное совпадение с протоколом Berkeley,
При кэш-промахе чтения процессор посылает запрос владельцу блока, с тем чтобы получить наиболее свежую версию последнего, и переводит свою новую копию в состояние «эксклюзивная»- (Е, Exclusive) при условии, что он является единственным владельцем строки. Б противном случае статус меняется на «разделяемая» (S, Shared).
Существенно, что протокол расширяем и тесно привязан как к коэффициенту кэш-промахов, так и к объему данных, которые являются общим достоянием мультипроцессорной системы.
Протокол Firefly. Протокол был предложен Такером и др. [211] и реализован
вмультипроцессорной системе Firefly Multiprocessor Workstation, разработанной
висследовательском центре Digital Equipment Corporation.
Впротоколе Firefly используется запись с обновлением. Возможные состояния строки кэша совпадают с состояниями протокола Illinois (рис. 11,12). Отличие состоит в том, что стратегия обратной записи применяется только к тем строкам, которые находятся в состоянии PD илиЕ,в то время как применительно к строкам
Мультипроцессорная когерентность кэш-памяти 5 1 3
в состоянии S действует сквозная запись. Наблюдающие кэши при обновлении своих копий используют процедуру сквозной записи. Кроме того, наблюдающие кэши, обнаружившие у себя копию строки, возбуждают специальную «разделяемую» линию шины с тем, чтобы записывающий контроллер мог принять решение о том, в какое состояние переводить строку, в которую была произведена запись. «Разделяемая» линия при кэш-промахе чтения служит для информирования контроллера локальной кэш-памяти о месте, откуда поступила копия строки: из основной памяти или другого кэша. Таким образом, состояние S применяется только к тем данным, которые действительно используются совместно [162, 212].
Рис. 11.12. Протокол Firefly
Протокол имеет преимущества перед ранее описанными в том, что стратегия сквозной записи привлекается лишь по логической необходимости. Когда ячейка перестает быть совместно используемой, нужна только одна дополнительная операция записи, которая производится последней кэш-памятью, содержащей эту ячейку. Это приводит к тому, что протокол Firefly существенно экономнее по трафику шины по сравнению с прочими протоколами [211]. С другой стороны, стратегия сквозной записи остается в силе до тех пор, пока строка кэша будет совместно используемой, даже если фактически чтение строки и запись в нее производит только один процессор. Отсюда — увеличение трафика шины, что доказывает неперспективность использования данного протокола в будущих разработках протоколов обеспечения когерентности кэш-памяти.
Протокол Dragon. Протокол применен в мультипроцессорной системе Xerox Dragon и представляет собой независимую версию протокола Firefly.
17 Заk. 470 ;
5 1 4 Глава 11. Организация памяти вычислительных систем
В протоколе реализована процедура записи с обновлением. Строка кэша может иметь одно из пяти состояний [162,212]:
-Invalid (I) — копия, хранящаяся в кэше, недействительна;
-ReadPrivate (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 является откладывание на максимально возмож-
Мультипроцессорная когерентность кэш-памяти 5 1 5
ный срок операции обратной записи кэшированных данных в основную память ВС. Это позволяет улучшить производительность системы за счет минимизации ненужных пересылок информации между кэшами и основной памятью.
Протокол MESI приписывает каждой кэш-строке одно из четырех состояний, которые контролируются двумя битами состояния MESI в теге данной строки. Статус кэш-строки может быть изменен как процессором, для которого эта кэшпамять является локальной, так и другими процессорами мультипроцессорной системы. Управление состоянием кэш-строк может быть возложено и на внешние логические устройства. Одна из версий протокола предусматривает использование ранее рассмотренной схемы однократной записи.
Рис. 11.14, Протокол MESI —диаграмма состояний без учета однократной записи
Согласно протоколу MESI, каждая строка бывает в одном из четырех возможных состояний (в дальнейшем будем ссылаться на эти состояния с помощью букв М,Е,SиI):
-Модифицированная (М, Modified) — данные в кэш-строке, помеченной как М, были модифицированы, но измененная информация пока не переписана в основную память. Это означает, что информация, содержащаяся в рассматриваемой строке, достовернатолько в данном кэше, а в основной памяти и остальных кэшах — недостоверна.
-Эксклюзивная (Е, Exclusive) — данная строка в кэше не подвергалась изменению посредством запроса на запись, совпадает с аналогичной строкой в основной памяти, но отсутствует в любом другом локальном кэше. Иными словами, она достоверна в этом кэше и недостоверна в любом другом.
5 1 6 Глава 11. Организация памяти вычислительных систем
-Разделяемая (S, Shared) — строка в кэше совпадает с аналогичной строкой в основной памяти (данные достоверны) и может присутствовать в одном или нескольких из прочих кэшей.
-Недействителъная (I, Invalid) — кэш-строка, помеченная как недействительная, не содержит достоверных данных и становится логически недоступной.
Мультипроцессорная когерентность кэш-памяти 5 1 7
Порядок перехода строки кэш-памяти из одного состояния в другое зависит от: текущего статуса строки, выполняемой операции (чтение или запись), результата обращения в кэш (попадание или промах) и, наконец, от того, является ли строка совместно используемой или нет. На рис. 11.14 приведена диаграмма основных переходов без учета режима однократной записи.
Предположим, что один из процессоров делает запрос на чтение из строки, которой в текущий момент нет в его локальной кэш-памяти (промах при чтении). Запрос будет широковещательно передан по шине. Если ни в одном из кэшей не нашлось копии нужной строки, то ответной реакции от контроллеров наблюдения других процессоров не последует, строка будет считана в кэш запросившего процессора из основной памяти, а копии будет присвоен статус Е. Если в каком-либо из локальных кэшей имеется искомая копия, от соответствующего контроллера слежения поступит отклик, означающий доступ к совместно используемой строке. Все копии рассматриваемой строки во всех кэшах будут переведены в состояние S, вне зависимости от того, в каком состоянии они были до этого (М, Е или S).
Когда процессор делает запрос на запись в строку, отсутствующую в его локальной кэш-памяти (промах при записи), перед загрузкой в кэш-память строка должна быть считана из основной памяти (ОП) и модифицирована. Прежде чем процессор сможет загрузить строку, он должен убедиться, что в основной памяти действительно находится достоверная версия данных, то есть что в других кэшах отсутствует модифицированная копия данной строки. Формируемая в этом случае последовательность операций носит название чтения с намерением модификации (RWITM, Read With Intent To Modify). Если в одном из кэшей обнаружилась копия нужной строки, причем в состоянии М, то процессор, обладающий этой копией, прерывает RWITM-последовательность и переписывает строку в ОП, после чего меняет состояние строки в своем кэше на I. Затем RWITM-последователь- ность возобновляется и делается повторное обращение косновной памятидля считывания обновленной строки. Окончательным состоянием строки будет М, при котором ни в ОП, ни в других кэшах нет еще одной достоверной ее копни. Если копия строки существовала в другом кэше и не имела состояния М, то такая копия аннулируется и доступ к основной памяти производится немедленно.
Кэш-попадание при чтении не изменяет статуса читаемой строки. Если процессор выполняет доступ для записи в существующую строку, находящуюся в состоянии S, он передает на шину широковещательный запрос, с тем чтобы информировать другие кэши, обновляет строку в своем кэше и присваивает ей статус М. Все остальные копии строки переводятся в состояние I. Если процессор производит доступ по записи в строку, находящуюся в состоянии Е, единственное, что он должен сделать, — это произвести запись в строку и изменить ее состояние на М, поскольку другие копии строки в системе отсутствуют.
На рис. 11.15 показана типичная последовательность событий в системе из двух процессоров, запрашивающихдоступ к ячейке х. Обращение к любой ячейке строки кэш-памяти рассматривается как доступ ко всей строке.
Проиллюстрируем этапы, когда процессор 2 пытается прочитать содержимое ячейки х" (рис. 11.16). Сперва наблюдается кэш-промах по чтению и процессор пытается обратиться к основной памяти. Процессор 1 следитза шиной, обнаруживает обращение к ячейке, копия которой есть в его кэш-памяти и находится в
5 1 8 Глава 11. Организация памяти вычислительных систем
состоянии М, поэтому он блокирует операцию чтения от процессора 2. Затем процессор 1 переписывает строку, содержащую х", в ОП и освобождает процессор 2, чтобы тот мог повторить доступ к основной памяти. Теперь процес-
Мультипроцессорная когерентность кэш-памяти 5 t 9
сор 2 получает строку, содержащую х", и загружает ее в свою кэш-память. Обе копии помечаются как S.
До сих пор рассматривалась версия протокола MESI без однократной записи. С учетом однократной записи диаграмма состояний, изображенная на рис. 11.14, немного видоизменяется. Все кэш-промахи при чтении вызывают переход в состояние S. Первое попадание при записи сопровождается переходом в состояние Е (так называемый переход однократной записи). Следующее попадание при записи влечет за собой изменение статуса строки на М.
Протоколы на основе справочника
Протоколыобеспечениякогерентностинаосновесправочникахарактерныдлясложных мультипроцессорных систем с совместно используемой памятью, где процессоры объединены многоступенчатой иерархической сетью межсоединений. Сложность топологии приводит к тому, что применение протоколов наблюдения с их механизмом широковещания становится дорогостоящим и неэффективным.
Протоколы на основе справочника предполагают сбор и отслеживание информации о содержимом всех локальных кэшей. Такие протоколы обычно реализуются с помощью централизованного контроллера, физически представляющего собой часть контроллера основной памяти. Собственно справочник хранится в основной памяти. Когда контроллер локальной кэш-памяти делает запрос, контроллер справочника обнаруживает такой запрос и формирует команды, необходимые для пересылки данных из основной памяти либо из другой локальной кэш-памяти, содержащей последнюю версию запрошенных данных. Центральный контроллер отвечает за обновление информации о состоянии локальных кэшей, поэтому он должен быть извещен о любом локальном действии, способном повлиять на состояние блока данных.
Справочник содержит множество записей, описывающих каждую кэшируемую ячейку ОП, которая может быть совместно использована процессорами системы. Обращение к справочнику производится всякий раз, когда один из процессоров изменяет копию такой ячейки в своей локальной памяти. В этом случае информация из справочника нужна для того, чтобы аннулировать или обновить копии измененной ячейки (или всей строки, содержащей эту ячейку) в прочих локальных кэшах, где такие копии имеются.
Дли каждой строки общего пользования, копия которой может быть помещена в кэш-память, в справочнике выделяется одна запись, хранящая указатели на копии данной строки. Кроме того, в каждой записи выделен один бит модификации (D), показывающий, является ли копия «грязной»- (D = 1 — dirty) или «чистой»- (D=0 — clean), тоесть изменялосьлисодержимоестроки вкэш-памятипослетого, как она была туда загружена. Этот бит указывает, имеет ли право процессор производить запись в данную строку.
В настоящее время известны три способа реализации протоколов обеспечения когерентности кэш-памяти на основе справочника: полный справочник, ограниченные справочники и сцепленные справочники.
Впротоколеполногосправочникаединыйцентрализованныйсправочникподдерживает информацию обо всех кэшах. Справочник хранится в основной памяти.
5 2 0 Главе 11.Организацияпамяти вычислительныхсистем
Рис. 11.17. Протокол обеспечения когерентности кэш-памяти с полным справочником
В системе из N процессоров каждая запись справочника будет содержать Nоднобитовых указателей. Если в соответствующей локальной кэш-памяти присутствует копия данных, бит-указатель устанавливается в 1, иначе — в 0. Схемас полным справочником показана на рис. 11.17. Здесь предполагается, что копия строки имеется в каждом кэше. Каждой строке придаются два индикатора состояния: бит достоверности (V, Valid) и бит владения (Р, Private). Если информация в строке корректна, ее V-бит устанавливается в 1. Единичное значение Р-бита указывает, что данному процессору предоставлено право на запись в соответствующую строку своей локальной кэш-памяти.
Предположим, что процессор 2 производит запись в ячейку х. В исходный момент процессор не получил еще разрешения на такую запись. Он формирует за- В ответ на запрос во все кэши, где есть копии строки, содержащей ячейку х, выдаетсясигналаннулированияимеющихсякопий. Каждый кэш, получившийэтотсигнал, сбрасывает бит достоверности аннулируемой строки (V-бит) в 0 и возвращает контроллеру справочника сигнал подтверждения. После приема всех сигналов подтверждения контроллер справочника устанавливает в единицу бит модификации (D-бит) соответствующей записи справочника и посылает процессору 2 сигнал, разрешающий запись в ячейку х. С этого момента процессор 2 может продолжить запись в собственную копию ячейки х, а также в основную память, если в кэше реализована схема сквозной записи.
Основные проблемы протокола полного справочника связаны с большим количеством записей. Для каждой ячейки в справочнике системы из N процессоров требуется N+ 1 бит, то есть с увеличением числа процессоров коэффициент сложности возрастает линейно. Протокол полного справочника допускает наличие в каждом локальном кэше копий всех совместно используемых ячеек. На практике такая возможность далеко не всегда остается востребованной — в каждый конкретный момент обычно актуальны лишь одна или несколько копий. В протоколе с ограниченными справочниками копии отдельной строки вправе находиться только
