This commit is contained in:
@@ -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) (в работе, есть интересные факты про Эльбрус)
|
||||||
Reference in New Issue
Block a user