Набор инструкций

Год

Регистры

Типы операций

Макс. элементов

Число команд

Статус

MMX

1997

8×64-бит

Целочисленные

8×8-бит или 2×32-бит

57

устарел

3DNow!

1998

8×64-бит

FP32

2×32-бит

21

удалён

SSE

1999

8/16×128-бит

FP32

4×32-бит

70

активен

SSE2

2000

8/16×128-бит

FP64, целочисленные

2×64-бит, 16×8-бит

144

активен

SSE3

2004

8/16×128-бит

FP, x87

4×32-бит

13

активен

SSSE3

2006

8/16×128-бит

Целочисленные

16×8-бит

32

активен

SSE4.1

2007

8/16×128-бит

FP, целочисленные

4×32-бит

47

активен

SSE4.2

2008

8/16×128-бит

Строковые, CRC, popcnt

16 байт

7

активен

SSE4a

2007

8/16×128-бит

Целочисленные

4

удалён

AVX

2011

16×256-бит

FP32/FP64

8×32-бит, 4×64-бит

32

активен

AVX2

2013

16×256-бит

FP и целочисленные

32×8-бит

256

активен

FMA3

2013

16×128/256-бит

FP

4×64-бит, 8×32-бит

16

активен

FMA4

2011

16×128/256-бит

FP

4×64-бит, 8×32-бит

41

удалён

XOP

2011

16×128/256-бит

Целочисленные

16×8-бит

40

удалён

F16C

2012

16×128/256-бит

FP16 <-> FP32

8×16-бит

2

активен

AVX-512

2016

32×512-бит + маски

FP, целочисленные, маски

64×8-бит

500

частично активен

AMX

2023

8×8192-бит тайлы

INT8, BF16

матрицы 16×64

10

ограниченно активен

AVX10

2024

32×512-бит

FP8, FP16, FP32, INT

512-бит

50

в разработке

Общее количество всех команд во всех этих расширениях — 1342 инструкции!

При этом очень много дублирования / переизобретения функционала. Если бы не обратная совместимость — можно было бы половину удалить (MMX/MMX2, например, точно бы удалить).

От комментариев воздержусь, оставлю эту привилегию читателю ))

При этом SIMD на RiscV очень хвалят, как очень продуманный, минималистичный, при этом мощный и выразительный: https://www.youtube.com/watch?v=lwIBp6cc-HY

PS: Другие наборы команд, которые можно было бы удалить из x86, которые не удаляют из за обратной совместимости (в частости, наборы команд для 16/32-битного режима):

Категория

Примеры

Примерное число инструкций

Причина устаревания

Удаляемо?

MMX

paddb, emms

57

Вытеснен SSE2, не используется

Да

3DNow!

pfadd, pfrcp

21

Удалён из CPU AMD

Да

Сегментация

lds, les, lfs, lgs, arpl

~15

Не используется в x86-64

Да

Task switching

ltr, str, call far, ret far

~10

ОС используют программный планировщик

Да

BCD/строковые устаревшие

daa, das, aam, aad, into

~15

Не используются компиляторами

Да

ESC/WAIT

wait, esc

~5

Для старых FPU, неактуально

Да

XLAT и подобные

xlat

1

Устарела, почти не применяется

Да

Loop-prefixed

loop, loope, loopne

3

Медленнее обычных jmp/cmp

Частично

BOUND

bound

1

Никем не используется

Да

16-битные только

pushaw, popaw, jcxz

~8

Только real/protected mode; не используются в x86-64

Да

32-битные только

pushad, popad, jecxz

~8

Недоступны в x86-64; заменены другими средствами

Да

Старые far-call инструкции

call far ptr, jmp far ptr

~4

Только 16/32-битный сегментный код

Да

INT xx (кроме 0x80/0x3)

int 0x21, int 0x13

много

BIOS/DOS, неактуальны

Да (в usermode)

IN/OUT инструкции

in al, dx / out dx, al

~6

Только для доступа к портам; не применяются в usermode

Частично

Комментарии (7)


  1. 0serg
    28.05.2025 11:40

    Ну это не полностью разные команды все-таки а разные вариации одних и тех же команд. FMA например это все по сути одна команда. Различия только в знаках (a*b+c, a*b-c, -a*b+c) и типах операндов (fp32, fp64, fp32 packed,....)․ Там декодер по сути достает эту одну команду и пару бит в виде "флагов" управляющих ею. Кроме того не все эти инструкции поддерживаются. Например FMA4 и FMA3 взаимно исключающие (разные реализации одного и того же). AVX512 вообще прям by design состоит из нескольких поднаборов инструкций которые могут поддерживаться не полностью. Наконец в списке инструкции частично "продублированы" - например FMA является частью AVX2․ Так что не все так плохо, да.


  1. Alex283
    28.05.2025 11:40

    Активно использую инструкции SSE/AVX/AVX2/AVX512 для обработки текста. Дают хорошие плюшки в производительсности...


    1. despair Автор
      28.05.2025 11:40

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


  1. Salabar
    28.05.2025 11:40

    У Риск В минималистичный симд, потому что он состоит из необходимого минимума. Как только у производителей появятся настоящие клиенты, образуется столько расширений, что их в одной статье не перечислишь.


  1. Sun-ami
    28.05.2025 11:40

    Как это можно удалить x87 FPU, если команд для работы с 80-битным форматом больше ни в одном наборе нет?


    1. mpa4b
      28.05.2025 11:40

      х87 даже синусы считает неточно, попробуйте посчитать sin(M_PI) при помощи SSE(2) и при помощи х87.

      А если вам не хватает 53 бит мантиссы, попробуйте для начала https://en.wikipedia.org/wiki/Double-double_(arithmetic)#Double-double_arithmetic


      1. 0serg
        28.05.2025 11:40

        Тригонометрические функции это не то что «даже» считается неточно, это единственное что там реализовано не идеально. Но даже эта проблема имеет нулевую практическую значимость и скорее является косяком документации которая гарантировала максимальную ошибку в относительных единицах тогда как реальная реализация fsin обеспечивает ее в абсолютной величине. Ну как бы да, формально нехорошо что величина синуса равная 1e-18 считается для некоторых значений с абсолютной погрешностью 1e-23 а не 1e-30 что формально обещает стандарт ( конкретные значения взяты с потолка чтобы показать принцип). Влияет это на хоть что то? Сомневаюсь. В любом случае в sse и даже в avx вплоть до avx-512 специальных инструкций для подсчета синуса аналогичных fsin просто нету, а любой алгоритм реализованный на обычных инструкциях даст лучшие результаты при использовании long double.