diff --git a/01 - Зависимости структурные, по данным и управлению. Способы преодоления зависимостей. Построение статической и динамической трассы исполнения команд.md b/01 - Зависимости структурные, по данным и управлению. Способы преодоления зависимостей. Построение статической и динамической трассы исполнения команд.md new file mode 100644 index 0000000..c88fa6a --- /dev/null +++ b/01 - Зависимости структурные, по данным и управлению. Способы преодоления зависимостей. Построение статической и динамической трассы исполнения команд.md @@ -0,0 +1,85 @@ +--- +Статус: в работе +Соответствует: "2" +--- +*Длиннющий билет* + +> [!info]+ Отступление про конвейер +> Большинство процессоров сейчас конвейерные. Выполнение инструкции разбивается на отдельные этапы, которые могут выполняться +- паралелльно. В рамках методички выделяются следующие типичные стадии конвеера +> - выборка команды - IF (по адресу, заданному счетчиком команд, из памяти извлекается команда); +> - декодирование команды / выборка операндов из регистров - ID; +> - выполнение операции / вычисление эффективного адреса памяти - EX; +> - обращение к памяти - MEM; +> - запоминание результата - WB. +> +> ![[conveyor_example_1.gif]] +> *Конвейер некорректный, потому что тут есть зависимость по данным, которая не учитывается. Потом поймете* +> +> Производительность этом возрастает благодаря тому, что одновременно на различных ступенях конвейера выполняются несколько команд. Она не сокращает время выполнения отдельной команды. Имеются некоторые накладные расходы на конвейеризацию, возникающие в результате несбалансированности задержки на каждой его ступени. Частота синхронизации (такт синхронизации) не может быть выше, чем время, необходимое для работы наиболее медленной ступени конвейера + +# Зависимости структурные, по данным и управлению + +На конвейере иногда возникают различные конфликтные ситуации, например WB пишет в регистр R1, а ID из него же хочет почитать. Они не могут сделать это одновременно. Разрешение подобных конфликтов как правило сопряжено с замедлениями конвейера + +**Выделяют 3 класса конфликтов**: + +1. Структурные конфликты, которые возникают из-за конфликтов по ресурсам, когда аппаратные средства не могут поддерживать все возможные комбинации команд в режиме одновременного выполнения с совмещением. +2. Конфликты по данным, возникающие в случае, когда выполнение одной команды зависит от результата выполнения предыдущей команды. +3. Конфликты по управлению, которые возникают при конвейеризации команд переходов и других команд, которые изменяют значение счетчика команд + +## Структурные зависимости и способы их преодоления + +*Обычно случаются, потому что аппаратных средств ограниченное количество. Конечно количество ядер, конечно количество конвейеров, конечна пропускная способность оперативной памяти или не поддерживается одновременная запись и чтение* + +%% +Может возникнуть например когда нескольким ступеням конвейера необходимо обратиться к памяти, а у ОЗУ только один порт и он не поддерживает много обращений одновременно. Чтобы разрешить эту ситуацию, можно просто приостановить конвейер на один такт, когда происходит обращение к памяти за данными. Подобная приостановка часто называются "конвейерным пузырем" (pipeline bubble) или просто пузырем, поскольку пузырь проходит по конвейеру, занимая место, но не выполняя никакой полезной работы +%% + +Продемонстрируем структурные конфликт на следующем примере: "когда одна команда содержит обращение к памяти за данными, оно будет конфликтовать с выборкой более поздней команды из памяти" +### Решение + +**Чтобы разрешить эту ситуацию, можно просто приостановить конвейер на один такт, когда происходит обращение к памяти за данными.** + +*Пример из методички:* +![[Pasted image 20250609133320.png]] + +> [!tip]- Анимация для удобства восприятия: +> ![[buble_demo.gif]] +> *Вероятно хотели показать, что команда 1 на этапе MEM выполняет обращение к оперативной памяти, из-за чего не получается загрузить новую команду на конвейер* + +Структурные конфликты остаются в аппаратуре, потому что их полное решение сопряжено с очень большими денежными затратами и полным перепроектированием всего процессора и его периферии +## Зависимости по данным и методы их преодоления + +Зависимость по данным может быть продемонстрирована на следующем примере: + +![[Pasted image 20250609134742.png]] + +> [!tip]- Анимация для демонстрации +> ![[data_conflict.gif]] + +В этом примере все команды, следующие за командой ADD, используют результат ее выполнения. Если ничего не сделать, то SUB прочитает неправильное значение + +*Значение регистра R1 не является определенным, даже если мы знаем все предыдущие команды в программе, потому что могли происходить прерывания, изменившие R1* + +### Решение + +Решается проблема при помощи техники **обхода (data bypassing)** или **закоротки (short-circuiting)** - Результат операции АЛУ с его выходного регистра всегда снова подается назад на входы АЛУ. Если аппаратура обнаруживает, что предыдущая операция АЛУ записывает результат в регистр, соответствующий источнику операнда для следующей операции АЛУ, то логические схемы управления выбирают в качестве входа для АЛУ результат, поступающий по цепи "обхода" , а не значение, прочитанное из регистрового файла + +> [!tip]- Анимация для удобства восприятия +> *Анимация довольно сложная и комплексная, так то пришлось поставить ее в качестве mp4* +> +> ![[short_circuit.mp4]] +> +> В реальности аппаратура замечает, что нужно использовать закоротку еще в момент ex команды ADD, уже тогда она знает, что запрашивается регистр, являющийся выходным. Но суть в анимации передана + +Зависимости по данным группируются в следующую таблицу + +![[Pasted image 20250609153524.png]] + +Возьмем команды: сначала на конвейер приходит команда A, потом команда B +- RAW - B пытается читать тот регистр, в который еще не успела записать A. Есть риск получить старое или вовсе мусорное значение +- WAR - A пытается прочитать из ячейки, куда пишет B. Фактически это означает, что по какой-то причине B получает возможность писать раньше, чем A читать, что не должно происходить, если A попадает на конвейер раньше B. Однако в процессорах 6 поколения допускается выполнение команд не в порядке их следования в коде +- WAW - B пытается писать операнд раньше, чем А запишет свой результат, то есть записи происходят в неправильном порядке. *Возможны только в конвейерах, где запись может происходить на нескольких ступенях* + +*схема на рисунке* +![[Pasted image 20250609162101.png]] diff --git a/assets/Pasted image 20250609000344.png b/assets/Pasted image 20250609000344.png new file mode 100644 index 0000000..4471ede --- /dev/null +++ b/assets/Pasted image 20250609000344.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d629cc60b7f25cf8d5d0c0cb05ed73777892f5fcc1eb05aba7398324e126baee +size 1096 diff --git a/assets/Pasted image 20250609133114.png b/assets/Pasted image 20250609133114.png new file mode 100644 index 0000000..1249731 --- /dev/null +++ b/assets/Pasted image 20250609133114.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c305699c422b60af624d5ad6e1735b347c68d209c0575aec68f6cd0942be2d1 +size 1203 diff --git a/assets/Pasted image 20250609133320.png b/assets/Pasted image 20250609133320.png new file mode 100644 index 0000000..fca9eb5 --- /dev/null +++ b/assets/Pasted image 20250609133320.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10d069c219c45fb75c6a6687c084cd013a8e16d57e25ea44cfc3897cf9544dd0 +size 19340 diff --git a/assets/Pasted image 20250609134742.png b/assets/Pasted image 20250609134742.png new file mode 100644 index 0000000..e3371c3 --- /dev/null +++ b/assets/Pasted image 20250609134742.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a946c3d895afeee20ac95cc7bdab1f825068e930ce253201b8c2b4e771181e09 +size 11095 diff --git a/assets/Pasted image 20250609153524.png b/assets/Pasted image 20250609153524.png new file mode 100644 index 0000000..6776776 --- /dev/null +++ b/assets/Pasted image 20250609153524.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7ba72f2ac0fb6a8812822b5a6c68bdeafc95b7d3d03b42546368fb4105b35ef +size 12303 diff --git a/assets/Pasted image 20250609162101.png b/assets/Pasted image 20250609162101.png new file mode 100644 index 0000000..fb78922 --- /dev/null +++ b/assets/Pasted image 20250609162101.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5aee2f67a8d2bdb094ee96a9c8d6c0ba548de1805ea6d583452b26996254cf3 +size 17410 diff --git a/assets/buble_demo.gif b/assets/buble_demo.gif new file mode 100644 index 0000000..f0e3b9a --- /dev/null +++ b/assets/buble_demo.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38f1f18f49355e36c1d1a39278226f11ed589babaee787275558f6b0cee85a6d +size 615749 diff --git a/assets/buble_demo.mp4 b/assets/buble_demo.mp4 new file mode 100644 index 0000000..3f9d5b8 --- /dev/null +++ b/assets/buble_demo.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37df6585f5ee584afaf811ba08092f3553ee886196f90628e15a550a1773ae7e +size 912670 diff --git a/assets/conveyor_example_1.gif b/assets/conveyor_example_1.gif new file mode 100644 index 0000000..8cfae3e --- /dev/null +++ b/assets/conveyor_example_1.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:163516c12f48d30a268c55991b33b79fcfbde294f6cf11ba7fc922fde26e98e5 +size 609755 diff --git a/assets/conveyor_example_1.mp4 b/assets/conveyor_example_1.mp4 new file mode 100644 index 0000000..f20bd5e --- /dev/null +++ b/assets/conveyor_example_1.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6887f3aa7affcd104f5b87545e55156e81a09581c7a0519492005fe15e6612b1 +size 582884 diff --git a/assets/data_conflict.gif b/assets/data_conflict.gif new file mode 100644 index 0000000..0ae8449 --- /dev/null +++ b/assets/data_conflict.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99ff92c2316883a7918fee54d194c85ee5ac731e754ce5a5471d27a8eaf62533 +size 318654 diff --git a/assets/short_circuit.mp4 b/assets/short_circuit.mp4 new file mode 100644 index 0000000..95775be --- /dev/null +++ b/assets/short_circuit.mp4 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c40fca77145c6342a56b0ec607eaf32ebcb56b4797dabd5d0bd0b0d1a2a243c7 +size 2390444