Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Статьи / Практическое применение SSE расширения.

Практическое применение SSE расширения.

Автор:

Введение
Ассемблер, для чего он нам?
Непосредственно о примере
Оптимизация вызова функций
Мощь инструкции SHUFPS

Введение

Этой статьей я как обычно попытаюсь угодить обоим категориям читателей: начинающим, дав общее понимание 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 и некоторых других о которых уже никто наверное и не помнит.

[trtd]

MMX

Начиная с процессоров Pentium Pro (MMX) поддерживается MMX расширение от Intel. Включает в себя 8 (MM0-MM7) 64-битных регистров (Ты не знаешь что такое регистры? Ниже мы поговорим об этом освежив твою память, однако это ещё один знак того, что тебе следует поднять уровень знаний в рассматриваемой области если ты хочешь до конца понять статью) и позволяет производить целочисленные операции над парами нескольких новых типов данных:

- восемь упакованных байт
- четыре упакованных слова
- два двойных слова
- учетверенное слово

Другими словами, одной инструкцией MMX расширения программист может например сложить между собой два двойных слова. Физически никаких новый регистров не было добавлено. MM0-MM7 это мантиссы (младшие 64 бита) стека 80 битных FPU (floating point unit - сопроцессор) регистров.
[tr=code]На заметку:

В целом маркетинговый успех MMX расширения обошел в несколько раз его практическое применение - достаточно вспомнить те бури страстей и рекламного ажиотажа задолго до появления процессоров с поддержкой MMX.

[trtd]

3DNOW!

Расширение от AMD впервые появилось в процессорах K6-2. По сути, являясь подмножеством того же MMX расширения (использует те MMX регистры), основным его достоинством являлось то, что расширение позволяло выполнять одновременные операции над двумя парами float чисел (32 битные операнды). При этом, как утверждало AMD, без дополнительных затрат могли выполняться одновременно две операции такого рода за такт, что выводит 3DNOW! на уровень сравнимый по производительности с SSE расширением от Intel. Само по себе расширение было достаточно революционным, хотя и не смогло вывести эту модель на конкурентоспособный уровень с процессорами-аналогами от Intel, что связанно не с самим расширением конечно, а лишь с недостатками самого процессора. Того количества игр, под которые были выпущены патчи или в которых уже была поддержка 3DNOW! было явно недостаточно для того, чтобы полностью доказать пользователям и программистам его преимущества.  Начиная с процессоров Athlon (да здравствует здоровая конкуренция!) процессоры AMD поддерживают Enhanced 3DNOW! - более производительный блок и новый набор инструкций для 3DNOW! расширения. 3DNOW! (и его Enhanced реинкарнация) поддерживается лишь процессорами фирмы AMD.

SSE/SSE2

Виновник появления этой статьи, SSE расширение от Intel поддерживается как процессорами от Intel так и c некоторых пор некоторыми моделями от AMD. Аппаратно расширение включает в себя 8 (XMM0-XMM7) 128 битных регистров.
[tr=code]На заметку:

Архитектурно пайплайн SSE очень схож с гибким пайплайном шейдеров на современных GPU(видеокартах), не так ли?

[trtd]

SSE расширение позволяет одновременно выполнять операции над 4 парами float чисел. Начиная с процессоров Pentium 4 нам доступно расширение SSE2 - выполнение операций над двумя парами double (числа с плавающей точкой двойной точности - 64 бита) чисел. Кроме того, SSE2 расширяет MMX влияние, позволяя оперировать над целыми числами размерностью до 128-и бит.
[tr=code]На заметку:

Возвращаясь к игроделью - многие драйверы современных видеокарт уже имеют поддержку расширенных инструкций на своем вооружении. Зачем тогда нам его изучать? А как же наш с вами программный код?

[trtd]

Страницы: 1 2 3 4 5 Следующая »

26 августа 2003

#ASM, #SSE, #оптимизация

2001—2018 © GameDev.ru — Разработка игр