Когерентность кэша
Когерентность кэша (англ. cache coherence) — свойство кэшей, означающее целостность данных, хранящихся в локальных кэшах для разделяемого ресурса. Когерентность кэшей — частный случай когерентности памяти.
Когда процессы в системе используют кэширование общих ресурсов, например, памяти, могут возникнуть проблемы с противоречивостью данных. Это особенно справедливо в отношении процессоров в многопроцессорной системе. Когеренция кэшей предназначена для управления такими конфликтами путём поддержания согласованности данных в разных кэшах.
Когерентность определяет поведение чтений и записей в одно и то же место памяти. Кэш называется когерентным, если выполняются следующие условия[1]:
- информирование о записи: изменение данных в любом из кэшей должно быть распространено на другие копии этих данных (этой линии кэша) в соседних кэшах;
- сериализация транзакций: операции чтения и записи в одну и ту же ячейку памяти должны быть видимы для всех процессоров в одинаковом порядке.
В этих условиях предполагается, что операции чтения и записи происходят мгновенно. Однако этого не происходит на практике из-за задержек памяти и других особенностей архитектуры. Изменения, сделанные процессором , могут быть не видны процессору , если чтение произошло через очень маленький промежуток времени после записи. Модель консистентности памяти определяет, когда записанное значение будет видно при чтении из другого потока.
Механизмы когерентности кэшей
[править | править код]Три основных механизма обеспечения когерентности кэшей — с использованием справочника (directory), отслеживание (snooping) и перехват (snarfing).
При использовании справочника информация о состоянии блока физической памяти содержится только в одном месте, называемом справочником (при этом физически справочник может быть распределён по узлам системы).
В механизме отслеживания каждый кэш, который содержит копию данных некоторого блока физической памяти, имеет также соответствующую копию служебной информации о его состоянии. Централизованная система записей отсутствует. Обычно кэши расположены на общей (разделяемой) шине и контроллеры всех кэшей наблюдают за шиной (просматривают её) для определения того, не содержат ли они копию соответствующего блока.
При применении перехвата, когда из какого-либо одного кэша данные переписываются в оперативную память, контроллеры остальных получают сигнал об этом изменении («перехватывают» информацию об изменении данных) и, если необходимо, изменяют соответствующие данные в своих кэшах.
Системы распределенной разделяемой памяти[англ.] используют похожие механизмы для поддержания согласованности между блоками памяти в слабосвязанных системах.
Протоколы поддержки когерентности
[править | править код]Протоколы поддержки когерентности отвечают за поддержание корректности данных между всеми кэшами в системе с распределенной разделяемой памятью. Протокол поддерживает когерентность памяти согласно выбранной модели согласованности. Большинство аппаратных протоколов в процессорах (в том числе обеспечивающих кэш-когерентный неравномерный доступ к памяти) соответствует модели последовательной согласованности, а программные протоколы в системах программной распределённой памяти чаще реализуют модели согласованности по выходу (англ. release consistency) или слабой согласованности (англ. weak consistency).
Основные модели и протоколы поддержки когерентности кэшей:
- протокол MSI
- протокол MESI[англ.] (Intel Pentium, Intel Core)
- протокол MOSI
- протокол MOESI (AMD Opteron[2])
- MOWESI[3]
- протокол MERSI
- протокол MESIF (Intel Nehalem[2])
- протокол однократной записи[англ.]
- протокол синапса[англ.]
- протокол Беркли[англ.]
- cветлячковый протокол (англ. firefly protocol; DEC)
- протокол дракона (англ. dragon protocol; Xerox)
- протокол CXL (англ. compute express link; Intel)
- протокол CCIX (англ. cache coherent interconnect for accelerators; ARM)[4][5]
- протокол OmniXtend[6][7] (Western Digital — SiFive — Linux Foundation[8][9]) — подключение ускорителей (GPGPU, FPGA, нейропроцессоров), систем хранения, энергонезависимой памяти и сетевых интерфейсов к системам на кристалле с процессором RISC-V; использует физический уровень Ethernet (L1-кадр).
Примечания
[править | править код]- ↑ Yan, Solihin. Fundamentals of parallel multicore architecture (неопр.).
- ↑ 1 2 [1] Архивная копия от 3 июля 2010 на Wayback Machine Multi Processors, their Memory organizations and Implementations by Intel & AMD
- ↑ Принципы работы кэш-памяти — Индикаторы состояния строки . Дата обращения: 15 октября 2009. Архивировано 25 января 2009 года.
- ↑ StackPath . Дата обращения: 12 марта 2019. Архивировано 16 февраля 2019 года.
- ↑ How AMBA CCIX and GenZ address the needs of the datacenter — Processors blog — Processors — Arm Community . Дата обращения: 12 марта 2019. Архивировано 12 декабря 2019 года.
- ↑ GitHub — westerndigitalcorporation/omnixtend: An open standard Cache Coherent Fabric Interface repository . Дата обращения: 12 марта 2019. Архивировано 26 августа 2020 года.
- ↑ Архивированная копия . Дата обращения: 12 марта 2019. Архивировано из оригинала 22 февраля 2019 года.
- ↑ Google, SiFive и WD основали альянс для продвижения открытых чипов и SoC . Дата обращения: 12 марта 2019. Архивировано 14 марта 2019 года.
- ↑ Western Digital Reveals SweRV RISC-V Core, Cache Coherency over Ethernet Initiative . Дата обращения: 12 марта 2019. Архивировано 25 апреля 2019 года.
Литература
[править | править код]- Handy, Jim. The Cache Memory Book. Academic Press, Inc., 1998. ISBN 0-12-322980-4