Категория: Инструкции
SSE2 (англ. Streaming SIMD Extensions 2. потоковое SIMD-расширение процессора) — это SIMD (англ. Single Instruction, Multiple Data, Одна инструкция — множество данных) набор инструкций, разработанный Intel и впервые представленный в процессорах серии Pentium 4. SSE2 расширяет набор инструкций SSE с целью полностью вытеснить MMX. Набор SSE2 добавил 144 новые команды к SSE. в котором было только 70 команд.
ОсобенностиПоскольку SSE2 — расширение IA-32. процессоры, не поддерживающие IA-32, не поддерживают SSE2. Все известные процессоры x86-64 также поддерживают SSE2. [2] [3]
Кроме того, не поддерживают IA-32-совместимые процессоры, появившиеся до SSE2:
Этой статьей я как обычно попытаюсь угодить обоим категориям читателей: начинающим, дав общее понимание SIMD принципов, лежащих в основе таких расширений как MMX, SSE, SSE2, 3DNOW! и Enhanced 3DNOW!,более опытным - поделившись некоторыми на мой взгляд интересными фактами и примерами с которыми я столкнулся в процессе работы над темой. Однако основной упор будет сделан именно на SSE расширение и его практическом применении. Как всегда, вполне допустимо пропускать те абзацы, которые содержат информацию, в которой читатель достаточно хорошо ориентируется. Статья содержит большое количество материала, поэтому рекомендуется разбирать ее постепенно, разбивая на отдельные шаги.
Не стоит рассматривать статью как достаточно обширный и всеобъемлющий материал - это только толчок к дальнейшему исследованию и применению темы, развиваемой в статье.
В статье могут встречаться недочеты и ошибки, от которых никто не застрахован. Но думаю, что вместе, мы сможем решить все возникшие недоразумения и найти правильное решение проблемы.
Знания и инструментарий
Статья предполагает, что у читателя есть знания базовых принципов программирования на языке ассемблера и Си. В остальном, я полагаю, что после внимательного изучения данной статьи и примера, читатель будет в состоянии самостоятельно писать процедуры, используя SSE расширение. Тем не менее, поскольку статья представляет из себя лишь вводный экскурс, для более полного понимания проблемы, желательно изучение документации и справочников (как минимум презентаций и CBT (computer based training)) которые можно получить с сайта Intel (http://developer.intel.com ).
В качестве компилятора для примера был использован MS VC 6. Тем не менее, пример нормально компилируется в VC 7 (.Net). Да, именно – Си. Самое время удивиться, а лучше продолжим чтение статьи. В случае 6 версии на VC должны быть установлены SP 4 или 5 а также соответствующий для этого сервис пака процессор пак (Processor pack). Все это может быть получено с сайта Microsot (http://www.microsoft.com ). Так как в примере использованы специфичные для Microsoft директивы, другие компиляторы без корректировки исходного кода примера использовать скорее всего не удастся. Компиляция примера выполнялась с использованием одного единственного ключа /O2 - оптимизация по скорости исполнения. Кстати, именно с ключем /O2 в MS VC 6+SP 5 связана одна из ошибок компилятора, обнаруженная в процессе создания примера.
Для отладки приложения использовался встроенный в Visual Studio отладчик. Конечно же, ему далеко по функциональности до небезызвестного Soft Ice от NuMega, тем не менее, это достаточно качественная программа, кроме того, интегрированная в Visual Studio. В качестве неплохого бесплатного отладчика/дизассемблера могу порекомендовать OllyDbg (http://home.t-online.de/home/Ollydbg ), который так же позволяет отлаживать приложения, использующие SSE расширение (позволяет просматривать содержимое XMM регистров и дизассемблирует инструкции SSE). На момент начала написания статьи на сайте была доступна версия 1.08b.
SIMD расширения - что это?
SIMD (single instruction multiple data) - общий принцип лежащий в основе всех перечисленных до этого расширений - одной инструкцией выполняется действие сразу над некоторой группой однотипных операндов. Тем самым главные предметы изучения расширения - его архитектура, а именно представление данных и дополнительные наборы команд.
[tr=code]На заметку:
Все информация и определения справедливы для архитектуры IA-32 и совместимых с ней процессоров - то есть, грубо говоря, для "32-битных" процессоров Intel, AMD и некоторых других о которых уже никто наверное и не помнит.
Начиная с процессоров Pentium Pro (MMX) поддерживается MMX расширение от Intel. Включает в себя 8 (MM0-MM7) 64-битных регистров (Ты не знаешь что такое регистры? Ниже мы поговорим об этом освежив твою память, однако это ещё один знак того, что тебе следует поднять уровень знаний в рассматриваемой области если ты хочешь до конца понять статью) и позволяет производить целочисленные операции над парами нескольких новых типов данных:
- восемь упакованных байт
- четыре упакованных слова
- два двойных слова
- учетверенное слово
Другими словами, одной инструкцией MMX расширения программист может например сложить между собой два двойных слова. Физически никаких новый регистров не было добавлено. MM0-MM7 это мантиссы (младшие 64 бита) стека 80 битных FPU (floating point unit - сопроцессор) регистров.
[tr=code]На заметку:
В целом маркетинговый успех MMX расширения обошел в несколько раз его практическое применение - достаточно вспомнить те бури страстей и рекламного ажиотажа задолго до появления процессоров с поддержкой MMX.
Расширение от AMD впервые появилось в процессорах K6-2. По сути, являясь подмножеством того же MMX расширения (использует те MMX регистры), основным его достоинством являлось то, что расширение позволяло выполнять одновременные операции над двумя парами float чисел (32 битные операнды). При этом, как утверждало AMD, без дополнительных затрат могли выполняться одновременно две операции такого рода за такт, что выводит 3DNOW! на уровень сравнимый по производительности с SSE расширением от Intel. Само по себе расширение было достаточно революционным, хотя и не смогло вывести эту модель на конкурентоспособный уровень с процессорами-аналогами от Intel, что связанно не с самим расширением конечно, а лишь с недостатками самого процессора. Того количества игр, под которые были выпущены патчи или в которых уже была поддержка 3DNOW! было явно недостаточно для того, чтобы полностью доказать пользователям и программистам его преимущества. Начиная с процессоров Athlon (да здравствует здоровая конкуренция!) процессоры AMD поддерживают Enhanced 3DNOW! - более производительный блок и новый набор инструкций для 3DNOW! расширения. 3DNOW! (и его Enhanced реинкарнация) поддерживается лишь процессорами фирмы AMD.
Виновник появления этой статьи, SSE расширение от Intel поддерживается как процессорами от Intel так и c некоторых пор некоторыми моделями от AMD. Аппаратно расширение включает в себя 8 (XMM0-XMM7) 128 битных регистров.
[tr=code]На заметку:
Архитектурно пайплайн SSE очень схож с гибким пайплайном шейдеров на современных GPU(видеокартах), не так ли?
SSE расширение позволяет одновременно выполнять операции над 4 парами float чисел. Начиная с процессоров Pentium 4 нам доступно расширение SSE2 - выполнение операций над двумя парами double (числа с плавающей точкой двойной точности - 64 бита) чисел. Кроме того, SSE2 расширяет MMX влияние, позволяя оперировать над целыми числами размерностью до 128-и бит.
[tr=code]На заметку:
Возвращаясь к игроделью - многие драйверы современных видеокарт уже имеют поддержку расширенных инструкций на своем вооружении. Зачем тогда нам его изучать? А как же наш с вами программный код?
26 августа 2003
SSE2 (Streaming SIMD Extensions 2 ) - потоковые SIMD-расширения. SIMD расшифровывается как «Single Instruction, Multiple Data» (единая инструкция — множественные данные). Данная технология представляет собой пакет инструкций, расширяющий первоначальный набор SSE (первая версия). Основной целью данного пакета является полное вытеснение MMX. В SSE2 имеются 144 новые команды, в дополнение к первой версии SSE, в которой было заложено лишь 70.
Создателем данной технологии является компания Intel. Впервые она была реализована в процессорах Pentium 4.
Отличительные чертыООО "Альтербит", 197183, Санкт-Петербург, Комендантский проспект, 2 схема проезда
Телефон: (812) 309-2602 ← Звони если хочешь купить сервер, схд, компьютер
Команды SSE делятся на 4 категории:
Одна SIMD-команда с плавающей запятой может обрабатывать одновременно четыре 32-разрядных числа одинарной точности с плавающей запятой (называемых SPFP-элементами данных).
SIMD-команды для работы с SPFP-данными используют восемь новых 128-разрядных регистров - XMM-регистров. Команды обращаются к XMM-регистрам по именам: XMM0, XMM1. XMM7.
Каждое 32-разрядное число с плавающей запятой имеет 1 знаковый бит, 8 битов порядка и 23 бита мантиссы, что соответствует стандарту IEEE-754 на формат представления чисел одинарной точности с плавающей запятой.
SIMD-команды поддерживают два типа операций над упакованными данными с плавающей запятой - параллельные и скалярные.
Параллельные операции, как правило, действуют одновременно на все четыре 32-разрядных элемента данных в каждом из 128-разрядных операндов. В именах команд, выполняющих параллельные операции, присутствует суффикс PS.
Скалярные операции действуют на младшие (занимающие разряды 0-31) элементы данных двух операндов. Остальные три элемента данных в выходном операнде не изменяются (исключение составляет команда скалярного копирования MOVSS). В имени команд, выполняющих скалярные операции, присутствует суффикс SS.
SSE-команды имеют следующий синтаксис: instruction [dest, src]
Здесь instruction - имя команды, dest обозначает выходной операнд, src - входной операнд.
Доступны следующие SSE-команды (обозначения: xmm - XMM-регистр; mm - MMX-регистр; m - память; imm - 8-битный непосредственный операнд; ir32 - целочисленный регистр):
команда попарно складывает упакованные элементы данных и записывает суммы в соответствующие элементы XMM-регистра.
команда вычитает элементы входного операнда из элементов первого регистра и записывает полученные разности в соответствующие элементы первого регистра.
команда попарно перемножает упакованные элементы. Произведения записываются в соответствующие элементы XMM-регистра.
команда делит элементы первого операнда на соответствующие элементы входного операнда. Результаты деления записываются в XMM-регистр на место делимых.
команда складывает младшие элементы данных и записывает результат в младший элемент XMM-регистра. Остальные элементы выходного операнда не меняются.
команда вычитает младший элемент входного операнда из соответствующего элемента выходного операнда и записывает разность в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются.
команда перемножает младшие элементы данных и записывает результат в младший элемент XMM-регистра. Остальные элементы выходного операнда не меняются.
команда делит младший элемент выходного операнда на соответствующий элемент входного операнда и записывает результат в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются.
SQRTPS xmm, xmm/m
команда вычисляет квадратный корень для каждого из четырех чисел во входном операнде и записывает результаты в выходной операнд.
SQRTSS xmm, xmm/m
команда вычисляет квадратный корень из младшего элемента входного операнда и записывает результат в младший элемент в выходной операнд. Остальные элементы выходного операнда не меняются.
команда определяет приближенное обратное значение для каждого из четырех чисел входного операнда и записывает результаты в XMM-регистр.
RSQRTPS xmm, xmm/m
команда вычисляет приближенное обратное значение для квадратного корня из каждого из четырех чисел входного операнда и записывает результаты в XMM-регистр.
команда определяет приближенное обратное значение для числа, находящегося в младшем элементе входного операнда и записывает результат в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются.
RSQRTSS xmm, xmm/m
команда вычисляет приближенное обратное значение для квадратного корня из числа. находящегося в младшем элементе входного операнда и записывает результат в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются.
команда попарно сравнивает элементы данных и записывает большее значение из каждой пары в соответствующий элемент выходного операнда.
команда попарно сравнивает элементы данных и записывает меньшие значения из каждой пары в соответствующие элементы выходного операнда.
команда сравнивает младшие элементы данных и записывает большее из значений в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются.
команда сравнивает младшие элементы данных и записывает меньшее из значений в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются.
SHUFPS xmm, xmm/m, imm
команда с непосредственным операндом выбирает из первого операнда два элемента с 2-битными номерами из непосредственного операнда (непосредственный операнд делится справа налево на 4 2-битовых числа) и записывает их в младшие элементы выходного операнда. Из второго операнда выбираются два элемента со следующими 2-битными номерами и записываются в старшие элементы выходного операнда. Перестановка всех элементов происходит одновременно.
UNPCKHPS xmm, xmm/m
команда копирует третьи элементы входного и выходного операндов в соседние младшие элементы выходного операнда, а четвертые элементы входного и выходного операндов - соответственно, в старшие элементы выходного операнда. Распаковка элементов выполняется одновременно.
UNPCKLPS xmm, xmm/m
команда копирует первые элементы входного и выходного операндов в соседние младшие элементы выходного операнда, а вторые элементы входного и выходного операндов - соответственно, в старшие элементы этого операнда. Распаковка элементов выполняется одновременно.
Оставить комментарий КомментарииОписание и инструкции
Неплохой сюрприз для пользователей с давно устаревшей конфигурацией компьютеров, для тех, кто тяжело вздыхает при выходе очередной игры и не имеет возможности ее запустить!
Вашему вниманию предлагается, так называемое "лекарство" для процессоров, не поддерживающих SSE2-инструкции (например Sempron 2600+ и т.п.). В архиве три dll-библиотеки, которые помогают запустить некоторые игры, в частности использующие движок Unreal Engine 3. Из проверенных мною лично, в данный список входят такие игры:
Borderlands
Saw: The Video Game
Alien Breed: Impact (2010)
Подобных игр вполне может быть больше. Дело экспериментов ;)
1) Данное "лекарство" запускает игры, имеющие в корневом каталоге папку Binaries и библиотеки на основе nvtt.dll (характерно для большинства игр на движке Unreal Engine 3).
2) Устанавливаются обычным копированием в папку Binaries с заменой файлов.
Пример. \Games\Borderlands\Binaries
А че оно графику упрощает чтоли?
Огромное спасибо, хотя качал не отсюда :)
Вы уверены что хотите удалить этот комментарий?
Copyright © 2001-2016 Все права защищены законодательством РФ. Использование материалов сайта возможно только с прямой ссылкой на источник.