SIMD-обзор и отладка в gdb

Финальный урок: знакомство с параллельными SIMD-командами и отладчиком gdb как инструментом изучения.

SIMD (Single Instruction, Multiple Data) — команды, которые за один такт выполняют одну операцию сразу над несколькими числами.

Идея SIMD: считать пачками

Обычная команда add складывает два числа. SIMD-команды работают с широкими регистрами xmm (128 бит) и ymm (256 бит), в которые помещается несколько чисел сразу. Например, одна команда paddd складывает четыре пары 32-битных чисел параллельно:

  xmm0:  [ 1 | 2 | 3 | 4 ]
  xmm1:  [ 5 | 6 | 7 | 8 ]
  paddd  -------------------
  xmm0:  [ 6 | 8 |10 |12 ]   за одну команду

Это основа быстрой обработки графики, звука, машинного обучения: вместо цикла из миллионов отдельных сложений — пачки по 4, 8, 16 чисел за раз. Компиляторы умеют автоматически «векторизовать» простые циклы в SIMD.

Как работает под капотом

Промоделируем параллельное сложение четырёх пар на Python — то, что paddd делает аппаратно за одну команду:

xmm0 = [1, 2, 3, 4]
xmm1 = [5, 6, 7, 8]
# paddd: сложить попарно за один шаг
result = [a + b for a, b in zip(xmm0, xmm1)]
print("paddd ->", result)

Вывод:

paddd -> [6, 8, 10, 12]

Разница в том, что Python делает четыре сложения по очереди, а процессор — одновременно, в этом и весь выигрыш SIMD.

gdb: смотреть, как код исполняется

Отладчик gdb — главный инструмент изучения ассемблера: он позволяет шагать по командам и видеть регистры. Базовые команды:

Команда gdbЧто делает
break _startпоставить точку останова
runзапустить программу
stepi / siвыполнить одну машинную команду
info registersпоказать все регистры
disassembleпоказать ассемблер текущей функции

Типичный сеанс отладки выглядит так:

gdb ./prog
(gdb) break _start      # остановиться на входе
(gdb) run               # запустить
(gdb) si                # шаг по одной команде
(gdb) info registers rax  # посмотреть rax
(gdb) disassemble       # увидеть машинный код

Частые ошибки

  • Шагать step вместо stepi. step — это шаг по строкам исходника; для машинных команд нужен stepi.
  • Ожидать SIMD-ускорения автоматически везде. Векторизуются только простые независимые циклы; зависимости по данным мешают.
  • Забыть собрать с отладочной информацией. Для удобной отладки C компилируют с флагом -g.

Итог

  • SIMD-команды обрабатывают несколько чисел за один такт в регистрах xmm/ymm.
  • Это ускоряет графику, звук, вычисления; компиляторы умеют автовекторизовать циклы.
  • gdb позволяет шагать stepi по командам и смотреть регистры через info registers.
  • Отладчик — лучший способ увидеть всё из курса в действии на живой программе.
Проверьте себя
1. Что означает аббревиатура SIMD?
ASimple Instruction, Many Devices
BSingle Instruction, Multiple Data — одна команда над многими данными
CSystem Interrupt for Memory Devices
DSigned Integer Multiply Divide
2. Какая команда gdb выполняет одну машинную инструкцию?
Astep
Bstepi (si)
Crun
Dcontinue
3. В чём выигрыш SIMD-команды paddd по сравнению с обычным циклом?
AОна складывает несколько пар чисел параллельно за один такт
BОна работает только с одним числом
CОна экономит память
DОна не требует регистров