Сайт о телевидении

Сайт о телевидении

» » Вычислительные системы с общей памятью. Принципы управления памятью вычислительной системы. Виртуальная память и преобразование адресов

Вычислительные системы с общей памятью. Принципы управления памятью вычислительной системы. Виртуальная память и преобразование адресов

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

1. Вычислительные системы с общей памятью (shared memory) – Мультипроцессоры:

i. PVP (CrayT90)

ii. SMP(Intel SHV, SunFire, Dec8400 и т.д.)

i. COMA (KSR-1, DDM)

ii. CC-NUMA (Stanford Dash, Data General и т.д.)

iii. NCC-NUMA (Crag T3E)

2. Вычислительные системы с распределенной памятью (distributed memory) – Мультикомпьютеры:

ii. MPP – слабосвязанные системы (Intel TFLOPS)

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

Физически почти вся память разделена на автономные компоненты, доступ к которым может производиться независимо.

Рассмотрим модели архитектур памяти ВС, которые будут верны как для класса множественный поток данных MIMD, так и для SIMD:

UMA - ВС с общей памятью, где доступ любого процессора к памяти производится единообразно и занимает одинаковое время. Системы с однородным доступом к памяти:

Mp – общая память

Pi – процессор

Общая шина

Особенности: в каждый момент времени обмен по шине, может вести только один из процессоров. Производительность падает с увеличением количества процессоров. Чаще всего от 4 до 8 процессоров в системе, максимальная производительность = 2. Систему нельзя отнести к отказоустойчивым, так как отказ одного модуля памяти или процессора может привести к отказу всей системы.

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

NUMA – неоднородный доступ к памяти. Здесь различают несколько классов. Используется единое адресное пространство, но каждый процессор имеет локальную память (как правило, кэш). Доступ к ЛП осуществляется гораздо быстрее, чем доступ к удаленной памяти через сеть или коммутатор.


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



Главный недостаток: очень сложное управление, ОС не участвует в процессе управления (все задачи возлагаются на аппаратуру).

CC-NUMA – модель кэш-когерентного доступа к неоднородной памяти. Используется не кэш, а обычная физически распределенная память. Не требуется какого-либо программного обеспечения для сохранения множества обновленных данных. С этим справляется аппаратный уровень.

NCC-NUMA – модель предполагает использование единого адресного пространства, но не обеспечивает согласованности глобальных данных на аппаратном уровне. Управление возлагается на ПО, это считается недостатком, но модель наиболее перспективная с точки зрения повышения производительности.

Мультикомпьютеры – блоки, из которых строится система, представляют собой с процессором и памятью.

NORMA – архитектура без прямого доступа к удаленной памяти.


P – процессор

M – локальная память

K0 и K1 – контроллер ввода/вывода

Блоки – процессорные элементы. Из них собирают системы.

Каждый процессор в такой системе может обратиться к удаленной памяти только путем обмена сообщениями с процессорами, которым принадлежит адресуемая память. Все ПЭ по отношению друг к другу рассматриваются как устройства ввода-вывода.

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



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

Недостатки: У каждого процессорного элемента есть система прерываний. От этого сложность обмена информацией (время на пересылку и формирование сообщения, время на формирование запросов прерываний и их обработку).

Глава 11

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

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

В зависимости от того, каким образом организована память многопроцессорных (многомашинных) систем, различают вычислительные системы с общей памятью (shared memory) и ВС с распределенной памятью (distributed memory). В системах с общей памятью (ее часто называют также совместно используемой или разделяемой памятью) намять ВС рассматривается как общин ресурс, и каждый из процессоров имеет полный доступ ко всему адресному пространству. Системы с обшей памятью называют сильно связанными (closely coupled systems). Подобное построение вычислительных систем имеет место как в классе SIMD, так и в классе MIMD. Иногда, чтобы подчеркнуть это обстоятельство, вводят специальные подклассы, используя для их обозначения аббревиатуры SM-SIMD (Shared Memory SIMD) и SM-MIMD (Shared Memory MIMD).

В варианте с распределенной памятью каждому из процессоров придается собственная память. Процессоры объединяются в сеть и могут при необходимости обмениваться данными, хранящимися в их памяти, передавая друг другу так называемые сообщения. Такой вид ВС называют слабо связанными (loosely coupled systems). Слабо связанные системы также встречаются как в классе SIMD, так и В классе MIMD, и иной раз, чтобы подчеркнуть данную особенность, вводят подклассы DM-SIMD (Distributed Memory SIMD) и DM-MIMD (Distributed Memory MIMD).

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

Различие между общей и распределенной памятью - это разницу в структуре виртуальной памяти, то есть в том, как память выглядит со стороны процессора. Физически почти каждая система памяти разделена на автономные компоненты доступ к которым может производиться независимо. Общую память от распределенной отлипает то, каким образом подсистема памяти интерпретирует поступивший от процессора адрес ячейки. Для примера положим, что процессор выполняет команду load RO, i, означающую «Загрузить регистр R0 содержимым ячейки i». В случае общей памяти i - это глобальный адрес, и для любого процессора указывает на одну и ту же ячейку. В распределенной системе памяти i - это локальный адрес Если два процессора выполняют команду load RO, i, то каждый из них обращается к i-й ячейке в своем локальной памяти, то есть к разным ячейкам, и в регистры R0 могут быть загружены неодинаковые значения.

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

Память с чередованием адресов

Физически память вычислительной системы состоит из нескольких модулей (банков), при этом существенным вопросом является то, как в этом случае распределено адресное пространство (набор всех адресов, которые может сформировать процессор). Один из способов распределения виртуальных адресов по модулям памяти состоит в разбиении адресного пространства на последовательные блоки. Если память состоит из п банков, то ячейка с адресом i при поблочном разбиении будет находиться в банке с номером i/ n. В системе памяти с чередованием адресов (interleaved memory) последовательные адреса располагаются в различных банках: ячейка с адресом i находится в банке с номером i mod п. Пусть, например, память состоит из четырех банков, по 256 байт в каждом. В схеме, ориентированной на блочную адресацию, первому банку будут выделены виртуальные адреса 0-255, второму - 256-511 и т. д. В схеме с чередованием адресов последовательные ячейки в первом банке будут иметь виртуальные адреса 0, 4, 8, .... во втором банке - 1, 5, 9 и т. д. (рис. 11.1, а).

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

https://pandia.ru/text/78/264/images/image002_61.jpg" width="62" height="15"> Интервал между элементами называют шагом по индексу или «страйдом» (stride). Одним из интересных применений этого свойства может служить Доступ к матрицам. Если шаг по индексу на единицу больше числа строк в матрице, одиночный запрос на доступ к памяти возвратит все диагональные элементы матрицы (рис. 11.1,б). Ответственность за то, чтобы все извлекаемые элементы матрицы располагались в разных банках, ложится на программиста.

Модели архитектуры памяти вычислительных систем

В рамках как совместно используемой, так и распределенной памяти реализуется несколько моделей архитектур системы памяти.

DIV_ADBLOCK84">

Рис. 11.3. Общая память: а - объединение процессоров с помощью шины; б - система с локальными кэшами; в - производительность системы как функция от числа процессоров на шине; г - многопроцессорная ВС с общей памятью, состоящей из отдельных модулей

Альтернативный способ построения многопроцессорной ВС с общей памятью на основе НМЛ показан на рис. 11.3, г. Здесь шипа заменена коммутатором, маршрутизирующим запросы процессора к одному из нескольких модулей памяти. Несмотря на то что имеется несколько модулей памяти, все они входят в единое виртуальное адресное пространство. Преимущество такого подхода в том, что коммутатор и состоянии параллельно обслуживать несколько запросов. Каждый процессор может быть соединен со своим модулем памяти и иметь доступ к нему на максимально допустимой скорости. Соперничество между процессорами может возникнуть при попытке одновременного доступа к одному и тому же модулю памяти. В этом случае доступ получает только один процессор, а прочие - блокируются.

К сожалению, архитектура UMA не очень хорошо масштабируется. Наиболее распространенные системы содержат 4-8 процессоров, значительно реже 32-64 процессора. Кроме того, подобные системы нельзя отнести к отказоустойчивым, так как отказ одного процессора или модуля памяти влечет отказ всей ВС.

Другим подходом к построению ВС с общей памятью является неоднородный доступ к памяти, обозначаемый как NUM A (Non-Uniform Memory Access), Здесь по-прежнему фигурирует единое адресное пространство, но каждый процессор имеет локальную память. Доступ процессора к собственной локальной памяти производится напрямую, что намного быстрее, чем доступ к удаленной памяти через коммутатор или сеть. Такая система может быть дополнена глобальной памятью тогда локальные запоминающие устройства играют роль быстрой кэш-памяти для глобальной памяти. Подобная схема может улучшить производительность ВС, по не в состоянии неограниченно отсрочить выравнивание прямой производительности. При наличии у каждого процессора локальной кэш-памяти (рис. 11.3,6) существует высокая вероятность (р > 0,9) того, что нужные команда или данные уже находятся в локальной памяти. Разумная вероятность попадания в локальную память существенно уменьшает число обращений процессора к глобальной памяти и, таким образом, ведет к повышению эффективности. Место излома кривой производительности (верхняя кривая на рис. 11.3, в), соответствующее точке, в которой добавление процессоров еще остается эффективным, теперь перемещается в область 20 процессоров, а тонка, где кривая становится горизонтальной, - в область 30 процессоров.

В рамках концепции NUMA реализуется несколько различных подходов, обозначаемых аббревиатурами СОМА, CC- NUMA и NCC- NUMA.

В архитектуре только с кэш-памятью (СОМА, Cache Only Memory Architecture) локальная память каждого процессора построена как большая кэш-память для быстрого доступа со стороны «своего» процессора . Кэши всех процессоров в совокупности рассматриваются как глобальная память системы. Собственно глобальная память отсутствует. Принципиальная особенность концепции СОМА выражается в динамике. Здесь данные не привязаны статически к определенному модулю памяти и не имеют уникального адреса, остающегося неизменным в течение всего времени существования переменной. В архитектуре СОМА данные переносятся в кэш-память того процессора, который последним их запросил, при этом переменная не фиксирована уникальным адресом и в каждый момент времени может размещаться в любой физической ячейке. Перенос данных из одного локального кэша в другой не требует участия в этом процессе операционной системы, но подразумевает сложную и дорогостоящую аппаратуру управления памятью. Для организации такого режима используют так называемые каталоги кэшей. Отметим также, что последняя копия элемента данных никогда из кэш-памяти не удаляется.

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

Модель кэш-когерентного доступа к неоднородной памяти (CC-NUMA, Сасhe Coherent Non-Uniform Memory Architecture) принципиально отличается от модели СОМА. В системе CC-NUMA используется не кэш-память, а обычная физически распределенная память. Не происходит никакого копирования страниц или данных между ячейками памяти. Нет никакой программно реализованной передачи сообщений. Существует просто одна карта памяти, с частями, физически связанными медным кабелем, и «умные» аппаратные средства. Аппаратно реализованная кэш-когерентность означает, что не требуется какого-либо программного обеспечения для сохранения множества копий обновленных данных или их передачи. Со всем этим справляется аппаратный уровень. Доступ к локальным модулям памяти в разных узлах системы может производиться одновременно и происходит быстрее, чем к удаленным модулям памяти.

Отличие модели с кэш-некогерентным доступом к неоднородной памяти (NCC-NUMA, Non-Cache Coherent Non-Uniform Memory Architecture) от CC-NUMA очевидно из названия. Архитектура памяти предполагает единое адресное пространство, но не обеспечивает согласованности глобальных данных на аппаратном уровне. Управление использованием таких данных полностью возлагается на программное обеспечение (приложения или компиляторы). Несмотря на это обстоятельство, представляющееся недостатком архитектуры, она оказывается весьма полезной при повышении производительности вычислительных систем с архитектурой памяти типа DSM, рассматриваемой в разделе «Модели архитектур распределенной памяти».

В целом, ВС с общей памятью, построенные по схеме NUMA, называют архитектурами с виртуальной общей памятью (virtual shared memory architectures). Данный вид архитектуры, в частности CC-NUMA, в последнее время рассматривается как самостоятельный и довольно перспективный вид вычислительных систем класса MIMD, поэтому такие ВС ниже будут обсуждены более подробно.

Модели архитектур распределенной памяти

В системе с распределенной памятью каждый процессор обладает собственной памятью и способен адресоваться только к ней. Некоторые авторы называют этот тип систем многомашинными ВС или мультикомпъютерами, подчеркивая тот факт, что блоки, из которых строится система, сами по себе являются небольшими вычислительными системами с процессором и памятью. Модели архитектур с распределенной памятью принято обозначать как архитектуры без прямого доступа к удаленной памяти (NORMA, No Remote Memory Access). Такое название следует из того факта, что каждый процессор имеет доступ только к своей локальной памяти. Доступ к удаленной памяти (локальной памяти другого процессора) возможен только путем обмена сообщениями с процессором, которому принадлежит адресуемая память.

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

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

· требуется время для того, чтобы сформировать и переслать сообщение от одно! процессора к другому;

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

Структура системы с распределенной памятью приведена на рис. 11.4. В левой! части (рис. 11.4, а) показан один процессорный элемент (ПЭ). Он включает в себя) собственно процессор (Р), локальную память (М) и два контроллера ввода/вывод (Ко и КД В правой части (рис. 11.4, б) показана четырехпроцессорная система, иллюстрирующая, каким образом сообщения пересылаются от одного процессор к другому. По отношению к каждому ПЭ все остальные процессорные элементы можно рассматривать просто как устройства ввода/вывода. Для посылки сообщения в другой ПЭ процессор формирует блок данных в своей локальной памяти и извещает свой локальный контроллер о необходимости передачи информации на внешнее устройство. По сети межсоединений это сообщение пересылается на приемный контроллер ввода/вывода принимающего ПЭ. Последний находит место для сообщения в собственной локальной памяти и уведомляет процессор-источник о получении сообщения.

DIV_ADBLOCK89">

Интересный вариант системы с распределенной памятью представляет собой; модель распределенной совместно используемой памяти (DSM, Distribute Shared Memory), известной также и под другим названием архитектуры с неоднородным доступом к памяти и программным обеспечением когерентности (SC-NUMA, Software-Coherent Non-Uniform Memory Architecture). Идея этой модели состоит в том, что ВС, физически будучи системой с распределенной памятью, благодаря операционной системе представляется пользователю как система с общей памятью. Это означает, что операционная система предлагает пользователю единое адресное пространство, несмотря на то что фактическое обращение к памяти «чужого» компьютера ВС по-прежнему обеспечивается путем обмена сообщениями.

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

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

В простейшей форме проблему когерентности кэш-памяти можно пояснить следующим образом (рис 11.5). Пусть два процессора Рг и Рг связаны с общей памятью посредством шины. Сначала оба процессора читают переменную х. Копии блоков, содержащих эту переменную, пересылаются из основной памяти в локальные кэши обоих процессоров (рис. 11.5, а). Далее процессор Pt выполняет операцию увеличения значения переменной х на единицу. Так как копия переменной уже находится в кэш-памяти данного процессора, произойдет кэш-попадание и значение сбудет изменено только в кэш-памяти 1. Если теперь процессор Р2 вновь выполнит операцию чтения х, то также произойдет кэш-попадание и Р2 получит хранящееся в его кэш-памяти «старое» значение х (рис. 11.5, б).

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

В решении проблемы когерентности выделяются два подхода: программный и аппаратный. В некоторых системах применяют стратегии, совмещающие оба подхода.

Программные способы решения проблемы когерентности

Программные приемы решения проблемы когерентности позволяют обойтись без дополнительного оборудования или свести его к минимуму .

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

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

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

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

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

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

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







Попадание при чтении

Рис. 11.10. Протокол Berkeley

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

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

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

Рис. 11.11. Протокол Illinois

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

При кэш-промахе чтения процессор посылает запрос владельцу блока, с тем чтобы получить наиболее свежую версию последнего, и переводит свою новую копию в состояние «эксклюзивная» (Е, Exclusive) при условии, что он является единственным владельцем строки. В противном случае статус меняется на «разделяемая» (S, Shared).

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

Протокол Firefly. Протокол был предложен Такером и др. и реализован в мультипроцессорной системе Firefly Multiprocessor Workstation, разработанной в исследовательском центре Digital Equipment Corporation.

В протоколе Firefly используется запись с обновлением. Возможные состояния строки кэша совпадают с состояниями протокола Illinois (рис. 11.12). Отличие состоит в том, что стратегия обратной записи применяется только к тем строкам, которые находятся в состоянии PD или Е, в то время как применительно к строкам в состоянии S действует сквозная запись. Наблюдающие кэши при обновлении своих копий используют процедуру сквозной записи. Кроме того, наблюдающие кэши, обнаружившие у себя копию строки, возбуждают специальную «разделяемую» линию шины с тем, чтобы записывающий контроллер мог принять решение о том, в какое состояние переводить строку, в которую была произведена запись. «Разделяемая» линия при кэш-промахе чтения служит для информирования контроллера локальной кэш-памяти о месте, откуда поступила копия строки: из основной памяти или другого кэша. Таким образом, состояние S применяется только к тем данным, которые действительно используются совместно .

https://pandia.ru/text/78/264/images/image018_2.jpg" width="491 height=316" height="316">

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

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

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

Разделяемая (S, Shared) - строка в кэше совпадает с аналогичной строкой в основной памяти (данные достоверны) и может присутствовать в одном или нескольких из прочих кэшей.

Недействительная (I, Invalid) - кэш-строка, помеченная как недействительная, не содержит достоверных данных и становится логически недоступной.

Рис. 11.15. Последовательность смены состояний в протоколе MESI: а - процессор 1 читает х;

б - процессор 2 читает х; в - процессор 1 производит первую запись в х;

г - процессор 1 производит очередную запись в х

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

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

Когда процессор делает запрос на запись в строку, отсутствующую в его локальной кэш-памяти (промах при записи), перед загрузкой в кэш-память строка должна быть считана из основной памяти (ОП) и модифицирована. Прежде чем процессор сможет загрузить строку, он должен убедиться, что в основной памяти действительно находится достоверная версия данных, то есть что в других кэшах отсутствует модифицированная копия данной строки. Формируемая в этом случае последовательность операций носит название чтения с намерением модифика ции (RWITM, Read With Intent To Modify). Если в одном из кэшей обнаружилась копия нужной строки, причем в состоянии М, то процессор, обладающий этой копией, прерывает RWITM-последовательность и переписывает строку в ОП, после чего меняет состояние строки в своем кэше на I. Затем RWITM-последовательность возобновляется и делается повторное обращение к основной памяти для считывания обновленной строки. Окончательным состоянием строки будет М, при котором ни в ОП, ни в других кэшах нет еще одной достоверной ее копии. Если копия строки существовала в другом кэше и не имела состояния М, то такая копия аннулируется и доступ к основной памяти производится немедленно.

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

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

Проиллюстрируем этапы, когда процессор 2 пытается прочитать содержимое ячейки х" (рис. 11.16). Сперва наблюдается кэш-промах по чтению и процессор пытается обратиться к основной памяти. Процессор 1 следит за шиной, обнаруживает обращение к ячейке, копия которой есть в его кэш-памяти и находится в




Рис. 11.16. Переход из состояния Е в состояние S в протоколе MESI: а- процессор 2

читает х; б - процессор 1 производит обратную запись х" в основную память;

я - процессор 2 читает х" из основной памяти

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

До сих пор рассматривалась версия протокола MESI без однократной записи. С учетом однократной записи диаграмма состояний, изображенная на рис. 11.14, немного видоизменяется. Все кэш-промахи при чтении вызывают переход в состояние S. Первое попадание при записи сопровождается переходом в состояние Е (так называемый переход однократной записи). Следующее попадание при записи влечет за собой изменение статуса строки на М.

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

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

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

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

Для каждой строки общего пользования, копия которой может быть помещена в кэш-память, в справочнике выделяется одна запись, хранящая указатели на копии данной строки. Кроме того, в каждой записи выделен один бит модификации (D), показывающий, является ли копия «грязной» (D = 1 - dirty) или «чистой» (D = 0 - clean), то есть изменялось ли содержимое строки в кэш-памяти после того, как она была туда загружена. Этот бит указывает, имеет ли право процессор производить запись в данную строку.

В настоящее время известны три способа реализации протоколов обеспечения когерентности кэш-памяти на основе справочника: полный справочник, ограниченные справочники и сцепленные справочники.

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


Рис. 11.17. Протокол обеспечения когерентности кэш-памяти с полным справочником

В системе из N процессоров каждая запись справочника будет содержать N однобитовых указателей. Если в соответствующей локальной кэш-памяти присутствует копия данных, бит-указатель устанавливается в 1, иначе - в 0. Схема с полным справочником показана на рис. 11.17. Здесь предполагается, что копия строки имеется в каждом кэше. Каждой строке придаются два индикатора состояния: бит достоверности (V, Valid) и бит владения (Р, Private). Если информация в строке корректна, ее V-бит устанавливается в 1. Единичное значение Р-бита указывает, что данному процессору предоставлено право на запись в соответствующую строку своей локальной кэш-памяти.

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

Основные проблемы протокола полного справочника связаны с большим количеством записей. Для каждой ячейки в справочнике системы из N процессоров требуется N+ 1 бит, то есть с увеличением числа процессоров коэффициент сложности возрастает линейно. Протокол полного справочника допускает наличие в каждом локальном кэше копий всех совместно используемых ячеек. На практике такая возможность далеко не всегда остается востребованной - в каждый конкретный момент обычно актуальны лишь одна или несколько копий. В протоколе с ограниченными справочниками копии отдельной строки вправе находиться только в ограниченном числе кэшей - одновременно может быть не более чем п копий строки, при этом число указателей в записях справочника уменьшается до п (п < N ). Чтобы однозначно идентифицировать кэш-память, хранящую копию, указатель вместо одного бита должен состоять из log2 N бит, а общая длина указателей в каждой записи справочника вместо N бит будет равна п log2 N бит. При постоянном значении п темпы роста коэффициента сложности ограниченного справочника по мере увеличения размера системы ниже, чем в случае линейной зависимости.

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

Метод сцепленных справочников также имеет целью сжать объем справочника. В нем для хранения записей привлекается связный список, который может быть реализован как одно связный (однонаправленный) и двусвязный (двунаправленный).

Рис. 11.18. Протокол обеспечения когерентности кэш-памяти со сцепленным справочником

В односвязном списке (рис. 11.18) каждая запись справочника содержит указатель на копию строки в одном из локальных кэшей. Копии одноименных строк в разных кэшах системы образуют однонаправленную цепочку. Для этого в их тегах предусмотрено специальное поле, куда заносится указатель на кэш-память, содержащую следующую копию цепочки. В тег последней копии цепочки помещается специальный символ-ограничитель. Сцепленный справочник допускает цепочки длиной в N, то есть поддерживает N копий ячейки. При создании еще одной копии цепочку нужно разрушить, а вместо нее сформировать новую. Пусть, например, в процессоре 5 нет копии ячейки х и он обращается за ней к основной памяти. Указатель в справочнике изменяется так, чтобы указывать на кэш с номером 5, а указатель в кэше 5 - таким образом, чтобы указывать на кэш 2. Для этого контроллер основной памяти наряду с затребованными данными должен передать в кэш-память 5 также и указатель на кэш-память с номером 2. Лишь после того, как будет сформирована вся структура цепочки, процессор 5 получит разрешение на доступ к ячейке х. Если процессор производит запись в ячейку, то вниз по тракту, определяемому соответствующей цепочкой указателей, посылается сигнал аннулирования. Цепочка должна обновляться и при удалении копии из какой-либо кэш-памяти.

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

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

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

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

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

Протокол Archibald. Схема справочника Archibald - это пара замысловатых схем для иерархически организованных сетей процессоров. С детальным описанием этого протокола можно ознакомиться в .

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

Контрольные вопросы

1. Проанализируйте влияние особенностей ВС с общей памятью и ВС с распределенной памятью на разработку программного обеспечения. Почему эти ВС называют соответственно сильно связанными и слабо связанными?

2. Поясните идею с чередованием адресов памяти. Из каких соображений выбирается механизм распределения адресов? Как он связан с классом архитектуры ВС?

3. Дайте сравнительную характеристику однородного и неоднородного доступов
к памяти.

4. В чем заключаются преимущества архитектуры СОМА?

5. Проведите сравнительный анализ моделей с кэш-когерентным и кэш-некогерентным доступом к неоднородной памяти.

6. Сформулируйте достоинства и недостатки архитектуры без прямого доступа к удаленной памяти.

7. Объясните смысл распределенной и совместно используемой памяти.

8. Разработайте свой пример, иллюстрирующий проблему когерентности кэш-памяти.

9. Охарактеризуйте особенности программных способов решения проблемы когерентности, выделите их преимущества и слабые стороны.

10. Сравните методики записи в память с аннулированием и записи в память с трансляцией, акцентируя их достоинства и недостатки.

11. Дайте сравнительную характеристику методов для поддержания когерентности в мультипроцессорных системах.

12. Выполните сравнительный анализ известных вам протоколов наблюдения.

13. Какой из протоколов наблюдения наиболее популярен? Обоснуйте причины повышенного к нему интереса.

14. Дайте развернутую характеристику протоколов когерентности на основе справочника и способов их реализации. В чем суть отличий этих протоколов от протоколов наблюдения?

Глава 11

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

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

В зависимости от того, каким образом организована память многопроцессорных (многомашинных) систем, различают вычислительные системы с общей памятью (shared memory) и ВС с распределенной памятью (distributed memory). В системах с общей памятью (ее часто называют также совместно используемой или разделяемой памятью) намять ВС рассматривается как общин ресурс, и каждый из процессоров имеет полный доступ ко всему адресному пространству. Системы с обшей памятью называют сильно связанными (closely coupled systems). Подобное построение вычислительных систем имеет место как в классе SIMD, так и в классе MIMD. Иногда, чтобы подчеркнуть это обстоятельство, вводят специальные подклассы, используя для их обозначения аббревиатуры SM-SIMD (Shared Memory SIMD) и SM-MIMD (Shared Memory MIMD).

В варианте с распределенной памятью каждому из процессоров придается собственная память. Процессоры объединяются в сеть и могут при необходимости обмениваться данными, хранящимися в их памяти, передавая друг другу так называемые сообщения. Такой вид ВС называют слабо связанными (loosely coupled systems). Слабо связанные системы также встречаются как в классе SIMD, так и В классе MIMD, и иной раз, чтобы подчеркнуть данную особенность, вводят подклассы DM-SIMD (Distributed Memory SIMD) и DM-MIMD (Distributed Memory MIMD).

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

Различие между общей и распределенной памятью - это разницу в структуре виртуальной памяти, то есть в том, как память выглядит со стороны процессора. Физически почти каждая система памяти разделена на автономные компоненты доступ к которым может производиться независимо. Общую память от распределенной отлипает то, каким образом подсистема памяти интерпретирует поступивший от процессора адрес ячейки. Для примера положим, что процессор выполняет команду load RO, i, означающую «Загрузить регистр R0 содержимым ячейки i». В случае общей памяти i - это глобальный адрес, и для любого процессора указывает на одну и ту же ячейку. В распределенной системе памяти i - это локальный адрес Если два процессора выполняют команду load RO, i, то каждый из них обращается к i-й ячейке в своем локальной памяти, то есть к разным ячейкам, и в регистры R0 могут быть загружены неодинаковые значения.

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

Память с чередованием адресов

Физически память вычислительной системы состоит из нескольких модулей (банков), при этом существенным вопросом является то, как в этом случае распределено адресное пространство (набор всех адресов, которые может сформировать процессор). Один из способов распределения виртуальных адресов по модулям памяти состоит в разбиении адресного пространства на последовательные блоки. Если память состоит из п банков, то ячейка с адресом i при поблочном разбиении будет находиться в банке с номером i / n . В системе памяти с чередованием адресов (interleaved memory) последовательные адреса располагаются в различных банках: ячейка с адресом i находится в банке с номером i mod п. Пусть, например, память состоит из четырех банков, по 256 байт в каждом. В схеме, ориентированной на блочную адресацию, первому банку будут выделены виртуальные адреса 0-255, второму - 256-511 и т. д. В схеме с чередованием адресов последовательные ячейки в первом банке будут иметь виртуальные адреса 0, 4, 8, .... во втором банке - 1, 5, 9 и т. д. (рис. 11.1, а).

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

Рис. 11.1- Память с чередованием адресов: а - распределение адресов; б- элементы, извлекаемые с шагом 9 из массива 8 х 8

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

Решение о том, какой вариант распределения адресов выбрать (поблочный или с расслоением), зависит от ожидаемого порядка доступа к информации. Программы компилируются так, что последовательные команды располагаются в ячейках с последовательными адресами, поэтому высока вероятность, что после команды, извлеченной из ячейки с адресом i, будет выполняться команда из ячейки i + 1. Элементы векторов компилятор также помещает в последовательные ячейки, поэтому в операциях с векторами можно использовать преимущества метода чередования. По этой причине в векторных процессорах обычно применяется какой-либо вариант чередования адресов. В мультипроцессорах с совместно используемой памятью тем не менее используется поблочная адресация, поскольку схемы обращения к памяти в MIMD-системах могут сильно различаться. В таких системах целью является соединить процессор с блоком памяти и задействовать максимум находящейся в нем информации, прежде чем переключиться на другой блок памяти.

Системы памяти зачастую обеспечивают дополнительную гибкость при извлечении элементов векторов. В некоторых системах возможна одновременная загрузка каждого n-го элемента вектора, например, при извлечении элементов вектора V , хранящегося в последовательных ячейках памяти; при п = 4, память возвратит Интервал между элементами называют шагом по индексу или «страйдом» (stride). Одним из интересных применений этого свойства может служить Доступ к матрицам. Если шаг по индексу на единицу больше числа строк в матрице, одиночный запрос на доступ к памяти возвратит все диагональные элементы матрицы (рис. 11.1,б). Ответственность за то, чтобы все извлекаемые элементы матрицы располагались в разных банках, ложится на программиста.

Модели архитектуры памяти вычислительных систем

В рамках как совместно используемой, так и распределенной памяти реализуется несколько моделей архитектур системы памяти.

Рис. 11.2. Классификация моделей архитектур памяти вычислительных систем

На рис. 11.2 приведена классификация таких моделей, применяемых в вычислительных системах класса MIMD (верна и для класса S1MD).

Модели архитектур совместно используемой памяти

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

Вычислительные системы с общей памятью, где доступ любого процессора к памяти производится единообразно и занимает одинаковое время, называют системами с однородным доступом к памяти и обозначают аббревиатурой UMA (Uniform Memory Access). Это наиболее распространенная архитектура памяти параллельных ВС с общей памятью .

Технически UМА-системы предполагаю наличие узла, соединяющего каждыйиз п процессоров с каждым из т модулей памяти. Простейший путь построения таких ВС - объединение нескольких процессоров (Р i) с единой памятью (M p) посредством общей шины - показан на рис. 11.3, а. В этом случае, однако, в каждый момент времени обмен по шине может вести только один из процессоров, то есть процессоры должны соперничать за доступ к шипе. Когда процессор Р i выбирает из памяти команду, остальные процессоры должны ожидать, пока шина освободится. Если в систему входят только два процессора, они в состоянии работать с производительностью, близкой к максимальной, поскольку их доступ к шинеможно чередовать: пока один процессор декодирует и выполняет команду, другой вправе использовать шину для выборки из памяти следующей команды. Однако когда добавляется третий процессор, производительность начинает падать. При наличии на шине десяти процессоров кривая быстродействия шины (рис. Н.З, а) становится горизонтальной, так что добавление 11-го процессора уже не дает повышения производительности. Нижняя кривая на этом рисунке иллюстрирует тот факт, что память и шина обладают фиксированной пропускной способностью, определяемой комбинацией длительности цикла памяти и протоколом шины, и в многопроцессорной системе с общей шиной эта пропускная способность распределена между несколькими процессорами. Если длительность цикла процессора больше по сравнению с циклом памяти, к шине можно подключать много процессоров. Однако фактически процессор обычно намного быстрее памяти, поэтому данная схема широкого применения не находит.

Рис. 11.3. Общая память: а - объединение процессоров с помощью шины; б - система с локальными кэшами; в - производительность системы как функция от числа процессоров на шине; г - многопроцессорная ВС с общей памятью, состоящей из отдельных модулей

Альтернативный способ построения многопроцессорной ВС с общей памятью на основе НМЛ показан на рис. 11.3, г. Здесь шипа заменена коммутатором, маршрутизирующим запросы процессора к одному из нескольких модулей памяти. Несмотря на то что имеется несколько модулей памяти, все они входят в единое виртуальное адресное пространство. Преимущество такого подхода в том, что коммутатор и состоянии параллельно обслуживать несколько запросов. Каждый процессор может быть соединен со своим модулем памяти и иметь доступ к нему на максимально допустимой скорости. Соперничество между процессорами может возникнуть при попытке одновременного доступа к одному и тому же модулю памяти. В этом случае доступ получает только один процессор, а прочие - блокируются.

К сожалению, архитектура UMA не очень хорошо масштабируется. Наиболее распространенные системы содержат 4-8 процессоров, значительно реже 32-64 процессора. Кроме того, подобные системы нельзя отнести к отказоустойчивым, так как отказ одного процессора или модуля памяти влечет отказ всей ВС.

Другим подходом к построению ВС с общей памятью является неоднородный доступ к памяти, обозначаемый как NUM A (Non-Uniform Memory Access), Здесь по-прежнему фигурирует единое адресное пространство, но каждый процессор имеет локальную память. Доступ процессора к собственной локальной памяти производится напрямую, что намного быстрее, чем доступ к удаленной памяти через коммутатор или сеть. Такая система может быть дополнена глобальной памятью тогда локальные запоминающие устройства играют роль быстрой кэш-памяти для глобальной памяти. Подобная схема может улучшить производительность ВС, по не в состоянии неограниченно отсрочить выравнивание прямой производительности. При наличии у каждого процессора локальной кэш-памяти (рис. 11.3,6) существует высокая вероятность (р > 0,9) того, что нужные команда или данные уже находятся в локальной памяти. Разумная вероятность попадания в локальную память существенно уменьшает число обращений процессора к глобальной памяти и, таким образом, ведет к повышению эффективности. Место излома кривой производительности (верхняя кривая на рис. 11.3, в), соответствующее точке, в которой добавление процессоров еще остается эффективным, теперь перемещается в область 20 процессоров, а тонка, где кривая становится горизонтальной, - в область 30 процессоров.

В рамках концепции NUMA реализуется несколько различных подходов, обозначаемых аббревиатурами СОМА, CC - NUMA и NCC - NUMA .

В архитектуре только с кэш-памятью (СОМА, Cache Only Memory Architecture) локальная память каждого процессора построена как большая кэш-память для быстрого доступа со стороны «своего» процессора . Кэши всех процессоров в совокупности рассматриваются как глобальная память системы. Собственно глобальная память отсутствует. Принципиальная особенность концепции СОМА выражается в динамике. Здесь данные не привязаны статически к определенному модулю памяти и не имеют уникального адреса, остающегося неизменным в течение всего времени существования переменной. В архитектуре СОМА данные переносятся в кэш-память того процессора, который последним их запросил, при этом переменная не фиксирована уникальным адресом и в каждый момент времени может размещаться в любой физической ячейке. Перенос данных из одного локального кэша в другой не требует участия в этом процессе операционной системы, но подразумевает сложную и дорогостоящую аппаратуру управления памятью. Для организации такого режима используют так называемые каталоги кэшей. Отметим также, что последняя копия элемента данных никогда из кэш-памяти не удаляется.

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

Модель кэш-когерентного доступа к неоднородной памяти (CC-NUMA, Сасhe Coherent Non-Uniform Memory Architecture) принципиально отличается от модели СОМА. В системе CC-NUMA используется не кэш-память, а обычная физически распределенная память. Не происходит никакого копирования страниц или данных между ячейками памяти. Нет никакой программно реализованной передачи сообщений. Существует просто одна карта памяти, с частями, физически связанными медным кабелем, и «умные» аппаратные средства. Аппаратно реализованная кэш-когерентность означает, что не требуется какого-либо программного обеспечения для сохранения множества копий обновленных данных или их передачи. Со всем этим справляется аппаратный уровень. Доступ к локальным модулям памяти в разных узлах системы может производиться одновременно и происходит быстрее, чем к удаленным модулям памяти.

Отличие модели с кэш-некогерентным доступом к неоднородной памяти (NCC-NUMA, Non-Cache Coherent Non-Uniform Memory Architecture) от CC-NUMA очевидно из названия. Архитектура памяти предполагает единое адресное пространство, но не обеспечивает согласованности глобальных данных на аппаратном уровне. Управление использованием таких данных полностью возлагается на программное обеспечение (приложения или компиляторы). Несмотря на это обстоятельство, представляющееся недостатком архитектуры, она оказывается весьма полезной при повышении производительности вычислительных систем с архитектурой памяти типа DSM, рассматриваемой в разделе «Модели архитектур распределенной памяти».

В целом, ВС с общей памятью, построенные по схеме NUMA, называют архитектурами с виртуальной общей памятью (virtual shared memory architectures). Данный вид архитектуры, в частности CC-NUMA, в последнее время рассматривается как самостоятельный и довольно перспективный вид вычислительных систем класса MIMD, поэтому такие ВС ниже будут обсуждены более подробно.

Модели архитектур распределенной памяти

В системе с распределенной памятью каждый процессор обладает собственной памятью и способен адресоваться только к ней. Некоторые авторы называют этот тип систем многомашинными ВС или мультикомпъютерами, подчеркивая тот факт, что блоки, из которых строится система, сами по себе являются небольшими вычислительными системами с процессором и памятью. Модели архитектур с распределенной памятью принято обозначать как архитектуры без прямого доступа к удаленной памяти (NORMA, No Remote Memory Access). Такое название следует из того факта, что каждый процессор имеет доступ только к своей локальной памяти. Доступ к удаленной памяти (локальной памяти другого процессора) возможен только путем обмена сообщениями с процессором, которому принадлежит адресуемая память.

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

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

    требуется время для того, чтобы сформировать и переслать сообщение от одно! процессора к другому;

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

Структура системы с распределенной памятью приведена на рис. 11.4. В левой! части (рис. 11.4, а) показан один процессорный элемент (ПЭ). Он включает в себя) собственно процессор (Р), локальную память (М) и два контроллера ввода/вывод (К о и КД В правой части (рис. 11.4, б) показана четырехпроцессорная система, иллюстрирующая, каким образом сообщения пересылаются от одного процессор к другому. По отношению к каждому ПЭ все остальные процессорные элементы можно рассматривать просто как устройства ввода/вывода. Для посылки сообщения в другой ПЭ процессор формирует блок данных в своей локальной памяти и извещает свой локальный контроллер о необходимости передачи информации на внешнее устройство. По сети межсоединений это сообщение пересылается на приемный контроллер ввода/вывода принимающего ПЭ. Последний находит место для сообщения в собственной локальной памяти и уведомляет процессор-источник о получении сообщения.

Рис. 11.4. Вычислительная система с распределенной памятью: а - процессорный элемент; б - объединение процессорных элементов о

Интересный вариант системы с распределенной памятью представляет собой; модель распределенной совместно используемой памяти (DSM, Distribute Shared Memory), известной также и под другим названием архитектуры с неоднородным доступом к памяти и программным обеспечением когерентности (SC-NUMA, Software-Coherent Non-Uniform Memory Architecture). Идея этой модели состоит в том, что ВС, физически будучи системой с распределенной памятью, благодаря операционной системе представляется пользователю как система с общей памятью. Это означает, что операционная система предлагает пользователю единое адресное пространство, несмотря на то что фактическое обращение к памяти «чужого» компьютера ВС по-прежнему обеспечивается путем обмена сообщениями.

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

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

В простейшей форме проблему когерентности кэш-памяти можно пояснить следующим образом (рис 11.5). Пусть два процессора Р г и Р г связаны с общей памятью посредством шины. Сначала оба процессора читают переменную х. Копии блоков, содержащих эту переменную, пересылаются из основной памяти в локальные кэши обоих процессоров (рис. 11.5, а). Далее процессор P t выполняет операцию увеличения значения переменной х на единицу. Так как копия переменной уже находится в кэш-памяти данного процессора, произойдет кэш-попадание и значение сбудет изменено только в кэш-памяти 1. Если теперь процессор Р 2 вновь выполнит операцию чтения х, то также произойдет кэш-попадание и Р 2 получит хранящееся в его кэш-памяти «старое» значение х (рис. 11.5, б).

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

В решении проблемы когерентности выделяются два подхода: программный и аппаратный. В некоторых системах применяют стратегии, совмещающие оба подхода.

Программные способы решения проблемы когерентности

Программные приемы решения проблемы когерентности позволяют обойтись без дополнительного оборудования или свести его к минимуму }