Л18. Обновление примера VI

Closes #129
This commit is contained in:
Andrei Solodovnikov
2025-07-05 13:02:07 +03:00
parent 8c7d622d25
commit f45184c25a
9 changed files with 19 additions and 15 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -35,7 +35,8 @@
- [Оптимизация MSI: состояние E](#оптимизация-msi-состояние-e)
- [MESI: усовершенствованный](#mesi-усовершенствованный)
- [Когерентность кэш и ложное совместное использование](#когерентность-кэш-и-ложное-совместное-использование)
- [Основные материалы лекции](#основные-материалы-лекции)
- [Основные материалы лекции](#основные-материалы-лекции)
- [Дополнительные материалы к лекции для саморазвития](#дополнительные-материалы-к-лекции-для-саморазвития)
## Параллелизм уровня потоков
@@ -486,12 +487,15 @@ Snoopy кэш отличается от обычного кэша наличие
1) Допустим, ядро 0 сначала загружает по адресу `A` число 2. На шине запрашивается чтение, в кэш попадает запись с состоянием `Valid`.
2) Затем загружает ядро 1 по адресу `A` число 2, теперь там тоже запись `Valid`.
3) Теперь происходит запись числа 3 в память через ядро 0, кэш ядра 1 видит это и делает `Invalidate` данных (обнуляет их).
4) Когда произойдёт очередной `load` на ядре 1, он увидит, что данные находятся в состоянии `Invalidate`.
5) Теперь просто зачитаем обновленные данные из основной памяти.
![../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_33.jpg](../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_33.jpg)
![../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_33.jpg](../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_33.jpg)
*Рис. 33. Пример применения протокола `Valid/Invalid` с пояснениями.*
*Рис. 33. Иллюстрация шага 3 в примере протокола `Valid/Invalid`.*
4) Кэш ядра 1 видит транзакцию записи по адресу имеющейся у него ячейки памяти и помечает эту ячейку состоянием `Invalid`. Когда ему потребуются данные из этой ячейки, он загрузит их из основной памяти, вернув состоянию этой ячейки значение `Valid`.
![../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_34.jpg](../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_34.jpg)
*Рис. 34. Иллюстрация шага 4 в примере протокола `Valid/Invalid`.*
Проблемы `VI`:
@@ -514,13 +518,13 @@ Snoopy кэш отличается от обычного кэша наличие
Если же мы находимся в состоянии `Invalidate` и процессор хочет осуществить запись в какую-либо ячейку памяти, то шина об этом конечно узнает, потому что мы запрашиваем эксклюзивное пользование данными (`BusRdX`), и мы перейдём в состояние `M`. Дальше происходит чтение и запись данных. Если мы находимся в состоянии `M` и кто-то прочитает данные, то мы автоматически перейдём в состояние чтения (`S`).
![../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_34.jpg](../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_34.jpg)
*Рис. 34. `MSI` протокол.*
![../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_35.jpg](../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_35.jpg)
*Рис. 35. Основные действия для данного протокола.*
*Рис. 35. `MSI` протокол.*
![../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_36.jpg](../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_36.jpg)
*Рис. 36. Основные действия для данного протокола.*
- Недостатки `VI`: каждая запись обновляет основную память, и каждая запись требует широковещательной передачи и слежки.
- `MSI`: возможность реализации кэша с обратной записью (`writeback`) + удовлетворяет локальную запись.
@@ -547,17 +551,17 @@ Snoopy кэш отличается от обычного кэша наличие
- `S`: `Shared`.
- `I`: `Invalid`.
![../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_36.jpg](../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_36.jpg)
![../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_37.jpg](../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_37.jpg)
*Рис. 36. Протокол `MESI`: усовершенствованный.*
*Рис. 37. Протокол `MESI`: усовершенствованный.*
### Когерентность кэш и ложное совместное использование
Строка кэша содержит более одного слова, и согласованность кэша выполняется на уровне детализации строки.
![../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_37.jpg](../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_37.jpg)
![../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_38.jpg](../.pic/Lectures/18.%20Synchronization.%20Cache%20coherence/fig_38.jpg)
*Рис. 37. Строка кэша.*
*Рис. 38. Строка кэша.*
Предположим `P₁` записывает `wordᵢ` и `P₂` записывает `wordₖ` и оба слова имеют один и тот же адрес строки.
Что может произойти?