Прикладной SIMD 002: краткий обзор

Дата публикации 16 фев 2018 | Редактировалось 19 фев 2018
Предисловие
Данная статья ставит целью в первую очередь рассказать хронологию появления тех или иных технологий SIMD в процессорах семейства x86 и одновременно кратко охарактеризовать их.

Предыстория: FPU

Изначально процессоры 8086 и 8088 (как более дешёвая версия 8086 с восьмибитной шиной данных) имели шестнадцатиразрядные регистры общего назначения и предоставляли возможность вычислений с использованием только целочисленной арифметики. Тем не менее в процессорах был предусмотрен набор команд для операций с вещественными числами. При попытке выполнить какую-либо операцию генерировалось прерывание, которое позволяло запустить процедуру, эмулирующую работу той или иной арифметической операции. Разумеется, работало это очень медленно: на выполнение одной операции с плавающей точкой тратились сотни тактов процессора. Ускорить работу с плавающей точкой было возможно, используя специальный чип, который покупался за дополнительные деньги и устанавливался в специальную кроватку на материнской плате — так называемый сопроцессор. Этот сопроцессор получил название FPU (Floating Point Unit, блок арифметики с плавающей точкой) и свою маркировку 8087.

Сам по себе сопроцессор предоставлял восемь 80-битных регистров R0-R7 для хранения чисел расширенной точности, организованных в виде стека, и несколько управляющих регистров, позволявших управлять стеком и ходом выполнения команд. Разумеется, сами команды сопроцессора позволяли оперировать также и с числами одинарной и двойной точности. Однако внутри FPU все вычисления осуществлялись в режиме расширенной точности, что, разумеется, давало меньшую производительность в приложениях, того не требовавших. Сам же процесс вычисления был организован следующим образом: операнды загружались по очереди в стек, после чего над ними выполнялась арифметическая операция. Результат вычисления также помещался на вершину стека, при этом один либо оба операнда предварительно из стека выталкивались.

По мере развития архитектуры блок FPU оптимизировался, но по-прежнему оставался реализованным в виде отдельного сопроцессора. И только спустя 11 лет, с выходом процессоров 80486, было принято решение интегрировать блок FPU непосредственно в ядро процессора. С тех пор FPU является неотъемлемой частью процессоров архитектуры x86.

Первая технология SIMD: MMX
Дальнейшее развитие процессоров семейства x86 и мультимедийных приложений требовало оптимизации теперь уже целочисленной арифметики, и, как уже говорилось в предыдущей статье, первая технология SIMD появилась в процессорах семейства Pentium (маркетинговое название процессоров семейства 80586). Эту технологию назвали MMX (MultiMedia eXtension, мультимедийное расширение), и первыми процессорами, поддерживающими её, были процессоры Pentium MMX, выпущенные в 1997 году.

MMX представлял собой набор инструкций, предназначенных для ускорения кодирования и декодирования потоковых аудио- и видеоданных. Для этого были введены восемь новых 64-разрядных регистров — MM0-MM7 (в документации от AMD они фигурируют как MMX0-MMX7), которые не были самостоятельными регистрами, а являлись всего-навсего мантиссами регистров R0-R7 стека FPU. Как следствие, такое решение приводило к дополнительным затруднениям при совместном использовании FPU и MMX.

Инструкции MMX позволяли осуществлять однотипные арифметические операции сразу с несколькими целочисленными значениями, хранящимися в одном регистре, как это изображено на рисунке 1. Такая организация хранения значений в регистрах и памяти стала называться упакованными данными.

001-simd-principle.png
Рисунок 1. Принцип работы SIMD-инструкций.

После выполнения однотипных арифметических операций, результат записывается в один из регистров, после чего может быть сохранён в памяти.

Расширения MMX

По мере развития архитектуры x86 технология MMX подверглась не одному дополнительному расширению. При этом, разные производители реализовывали разный набор команд-расширений MMX. Так, например, в 1997 году компания Cyrix разработала 12 новых инструкций и реализовала их поддержку в процессорах 6x86 MX и MII, назвав их расширением EMMI (Extended Multi-Media Instructions). Все инструкции по умолчанию были отключены, но могли быть включены программно или средствами BIOS. Несмотря на полезность этих инструкций, они никогда не поддерживались конкурентами (Intel и AMD), и, как следствие, не были популярны у разработчиков. Поэтому сама Cyrix более не поддерживала эти инструкции после процессоров MII.

Также с появлением SSE были добавлены дополнительные инструкции для MMX, которые позволяли использовать данные, хранящиеся в регистрах MMX, в операциях SSE. Эти инструкции впервые появились в мае 1999 года в процессоре Intel Pentium III и, месяцем позже, в процессоре AMD Athlon, но без поддержки SSE. На сегодняшний день эти расширенные инструкции чаще всего упоминаются как общее подмножество расширений MMX, которые работают как на процессорах AMD Athlon, так и на совместимых с SSE процессорах Intel.

Прародительница SSE: технология 3DNow!
AMD, будучи основным конкурентом Intel в производстве x86-совместимых процессоров, периодически вносит полезные расширения и дополнения в эту архитектуру. Осознавая, что трёхмерная графика становится мейнстримом, компания AMD выпустила первое расширение для своих процессоров семейства K6-2, позволяющее ускорить расчёт трёхмерной графики, и назвала его технологией 3DNow!

Первая реализация 3DNow! включала в себя 21 новую инструкцию, при этом большая часть инструкций позволяла работать не с целочисленными данными, а с упакованными числами одинарной точности (float). Подобное расширение позволило ощутимо ускорить математику трёхмерных игр. Также было добавлено несколько целочисленных инструкций и операций предвыборки данных в кэш процессора.

Позже реализация похожих инструкций была внедрена компанией Intel в своих процессорах в виде расширения SSE.

Как и MMX, 3DNow! подверглась расширению, однако в разных местах эти расширения назывались по-разному: Extended 3DNow!, Enhanced 3DNow!, и даже 3DNow!+. Так или иначе, эти расширения были впервые реализованы в процессорах AMD Athlon. Эта технология расширила набор инструкций MMX дополнительными 17 инструкциями для ускорения обработки потокового мультимедиа-контента, а также добавила 5 новых инструкций для ускорения цифровой обработки сигналов.

Технология SSE
Увидев успех процессоров AMD K6-2 с новым набором инструкций 3DNow!, Intel в 1999 году реализовала новый набор похожих инструкций, не совместимых с 3DNow! Этот набор инструкций получил название SSE (Streaming SIMD Extension, потоковое SIMD-расширение) и стал доступен в линейке процессоров Pentium III.

Технология SSE предоставила 8 абсолютно новых 128-разрядных регистров данных XMM0-XMM7 и набор инструкций для арифметических операций с вещественными числами одинарной точности. Таким образом, в один XMM-регистр можно поместить до четырёх чисел с плавающей точкой и одновременно выполнить однотипные операции над ними.

AMD, немного опаздывая с реализацией SSE, впервые реализовала её полную поддержку только в линейке процессоров Athlon XP. Совокупность технологий SSE, 3DNow! и Enhanced 3DNow! AMD обозначила отдельной торговой маркой 3DNow! Professional.

Существенным же недостатком технологии 3DNow! по отношению к SSE являлось то, что 3DNow! по-прежнему оперировала 64-разрядными регистрами MM0-MM7, в то время как в SSE появилось восемь независимых новых регистров XMM0-XMM7, то есть если MMX и 3DNow! ещё можно было использовать совместно, то мешать арифметику с FPU было невозможно.

Поэтому появлением технологии SSE необходимость в расширении 3DNow! отпала, и в новых процессорах, начиная с линейки Bulldozer, AMD исключила поддержку этих инструкций, оставив только операции управления кэш-памятью.

Расширения SSE
После успеха SSE Intel поставила задачу расширить набор команд SSE и полностью заменить морально устаревшую технологию MMX, в результате чего начиная с 2001 года в процессорах Pentium 4 было встроено расширение SSE2.

Технология реализовывала дополнительные 144 инструкции к уже имевшимся 70 инструкциям SSE, а также вводила новые типы данных: упакованные байты, упакованные слова, упакованные двойные слова, упакованные учетверённые слова и упакованные вещественные числа двойной точности.

Однако все арифметические операции выполнялись в симметричном режиме и только вертикально: над всеми упакованными числами можно было выполнить одновременно операцию только одного типа, при этом в качестве операндов участвовали соответствующие друг другу ячейки разных регистров. Это вызывало определённые неудобства при работе с трёхмерной графикой и комплексными числами, заставляя использовать дополнительные операции перемещения данных и изменения знаков чисел на противоположные. Чтобы укоротить и ускорить код, написанный на SSE, в 2004 и 2006 годах соответственно были введены дополнительные расширения — SSE3 и SSSE3 (Supplementary SSE3, дополнительный SSE3).

Расширение SSE3 предоставило по большей части дополнительный набор инструкций для выполнения как горизонтальных, так и асимметричных арифметический операций над упакованными вещественными числами. SSSE3 же, наоборот, расширяла набор целочисленных инструкций.

Помимо этого, выходом на рынок первых 64-разрядных процессоров архитектуры x86_64 набор XMM-регистров удвоился, то есть для вычислений стали доступны регистры XMM0-XMM15, однако использовать все 16 регистров могли только 64-разрядные приложения под 64-разрядными операционными системами. 32-разрядные приложения по-прежнему довольствовались только восемью регистрами XMM.

Далее Intel выпустила дополнительный набор расширений SSE — SSE 4.1 и SSE 4.2. AMD же не стала их реализовывать, однако выпустила очень небольшой дополнительный набор инструкций, который назвала SSE 4a.

Также компания AMD планировала выпустить новый набор инструкций SSE5 в 2007 году, однако ограничилась выпуском всего лишь трёх отдельно обозначаемых наборов инструкций — XOP, FMA4 и F16C. Всё внимание Intel и AMD в тот момент уже было сконцентрировано на новой технологии — AVX.

Технология AVX

В марте 2008 года Intel реализует новое расширение в своих процессорах, начиная с микроархитектуры Sandy Bridge — AVX (Advanced Vector Extension, продвинутое векторное расширение). AMD реализует это расширение только в 2011 году начиная с процессоров линейки Bulldozer.

Расширение AVX стало новым витком развития SSE. Учитывая то, что все расширения SSE уже предоставляют достаточно большой набор команд, дальнейшая необходимость добавлять новые команды практически отсутствовала. С другой стороны, по-прежнему присутствовала потребность в ускорении потоковой обработки данных. Соответственно, остаются только два пути для увеличения вычислительной мощности системы — это увеличение объёма обрабатываемых данных за единицу времени и уменьшение количества инструкций, требуемых для реализации конечного алгоритма. В расширении AVX был сделан шаг по обоим направлениям: были введены новые 256-разрядные регистры YMM0-YMM15, младшая половина которых для совместимости с SSE отображается на регистры XMM0-XMM15, а сами SIMD-команды вместо двухоперанных стали трёхоперандными. За счёт двойного увеличения размера регистров гипотетически можно получить вдвое большую производительность при тех же затратах, однако первые реализации AVX, особенно на процессорах AMD архитектуры Bulldozer, показали, что при использовании этого расширения производительность не столько повышается, сколько, наоборот, понижается по сравнению с SSE. Что же касается количества операндов, то очевидно, что это сделано с целью уменьшения количества команд перемещения и перемешивания данных.

Помимо этого, в векторных командах SSE практически все команды, работающие с памятью, требовали строгого выравнивания хранимых в памяти данных по размеру регистров XMM. В AVX с целью упрощения написания программ эти требования были значительно ослаблены.

Что же теперь можно сказать об SSE? Будет ли эта технология жить ещё долгое время? Начнём с того, что реализация AVX выполнена так, что при одновременном использовании команд SSE и AVX может в разы просесть производительность системы в целом. С другой стороны, учитывая то, что в 64-разрядных процессорах архитектуры x86_64 с самого начала заявлена поддержка SSE и SSE2, в современных 64-разрядных операционных системах использование регистров XMM как аргументов при вызове функций стало частью ABI (Application Binary Interface, бинарный интерфейс приложений). Именно поэтому SSE будет ещё долго существовать в статусе legacy (наследие).

Сама же технология AVX как альтернатива SSE продолжает расширяться, имея уже своё продолжение — AVX2, представленное как альтернатива SSE2, а также FMA (Fused Multiply-Add, одновременное умножение и сложение), XOP (eXtended OPerations, расширенные операции) и т.д.

Продолжение AVX: AVX-512
Как уже было сказано чуть ранее, дальнейшее повышение производительности ядра процессора, в принципе, возможно только за счёт увеличения одновременно выполняемых операций над данными. Осуществляется это сейчас за счёт увеличения регистров, в которые можно поместить и обработать упакованные данные. Не успела технология AVX и её расширение AVX2 начать бодрое шествие по миру, как Intel в июле 2013 года анонсировала новую технологию — AVX512, которая стала доступна начиная с процессоров Xeon Phi и процессорах Core i7 и Core i9 на микроархитектуре Skylake-X.

Сама по себе AVX512 состоит из множества расширений, не все из которых должны быть реализованы в различных процессорах. Однако базовый набор AVX-512F (AVX-512 Foundation) обязателен к реализации во всех процессорах.

Фундаментальное нововведение в этой технологии заключается в добавлении 32 новых 512-разрядных регистров — ZMM0-ZMM31. Для совместимости с AVX и SSE также стали доступны регистры YMM0-YMM31 как младшие половины регистров ZMM, и, разумеется регистры XMM0-XMM31 как младшие половины регистров YMM. Помимо этого, также добавлены 8 новых регистров масок — K0-K7, размер которых зависит от архитектуры и может достигать размера 64 бит, которые могут быть использованы для условного выполнения команд.

AMD на октябрь 2017 пока не предложила реализацию AVX-512 ни в одном из своих процессоров на микроархитектурах ZEN и EPYC.

Заключение

Мы кратко рассмотрели историю развития технологий процессоров архитектуры x86 и уже имеем небольшое представление о них. Технологии MMX и 3DNow! уже давно являются устаревшими, и мы не будем их рассматривать в принципе, а больше сконцентрируемся на расширениях SSE и AVX. Ввиду того, что AVX-512 доступна далеко не на всех процессорах, возможно, мы рассмотрим этот набор расширений позже.

6 4.776
SadKo

SadKo
Владимир Садовников

Регистрация:
4 июн 2007
Публикаций:
8

Комментарии


      1. SadKo 4 мар 2018
        intrinsics - не панацея. Только труЪ асм спасёт нас.
      2. Мановар 2 мар 2018
      3. SadKo 20 фев 2018
        Это пока подготовка. Дальше пойдём раскачиваться. Готовлю следующую статью, как раз, частично покрывающую обозначенный вопрос.
      4. RET 19 фев 2018
        Ставлю +:drinks:
        НО для компиляторов бы флажки указать, + литературу для деванлёжей (эт я писал про тех кому бы взять пивка/кофе и на диванчике с ноутом за манами полежать) Intel Manual бы прикрутить.... Я юзаю от Каспера в крипте некоторые приемы с SSE
        А так +8+ пущай умничают
      5. al79 19 фев 2018
        :good:
      6. yashechka 17 фев 2018
        Амазинг.