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.- Отладчик — лучший способ увидеть всё из курса в действии на живой программе.