Files
obsidian/Computer Science/Архитектуры/vliw-iv.md
T
roma-dxunvrs 4d0e404259
deploy / Pull and Restart (push) Successful in 16s
add vliw, empty risc and m68k
2026-10-15 16:39:49 +03:00

5.5 KiB

Учебная архитектура

Реальные 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 и подмены адреса возврата
  • Процессор различает в памяти указатели и сами данные. В Эльбрусе нельзя создать указатель не из указателя. При этом первичный указатель безопасно получается специальными командами и механизмами в процессоре