Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 55 KiB |
BIN
.pic/Lectures/18. Synchronization. Cache coherence/fig_38.jpg
Normal file
After Width: | Height: | Size: 11 KiB |
@@ -36,6 +36,7 @@
|
|||||||
- [MESI: усовершенствованный](#mesi-усовершенствованный)
|
- [MESI: усовершенствованный](#mesi-усовершенствованный)
|
||||||
- [Когерентность кэш и ложное совместное использование](#когерентность-кэш-и-ложное-совместное-использование)
|
- [Когерентность кэш и ложное совместное использование](#когерентность-кэш-и-ложное-совместное-использование)
|
||||||
- [Основные материалы лекции](#основные-материалы-лекции)
|
- [Основные материалы лекции](#основные-материалы-лекции)
|
||||||
|
- [Дополнительные материалы к лекции для саморазвития](#дополнительные-материалы-к-лекции-для-саморазвития)
|
||||||
|
|
||||||
## Параллелизм уровня потоков
|
## Параллелизм уровня потоков
|
||||||
|
|
||||||
@@ -486,12 +487,15 @@ Snoopy кэш отличается от обычного кэша наличие
|
|||||||
1) Допустим, ядро 0 сначала загружает по адресу `A` число 2. На шине запрашивается чтение, в кэш попадает запись с состоянием `Valid`.
|
1) Допустим, ядро 0 сначала загружает по адресу `A` число 2. На шине запрашивается чтение, в кэш попадает запись с состоянием `Valid`.
|
||||||
2) Затем загружает ядро 1 по адресу `A` число 2, теперь там тоже запись `Valid`.
|
2) Затем загружает ядро 1 по адресу `A` число 2, теперь там тоже запись `Valid`.
|
||||||
3) Теперь происходит запись числа 3 в память через ядро 0, кэш ядра 1 видит это и делает `Invalidate` данных (обнуляет их).
|
3) Теперь происходит запись числа 3 в память через ядро 0, кэш ядра 1 видит это и делает `Invalidate` данных (обнуляет их).
|
||||||
4) Когда произойдёт очередной `load` на ядре 1, он увидит, что данные находятся в состоянии `Invalidate`.
|
|
||||||
5) Теперь просто зачитаем обновленные данные из основной памяти.
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
*Рис. 33. Пример применения протокола `Valid/Invalid` с пояснениями.*
|
*Рис. 33. Иллюстрация шага 3 в примере протокола `Valid/Invalid`.*
|
||||||
|
4) Кэш ядра 1 видит транзакцию записи по адресу имеющейся у него ячейки памяти и помечает эту ячейку состоянием `Invalid`. Когда ему потребуются данные из этой ячейки, он загрузит их из основной памяти, вернув состоянию этой ячейки значение `Valid`.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
*Рис. 34. Иллюстрация шага 4 в примере протокола `Valid/Invalid`.*
|
||||||
|
|
||||||
Проблемы `VI`:
|
Проблемы `VI`:
|
||||||
|
|
||||||
@@ -514,13 +518,13 @@ Snoopy кэш отличается от обычного кэша наличие
|
|||||||
|
|
||||||
Если же мы находимся в состоянии `Invalidate` и процессор хочет осуществить запись в какую-либо ячейку памяти, то шина об этом конечно узнает, потому что мы запрашиваем эксклюзивное пользование данными (`BusRdX`), и мы перейдём в состояние `M`. Дальше происходит чтение и запись данных. Если мы находимся в состоянии `M` и кто-то прочитает данные, то мы автоматически перейдём в состояние чтения (`S`).
|
Если же мы находимся в состоянии `Invalidate` и процессор хочет осуществить запись в какую-либо ячейку памяти, то шина об этом конечно узнает, потому что мы запрашиваем эксклюзивное пользование данными (`BusRdX`), и мы перейдём в состояние `M`. Дальше происходит чтение и запись данных. Если мы находимся в состоянии `M` и кто-то прочитает данные, то мы автоматически перейдём в состояние чтения (`S`).
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
*Рис. 34. `MSI` протокол.*
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
*Рис. 35. Основные действия для данного протокола.*
|
*Рис. 35. `MSI` протокол.*
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
*Рис. 36. Основные действия для данного протокола.*
|
||||||
|
|
||||||
- Недостатки `VI`: каждая запись обновляет основную память, и каждая запись требует широковещательной передачи и слежки.
|
- Недостатки `VI`: каждая запись обновляет основную память, и каждая запись требует широковещательной передачи и слежки.
|
||||||
- `MSI`: возможность реализации кэша с обратной записью (`writeback`) + удовлетворяет локальную запись.
|
- `MSI`: возможность реализации кэша с обратной записью (`writeback`) + удовлетворяет локальную запись.
|
||||||
@@ -547,17 +551,17 @@ Snoopy кэш отличается от обычного кэша наличие
|
|||||||
- `S`: `Shared`.
|
- `S`: `Shared`.
|
||||||
- `I`: `Invalid`.
|
- `I`: `Invalid`.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
*Рис. 36. Протокол `MESI`: усовершенствованный.*
|
*Рис. 37. Протокол `MESI`: усовершенствованный.*
|
||||||
|
|
||||||
### Когерентность кэш и ложное совместное использование
|
### Когерентность кэш и ложное совместное использование
|
||||||
|
|
||||||
Строка кэша содержит более одного слова, и согласованность кэша выполняется на уровне детализации строки.
|
Строка кэша содержит более одного слова, и согласованность кэша выполняется на уровне детализации строки.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
*Рис. 37. Строка кэша.*
|
*Рис. 38. Строка кэша.*
|
||||||
|
|
||||||
Предположим `P₁` записывает `wordᵢ` и `P₂` записывает `wordₖ` и оба слова имеют один и тот же адрес строки.
|
Предположим `P₁` записывает `wordᵢ` и `P₂` записывает `wordₖ` и оба слова имеют один и тот же адрес строки.
|
||||||
Что может произойти?
|
Что может произойти?
|
||||||
|