
Знаете ли вы, что Гомер Симпсон, глава семейства «The Simpsons», когда-то действительно официально работал на компанию Интел, причем довольно успешно? А именно, он рекламировал
Ну а под катом можно посмотреть завершение предыдущего поста с 21 любопытными фактами про Intel SIMD.
- Хотя первые 128-битные SSE инструкции появились очень давно — в Pentium III (да, был такой процессор в прошлом веке), но на самом деле за один процессорный такт загружалось и обрабатывалось только 64 бита данных. И только c началом выпуска процессоров на микроархитектуре Intel Core, SSE стали действительно 128-битными за такт, то есть производительность арифметических инструкций SSE-SSE3 фактически удвоилась. Маркетологи Intel радостно назвали это изменение "Advanced Digital Media Boost"
- MMX инструкции вопреки своему почтенному возрасту и сейчас «живее всех живых». Так, вплоть до SSSE3 все SSE наборы инструкций имеют не только 128 но и 64 битные версии. При этом, пользоваться MMX и 64 битными SSE без крайней необходимости не рекомендуется. Это может не ускорить, а замедлить код на современных CPU. Так, есть информация, что именно по этой причине (старый MMX код) тормозит проигрывание Adobe flash видео на Intel Atom.
Более того, 64 битные целочисленные SIMD инструкции используют MMX регистры, разделяющие свое состояние с x87 floating-point регистрами. Поэтому смешение в коде 64 битных целочисленных SIMD с x87 floating-point операциями требует вызова специальных функций для восстановления состояния регистров — обеспечения функциональной корректности. - SSSE3 — это не опечатка в написании SSE3, а Supplemental Streaming SIMD Extension 3 — набор векторных инструкций для работы с упакованными целыми, появившийся впервые в Intel Core и поддерживающийся также в Intel Atom. Набор из 16 инструкций содержит очень полезные операции перестановки байт в упакованных данных, работы со знаком, а также горизонтальное сложение-вычитание.
SSSE3 — это не столько добавочная производительность (горизонтальные операции над xmm-регистрами вообще не особенно быстрые), сколько удобство использования в комплекте с другими векторными инструкциями. Процессор с поддержкой SSSE3 — необходимое условие работы «Снежного Леопарда» — Mac OS X 10.6 - Как известно, производительность процессорных инструкций описывается двумя параметрами — latency и throughput (перевести на русский не рискну). Latency — это время выполнения инструкции (клок-тики), а throughput — количество инструкций, выполняемых в единицу времени. Причем, throughput -это совсем не (1/latency)! Дело в том, что инструкции обычно конвейеризуются, то есть следующая может начать исполняться еще до завершения выполнения предыдущей. Это — важная информация для оценки производительности.
Информация о latency и throughput Intel SIMD (как и остальных инструкций IA) находится в Intel® 64 and IA-32 Architectures Optimization Reference Manual. Но данные в этом документе — не по всем инструкциям и процессорам. Поэтому желающих сравнить latency и throughput SSE инструкций (к сожалению, только целочисленных) различных процессоров Intel, включая Atom, а также процессоров AMD, можно адресовать к этому документу, созданному независимым исследователем. - Среди SIMD инструкций для работы с floating-point встречаются и даже не прячутся SISD, то есть — инструкции не векторные, обрабатывающие только единичные данные. Их отличительный признак — буква s в конце названия. Например, rsqrtss, вычисляющая приближенное значение обратного квадратного корня с соответствующим интринсиком __m128 r = _mm_rsqrt_ss (__m128 a)
{r0 := recip(sqrt(a0)); r1 := a1; r2 := a2; r3 := a3}. Интересно, что даже несмотря на необходимость сначала загрузить данные в SSE регистр, а потом — выгрузить, исполь
зование этих инструкций во многих случаях предпочтительнее, чем соответствующих «обычных» х87 floating-point. Такие «векторные инструкции для невекторов» могут превосходить x87 и по latency и по throughput. - И еще про улучшение производительности. Денормализованные (очень маленькие) числа с плавающей точкой негативно влияют на производительность SSE вычислений точно также, как и обычных х87 инструкций. Поэтому, если в SIMD регистре используются не все элементы, то перед использованием регистр лучше занулить, чтобы не тратить значительное время на обработку «мусора», который весьма вероятно окажется малым числом. Еще один выход — установка специальных режимов процессора Flush-To-Zero (FTZ) и Denormals are Zero (DAZ). Желающим разобраться в подробностях (на английском) можно посмотреть сюда.
- Даже если производительность вашего приложения вас устраивает, но есть некоторые шансы, что приложение будут использовать на мобильном компьютере, то попробовать использовать SIMD стоит потому, что это поможет
сэкономить электроэнергиюувеличить время работы батареи компьютера, что должно очень понравиться пользователям. - Хотя в SSE и нет инструкций для векторных тригонометрических, экспоненциальных, логарифмических и прочих математических функций, но можно считать, что они там есть: в состав компилятора Intel входит библиотека Short Vector Math Library (SVML), которая реализует вышеупомянутые функции для чисел с плавающей точкой одинарной и двойной точностью в виде стандартных SSE-интринсик функций.
Первоначально библиотека была разработана для внутренних нужд компиляторной команды Intel — чтобы реализовать автовекториазацию циклов с мат. функциями, но оказалась такой полезной, что ее вынесли наружу. В компиляторе Intel последних версий использование SVML-интринсиков описано в Help, а для использования в компиляторе предыдущих версий или попыток прикрутить SVML к другому компилятору можно посмотреть сюда — software.intel.com/en-us/articles/how-to-implement-the-short-vector-math-library - Бинарные условные переходы в коде с самого появления SSE обычно не являются существенной помехой векторизации: вызывается векторная команда для проверки условия перехода, что дает на выходе маску, после чего векторно вычисляется результат работы обеих веток — и «true» и «false», и, наконец, берется AND маски проверки условия c результатом работы ветки «true» и по OR объединяется с выражением "(инвертированная маска проверки условия AND результат работы ветки «false»)". В SSE4.1 эта задача упрощается. Инструкции семейства blend позволяют напрямую смешивать два вектора по маске ( в этом случае — проверки условия), то есть исчезает потребность во всех AND и OR, что несомненно упрощает и ускоряет код.
Более того, в векторных инструкциях Larrabee все арифметические операции имеют свои маскированные версии, т.е. фактически могут выполняться (записывать соответствующий элемент в регистр назначения) только для элементов, удовлетворяющих условию, формирующему маску. Это — дальнейшее улучшение поддержки ветвлений.
А вот в наборе инструкций AVX, несмотря на поддержку трех-операндных инструкций, такой возможности нет. - Как известно, дальнейшее развитие SSE Intel не планирует. Вместо этого набора инструкций скоро должен появиться новый, 256-битный — AVX (Advanced Vector Extensions). Все подробности про AVX находятся на соответствующем сайте Intel. К этому можно добавить, что поддержка AVX планируется и в процессорах AMD, а первые инженерные образцы процессоров с AVX уже доступны внутри Intel.