
- •10.1. Виды параллельной обработки
- •10.1.1. Классификация систем параллельной обработки
- •10.2. Матричная обработка данных
- •Массив процессорных элементов
- •10.3. Архитектура мультипроцессорных систем общего назначения
- •10.4. Коммуникационные сети
- •10.5. Организация памяти в мультипроцессорных системах
- •10.6. Программный параллелизм и общие переменные
- •10.6.1. Доступ к общим переменным
- •10.6.2. Согласованность кэша
- •10.6.3. Блокировка и согласованность кэш-памяти
- •10.7. Мультикомпьютерные системы
- •10.8. Общая память и передача сообщений
- •10.8.1. Система с общей памятью
- •10.8.2. Система с передачей сообщений
- •10.9. Производительность мультипроцессорных систем
- •10.9.1. Закон Амдала
- •10.9.2. Показатели производительности
10.6.2. Согласованность кэша
Использование общих данных в мультипроцессорной системе приводит к еще одной серьезной проблеме, связанной с наличием в нескольких кэшах копий одних и тех же данных. Когда процессор записывает общую переменную в ее собственный кэш, во всех остальных кэшах, содержащих ее копии, оказываются устаревшие и неверные данные. Эти кэши должны быть проинформированы об изменениях, чтобы они могли либо обновить свои копии, либо пометить их как недостоверные. Состояние, когда все кэшируемые копии общих данных имеют одинаковые значения, называется согласованностью (когерентностью) кэша.
Ранее рассматривались два основных подхода к выполнению операций записи в кэш. При сквозной записи данные одновременно изменяются и в кэше, и в основной памяти. При обратной записи данные изменяются только к кэше, а копия в основной памяти обновляется при замене блока данных в кэше. Аналогичные технологии могут использоваться и в мультипроцессорных системах.
Протокол сквозной записи
Протокол сквозной записи может быть реализован двумя способами. В соответствии с первым из них значения в других кэшах обновляются, а в соответствии со вторым — помечаются как недостоверные.
Для начала рассмотрим протокол сквозной записи с обновлением. Когда процессор записывает в кэш новое значение, такое же значение помещается и в модуль памяти, содержащий измененный блок кэша. Поскольку копии этого блока могут присутствовать и в других кэшах, они также обновляются. Простейшим способом выполнения таких изменений является широковещательная передача записанных данных всем процессорным модулям системы. Каждый процессорный модуль получает обновленные данные, и если в его первичном или вторичном кэше имеется соответствующий блок, обновляет таковой.
Во втором варианте протокола сквозной записи копии помечаются как недостоверные. Когда процессор записывает в свой кэш новое значение, такое же значение записывается в модуль памяти, а затем все остальные его копии в других кэшах помечаются как недостоверные. Сообщения о недостоверности данных рассылаются по системе путем широковещательной передачи.
Протокол обратной записи
В протоколе обратной записи несколько процессоров могут прочитать из памяти в свои кэши копии одного и того же блока данных. Если какой-либо из процессоров захочет изменить свой блок, сначала он должен стать его монопольным владельцем. Монопольный доступ к блоку предоставляется процессору тем модулем памяти, в котором этот блок расположен, и после этого все остальные копии такового, включая копию в основной памяти, помечаются как недостоверные. Теперь владелец блока может свободно изменять его содержимое. Когда другой процессор захочет прочитать этот блок, данные будут ему пересланы от текущего владельца. По окончании процесса изменения данные будут возвращены в исходный модуль памяти, который снова получит права владельца соответствующего блока.
Обратная запись вызывает меньший трафик, чем сквозная, поскольку прежде чем блок кэша потребуется другим процессорам, получивший его процессор может несколько раз записать в него данные.
До сих пор предполагалось, что запросы на обновление и недостоверные данные распространяются по сети путем широковещательной передачи. Но на практике это зависит от архитектуры конкретной сети. Для широковещательной передачи лучше всего подходит шинная архитектура, описанная в разделе 10.4. В маленьких мультипроцессорах с общей шиной для обеспечения согласованности кэша может использоваться технология, называемая отслеживанием.
Кэш с отслеживанием
В системе с общей шиной все транзакции между процессором и модулями памяти выполняются через шину. В результате они передаются всем соединенным с шиной устройствам. Предположим, что в кэше каждого процессора имеется управляющая схема, наблюдающая за транзакциями на шине, в которых участвуют другие процессоры. Для работы с кэш-памятью используется протокол обратной записи.
Когда процессор в первый раз выполняет запись блока в свой кэш, это блок помечается как измененный (dirty) и информация о записи распространяется по сети. Модуль памяти и все остальные кэши помечают свои копии измененного блока как недостоверные. Выполнивший запись Процессор с этого момента является владельцем блока. Он может вносить в него изменения без их распространения по сети. Если другой процесс выдаст запрос на чтение данного блока, модуль памяти окажется не в состоянии на него ответить, поскольку в нем нет достоверной копии. Однако текущий владелец блока тоже увидит этот запрос на шине и должен будет предоставить выдавшему его процессору достоверные данные. Новые данные, содержащиеся в отправленном владельцем широковещательном сообщении, считываются модулем памяти, после чего последний обновляет свой блок. Затем владелец блока помечает свою копию как чистую (неизмененную). Теперь во всех кэшах и в памяти находятся обновленные данные, и весь процесс при необходимости повторяется. Если измененный блок в кэше одного из процессоров должен быть заменен новым, выполняется операция обратной записи в модуль памяти.
Если два процессора хотят одновременно записать данные в один и тот же блок, доступ к шине предоставляется только одному из них (он становится владельцем блока). В результате копия этого блока в другом процессоре помечается как недостоверная. Позднее второй процессор может повторить свой запрос. Такая последовательная обработка запросов на запись гарантирует корректное изменение данных двумя процессорами в одном и том же блоке.
Описанная схема основана на способности контроллеров кэша следить за активностью шины и выполнять соответствующие действия. Поэтому кэш-память подобного типа называется кэшем с отслеживанием (snoopy-cache).
С точки зрения производительности важно, чтобы функция отслеживания не мешала нормальному функционированию процессора и его кэш-памяти. Проблема состоит в том, что при каждом появляющемся на шине запросе контроллер кэша должен обращаться к хранящимся в нем тегам, чтобы узнать, присутствует ли там искомый блок. В большинстве случаев ответ оказывается отрицательным. Поэтому, с тем чтобы изолировать процесс отслеживания от выполнения остальных функций узла, кэш снабжается двумя наборами тегов, содержащими одну и ту же информацию о блоках. Схемы отслеживания могут обращаться к своему набору тегов независимо от остальных схем управления кэш-памятью.
Хотя концепция кэша с отслеживанием эффективна и проста в реализации, она подходит только для систем с общей шиной. В более крупных мультипроцессорах приходится использовать более сложные технологии согласования кэш-памяти.
Схемы на основе каталогов
Схема согласования кэша при помощи широковещательной передачи сообщений об обновленных или недостоверных данных не годится для больших систем. Широковещательные сообщения вызывают слишком большой трафик, несмотря на то что копии каждого конкретного блока обычно присутствуют всего в нескольких кэшах. Альтернативой может служить создание каталога с информацией о кэшах, хранящих копии каждого из блоков. Для реализации такого каталога можно включить в каждый блок дополнительные биты, указывающие, в каких кэшах имеются его копии. Тогда вместо широковещательной рассылки информации об изменениях модуль памяти может направлять процессорным модулям отдельные или групповые сообщения. Конечно, дополнительные биты в модулях памяти увеличивают их стоимость. Предлагались различные схемы реализации каталога, и некоторые из них были воплощены в существующих мультипроцессорных системах.
Стандарт SCI
Один из способов обеспечения согласованности кэш-памяти был стандартизирован Институтом инженеров по электротехнике и электронике (Institute of Electrical and Electronics Engineers, IEEE). Он приведен в стандарте SCI (Scalable Coherent Interface — масштабируемый когерентный интерфейс), который определяет структуру мультипроцессора, обеспечивающую быстрое распространение сигналов, масштабируемую архитектуру, согласованность кэша и простую реализацию. В сети обмена используются соединения «точка-точка», а коммуникационный протокол основывается на принципе «один источник запроса — один приемник». Каждый пакет высылается одним узлом-источником и адресуется единственному узлу-приемнику. Если пакет принят адресатом, последний возвращает пакет с положительным подтверждением. Если пакет не принят, высылается отрицательное подтверждение, вызывающее повторную отправку пакета.
Согласованность кэш-памяти достигается при помощи протокола на основе распределенного каталога. Для каждого блока кэша, содержащего общие данные, создается двусвязный список. Каждый процессорный узел, кэширующий этот блок, помещает в список указатели на использующие блок предыдущий и следующий узлы. Эти указатели записываются в тег блока кэш-памяти. Концом созданного таким образом двусвязного списка является модуль памяти, где хранится данный блок. Когда очередной узел обращается к модулю памяти, чтобы прочитать нужный блок, этот узел становится новым началом списка, а каталог предыдущего начала списка обновляется — указатель на предыдущий узел заменяется указателем нового узла. Доступ к памяти для записи разрешается только первому узлу списка (точнее, его началу). Если другой узел захочет выполнить запись, он должен будет записать себя в начало списка и очистить остальные элементы списка.
SCI-схема согласования кэша хорошо масштабируется, так как с увеличением списка узлов требования к объему памяти для его хранения ни в основной памяти, ни в кэш-памяти процессоров не увеличиваются. А недостатком этой схемы является необходимость хранения дополнительной информации для каждого блока.
Хотя стандарт SCI не определяет конкретную топологию сети обмена, наиболее подходящей для него является кольцевая топология. Она реализована в мультипроцессорах Exemplar V2600 производства Hewlett-Packard и AV25000 производства Data General вместе с описанным в этом разделе протоколом согласования кэша.
Мультипроцессоры cc-NUMA
Проблема согласованности кэша является одной из важнейших проблем при разработке мультипроцессорных систем и предметом самых интенсивных исследований. Мы коротко описали несколько основных схем согласования кэша, но более подробное обсуждение этого вопроса выходит за рамки нашей книги.
Согласованность кэша может обеспечиваться как аппаратными, так и программными средствами. Но более высокая производительность достигается при использовании аппаратных средств. Поэтому в большинстве современных мультипроцессоров NUMA согласованность кэша реализуется аппаратно. Такие системы называются системами NUMA с согласованной кэш-памятью (cache coherent NUMA, cc-NUMA).