Архитектура RISC (на примере ARM)

RISC vs CISC

  • Reduced vs Complex Instruction Set Computer
  • Простые операции
    • Ограниченный набор простых команд (например, нет деления)
    • Команда выполняется за один такт
    • Фиксированная длина команды (простота декодирования)
  • Конвейер
    • Каждая операция разбивается на однотипные простые этапы, которые выполняются параллельно
    • Каждый этап занимает 1 такт, в т.ч. декодирование
  • Регистры
    • Много однотипных взаимозаменяемых регистров (могут использоваться и для данных, и для адресации)

RISC vs CISC

  • Модель работы с памятью
    • Отдельные команды для загрузки/сохранения в память
    • Команды обработки данных работают только с регистрами
  • Сложность оптимизаций перенесена из процессора в компилятор
    • Производительность сильно зависит от компилятора
  • Итого: более простое ядро, выше частота процессора

RISC vs CISC

  • Команды сделали фиксированной длины
  • увеличили число регистров, чтобы иметь большее пространство для работы с данными и реже обращаться к памяти.

RISC vs CISC

ARM

  • ARM: Advanced RISC Machine
    • Область применения: встраиваемые системы
    • Разработчик: компания ARM Holdings, лицензирует дизайн процессора производителям оборудования
  • Основные особенности:
    • Энергоэффективность
    • Низкая стоимость
    • Относительно простое ядро
    • Расширяемость
Архитектура Семейство процессоров Год Примеры устройств
ARMv1 ARM1 1985
ARMv2 ARM2, ARM3
ARMv3 ARM6, ARM7 1992
ARMv4 StrongARM, ARM7TDMI, ARM9TDMI 2003 iPaq 4150
ARMv5 ARM7EJ, ARM9E, ARM10E, XScale
ARMv6 ARM11 2007 iPhone (orig, 3G)
ARMv7 Cortex A8, Cortex A9 2008 N900, iPhone (3GS, 4, 4S)
ARMv8 Cortex-A53, Cortex-A57, Cortex-A72 2011

ARM v9

  • самое новое семейство архитектуры
  • добавлены такие возможности новые масштабируемые векторные SIMD (SVE2)
  • матричные (SME/SME2) операции, а также функциональность трассировок.
  • Armv9.4-A — это последний набор расширений Armv9.

ARM v9

  • A в Armv9-A обозначает «Application Profile».
  • Этот профиль поддерживает виртуальную память при помощи блоков управления памятью; скорее всего, вы обнаружите его в любых системах Arm, будь то телефон, ноутбук или сервер.
  • профиль «R» для приложений с требованиями системы реального времени
  • профили «M», которые чаще всего используют в микроконтроллерах, где отсутствуют блоки управления памятью.

Пример процессорор ARM

Режимы процессора ARM

  • ARM (32 бит)
    • Режим по умолчанию
    • Доступны все команды процессора, работа с сопроцессором
  • Thumb - 1 (16 бит )
    • Высокая плотность кода, лучшее использование I-Cache
    • На 16-битной памяти команда передается за один такт
    • Ограниченный набор команд и регистров

Режимы процессора ARM

  • Thumb-2 (смешанный 16/32 бит)
    • Объединяет преимущества ARM и Thumb-1
    • Размер кода на 25% меньше при сравнимой производительности
  • Jazelle (8 бит)
    • Аппаратно реализовано свыше 60% команд Java-байткода
    • Режим доступен только производителям оборудования

Регистры

  • 16 регистров общего назначения
  • Размер: 32 бита, используются в целочисленных командах, полностью взаимозаменяемые
  • Именование: r0 - r15
  • Некоторые регистры имеют специальные имена и назначение:
  • PC (r15) – Program Counter
  • LR (r14) – Link Register
  • SP (r13) – Stack Pointer

Регистры

  • Регистры состояния
  • CPSR (Current Program Status Register): флаги, обработка прерываний
  • SPSR (Saved Program Status Register): хранит копию CPSR при обработке прерывания
  • Доступ: команды MRS/MSR
  • Контрольные регистры
  • Изменения параметров кэширования, управления памятью, режимов процессора и т.п.
  • Доступ: команды MRC/MCR
  • Вещественные регистры (FPU и векторного сопроцессора)

Условные флаги

Флаги расположены в регистре CPSR (current program status register)

Установка флагов

  • Если команда ALU имеет суффикс ’S’, то флаги будут установлены в соответствии с результатом команды.
subs r1, r2, #1
lsls r1, r2, #5
cmp r2, #1				    
				    

Коды условий

Условное выполнение

Почти все команды ARM могут быть записаны в условной форме. В этом случае условие приписывается после команды, и она будет выполнена, только если условие истинно.

addge r1, r1, r1				    


// вычисление модуля |r1 – r2|:
subs r1, r1, r2
rsblt r1, r1, #0
				    

Модуль сдвига

  • Второй аргумент ALU-команд может быть представлен в виде
ARG2 = R shift_op B, где 				    
				    
  • R – регистр
  • B – величина сдвига (0-31)
  • shift_op – один из LSL, ASL, RSL, ROR или RRX
add r1, r1, r1 lsl #2 // r1 = r1 + r1 *4 = r1 * 5				    
				    

Представление констант

Второй аргумент ALU-команд может быть также константой, которая кодируется 12 битами (8 бит значение, 4 бита величина сдвига):

CONST_32 = CONST_8 << (2 * N), 0 <= N < 16
				    
  • and r1, r1, #255
  • and r1, r1, #510 // 510 = 255 << 1 – нечетный сдвиг
  • and r1, r1, #0xff00ff00 // значение «шире» 8 бит
  • and r1, r1, #0xff000000

Режимы процессора ARM

Команды работы с памятью

Команды загрузки/сохранения LDR / STR:

ldr r1, [r2, #+/-imm12]
ldr r1, [r2, r1, [r2, +/-r3, shift imm5]

// Примеры
ldr r1, [pc, #256]
ldr r1, [sp, r2, asl #2]
L1:
ldr r1, L1 + 248
ldr pc, [r1, r2, asl #2] // table-jump для switch
				    

Команды работы со стеком
  • Работа со стеком реализуется через команды stmdb/ldmia
push {r0 push {r0-r15} pop {r0 pop {r0-r15}
stmdb sp!, {r0, r15} ldmia sp!, {r0, r15}				    
				    

Вызов функций

  • Вызов функций выполняется при помощи команды bl – branch with link
  • Текущее значение регистра pc сохраняется в регистре lr
  • Возврат из функции выполняется с помощью команды bx lr
some_func:
    push {lr}
    …
    pop {pc} bx lr				    

bl some_func
some_func:
    bx lr
				    

Конвейер современного ARM

  • Cortex-A8
  • Конвейер из 13 стадий
  • 2 АЛУ устройства, 1 Load/Store, 1 Multiply
  • Может выполнять до 2-х команд за такт
  • Из них должно быть не более одной Load/Store и Multiply, причем умножение должно идти первым
  • Cortex-A9: добавлено динамическое переупорядочение команд

Примеры описания времени выполнения команд на конвейере

  • Этапы конвейера обознаются E1, E2, …, E5
  • Перед началом каждого этапа команда может требовать готовности операндов в регистрах, а после – выдавать готовые операнды
  • ADD r1, r2, r3
  • r2, r3: требуются перед E2
  • r1: после E2

Примеры описания времени выполнения команд на конвейере

  • MOV r1, r2 asl #const
  • r2: требуется перед E1
  • r1: готов после E1
  • Следствие 1: mov r2, r1; add r3, r2, r1 могут начать выполняться одновременно
  • Следствие 2: add r1, r2, r3; mov r2, r1 (в обратном порядке) имеют задержку в 2 такта между командами

Селективный планировщик

Улучшения кодогенерации для ARM Advanced SIMD (NEON)

Улучшение оптимизации GCSE и комбинирования команд в GCC

RISC-V

  • RISC-V - разработка Калифорнийского университета в Беркли.
  • V - читается как "пять", пятая версия, получившая популярность.
  • Идеи RISC, но открытая архитектура (x86 - только Intel, arm - нужно лицензирование).
  • RISC-V International - фонд развития RISC-V.
  • Февраль 2022 — Intel объявляет о том, что инвестирует 1 млрд $ в развитие RISC-V.
  • Март 2022 — AMD размещает вакансии разработчиков RISC-V.
  • По состоянию на 2022 год она насчитывает 2,400+ участников и ~300 компаний.
  • Есть другие открытые архитектуры: Power, SPARC, openRISC.

Характеристики RISC-V

  • RV32I означает архитектуру RISC-V, 32-разрядную
  • I означает наличие целочисленной арифметики
  • 47 базисных команд
  • Эти команды фиксированной ширины по 32 бита.
  • Это работа с памятью, арифметика, логика, работа с функциями.
  • Архитектура поддерживает 32 32-битных регистра, архитектуру 64 бита (масштабирование очень важно), она будет называться RV64I.

Модульность RISC-V

  • Базисная система команд может быть расширена. Возьмите только то, что вам нужно.
  • M — целочисленное умножение и деление (RV32IM, то есть процессор, поддерживающий базисную RV32I и целочисленное умножение/деление);
  • F, D — вычисления с плавающей точкой (F — float, D — double);
  • A — атомарные операции с памятью (общая память);
  • C — сжатые 16-битные инструкции (для устройств Интернета вещей (IoT));
  • E — встраиваемые системы (например, только 16 регистров, это нужно для маломощных процессоров, в том числе для IoT (Internet of Things)).