add vliw, empty risc and m68k
deploy / Pull and Restart (push) Successful in 16s

This commit is contained in:
roma-dxunvrs
2026-10-15 16:39:49 +03:00
parent 005017595b
commit 4d0e404259
3 changed files with 30 additions and 1 deletions
@@ -0,0 +1,27 @@
## Учебная архитектура
## Реальные VLIW и Эльбрус
### Виды параллелизма
> [!warning] Эта часть должна переехать в часть лекций
1. На уровне инструкций
- Конвейризация
- Суперскалярность
- Длинные машинные слова (very long instruction word)
2. На уровне данных
- Векторы
3. На уровне потоков - многопоточность
4. На уровне процессов - много ядер в процессоре
### Оптимизация обращений к памяти
- Есть спекулятивные команды, по типу спекулятивного чтения. В самом начале процессор читает, а если нигде по итогу не использовалось, то прочитанное значение отваливается.
- Оптимизация обращений к памяти в цикле: вместо `load -> alu -> store` компилятор расслаивает итерации и делает `store i -> alu i+1 -> load i+2` (i - номер итерации)
### Оптимизация переходов
Переход довольно затратная операция для конвейрных процессоров. Виды оптимизаций:
1. Штраф за переход и просто все этапы конвейера сбрасываются (самый простой вариант, на практике встречается редко)
2. В Эльбрусе - предикаты, выполняются обе ветки (if-else) а потом записывает только то, что в предикате. Превращает Control Flow в Data Flow. Используется только для коротких веток (3-5 команд). Логика: команды сравнения записывают в регистровый файл предикатов 0 или 1. Компилятор ставит абсолютно все команды в поток исполнения (и из if, и из else), но ставит специальные биты в команду: номер предиката, который контроллирует выполнение. Дальше команды исполняются, на этапе декода процессор видит предикат, а на этапе записи в память делает операцию, только если управляющий предикат - 1. (P.S. такое же было и в Intel Itanium)
3. Предикт переходов, в cisc - это делает процессор (у него маленькая область видимости, поэтому может быть неэффективно), в vliw - это делает компилятор (компилятор видит всю программу целиком и может отлично с этим справится). Процессор готовится к переходу и загружает команды в конвейер. Эльбрус позволяет подготовавливать до трех переходов одновременно.
### Регистровое окно и стек регистров
- Процессор содержит несколько сотен регистров, каждая фукнция "заказывает" себе у процессора нужное количество, при этом видимые для функции регистров делятся на три группы: регистры с параметрами, регистры для временных вычислений, регистры с параметрами для вызываемой функции. В момент вызова функции регистровый файл виртуально сдвигается вниз - первая и вторая группы не будут видны вызванной функции. Третья группа становится первой, а новые вторые и третью группы функция снова заказывает.
- Если процессору не хватает физических регистров для функции, то процессор сам в фоновом режиме сбрасывает неиспользуемую часть регистрового файла в стек в ОЗУ. При возврате из функции процессор незаметно восстанавливает регистры из стека.
- Есть глобальная группа регистров (типичные регистры из cisc, risc)
### Безопасность
- Несколько стеков: регистры пользователя на одном, адрес возврата и состояние процессора - на другом - защита от buffer overflow и подмены адреса возврата
- Процессор различает в памяти указатели и сами данные. В Эльбрусе нельзя создать указатель не из указателя. При этом первичный указатель безопасно получается специальными командами и механизмами в процессоре
@@ -4,4 +4,6 @@
- [x86_64](x86_64.md) (реальная архитектура) - [x86_64](x86_64.md) (реальная архитектура)
- [acc32](acc32.md) - [acc32](acc32.md)
- [f32a](f32a.md) - [f32a](f32a.md)
- [m68k](m68k.md) - [m68k](m68k.md) (будет)
- [risc-iv](risc-iv.md) (будет)
- [vliw-iv](vliw-iv.md) (в работе, есть интересные факты про Эльбрус)