Набор инструкций |
Год |
Регистры |
Типы операций |
Макс. элементов |
Число команд |
Статус |
---|---|---|---|---|---|---|
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)
Salabar
28.05.2025 11:40У Риск В минималистичный симд, потому что он состоит из необходимого минимума. Как только у производителей появятся настоящие клиенты, образуется столько расширений, что их в одной статье не перечислишь.
Sun-ami
28.05.2025 11:40Как это можно удалить x87 FPU, если команд для работы с 80-битным форматом больше ни в одном наборе нет?
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
0serg
28.05.2025 11:40Тригонометрические функции это не то что «даже» считается неточно, это единственное что там реализовано не идеально. Но даже эта проблема имеет нулевую практическую значимость и скорее является косяком документации которая гарантировала максимальную ошибку в относительных единицах тогда как реальная реализация fsin обеспечивает ее в абсолютной величине. Ну как бы да, формально нехорошо что величина синуса равная 1e-18 считается для некоторых значений с абсолютной погрешностью 1e-23 а не 1e-30 что формально обещает стандарт ( конкретные значения взяты с потолка чтобы показать принцип). Влияет это на хоть что то? Сомневаюсь. В любом случае в sse и даже в avx вплоть до avx-512 специальных инструкций для подсчета синуса аналогичных fsin просто нету, а любой алгоритм реализованный на обычных инструкциях даст лучшие результаты при использовании long double.
0serg
Ну это не полностью разные команды все-таки а разные вариации одних и тех же команд. FMA например это все по сути одна команда. Различия только в знаках (a*b+c, a*b-c, -a*b+c) и типах операндов (fp32, fp64, fp32 packed,....)․ Там декодер по сути достает эту одну команду и пару бит в виде "флагов" управляющих ею. Кроме того не все эти инструкции поддерживаются. Например FMA4 и FMA3 взаимно исключающие (разные реализации одного и того же). AVX512 вообще прям by design состоит из нескольких поднаборов инструкций которые могут поддерживаться не полностью. Наконец в списке инструкции частично "продублированы" - например FMA является частью AVX2․ Так что не все так плохо, да.