Руководства, Инструкции, Бланки

что такое набор инструкций Sse2 img-1

что такое набор инструкций Sse2

Категория: Инструкции

Описание

SSE2 - это

SSE2 (англ.   Streaming SIMD Extensions 2. потоковое SIMD-расширение процессора) — это SIMD (англ. Single Instruction, Multiple Data, Одна инструкция — множество данных) набор инструкций, разработанный Intel и впервые представленный в процессорах серии Pentium 4. SSE2 расширяет набор инструкций SSE с целью полностью вытеснить MMX. Набор SSE2 добавил 144 новые команды к SSE, в котором было только 70 команд.

Особенности
  • SSE2 использует восемь 128-битных регистров (xmm0 до xmm7), включённых в архитектуру x86 с вводом расширения SSE. каждый из которых трактуется как 2 последовательных значения с плавающей точкой двойной точности.
  • SSE2 включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных.
  • SSE2 содержит инструкции для потоковой обработки целочисленных данных в тех же 128-битных xmm регистрах, что делает это расширение более предпочтительным для целочисленных вычислений, нежели использование набора инструкций MMX. появившегося гораздо раньше.
  • SSE2 включает в себя две части – продолжение SSE и продолжение MMX.
    • Продолжение SSE работает с вещественными числами.
    • продолжение MMX работает с целыми. В SSE2 регистры по сравнению с MMX удвоились (64 бита -> 128 битов). Т.к. скорость выполнения инструкций не изменилась, при оптимизации под SSE2 программа получает двукратный прирост производительности. Если программа уже была оптимизирована под MMX, то оптимизация под SSE2 даётся сравнительно легко в силу сходности системы команд.
  • SSE2 включает в себя ряд команд управления кэшем, предназначенных для минимизации загрязнения кэша при обработке неопределенных потоков информации.
  • SSE2 включает в себя сложные дополнения к командам преобразования чисел
Категории:
  • Инструкции x86
  • Расширения архитектуры x86

Wikimedia Foundation. 2010 .

Смотреть что такое "SSE2" в других словарях:

SSE2 — SSE2, Streaming SIMD Extensions 2, is one of the IA 32 SIMD (Single Instruction, Multiple Data) instruction sets. SSE2 was first introduced by Intel with the initial version of the Pentium 4 in 2001. It extends the earlier SSE instruction set,… … Wikipedia

SSE2 — (Streaming SIMD Extensions 2) ist eine x86 Befehlssatzerweiterung, die Intel mit dem Pentium 4 einfuhrte. Die mit SSE eingefuhrten 128 Bit Register konnen in SSE2 auch mit MMX Operationen verwendet werden. SSE2 ermoglicht die Verarbeitung von… … Deutsch Wikipedia

SSE2 — Saltar a navegacion, busqueda SSE2 es el acronimo de Streaming Single Instruction Multiple Data Extensions 2 es uno de los conjuntos de instrucciones de la arquitectura IA 32 SIMD. Fue utilizada por primera vez en la primera version del Pentium 4 … Wikipedia Espanol

SSE2 — Streaming SIMD Extension 2 Streaming SIMD Extension 2, generalement abrege SSE2. Elle est composee de 144 instructions et fait son apparition avec le Pentium 4 d Intel. Elle gere des registres 128 bits pour les entiers et les flottants… … Wikipedia en Francais

SSE2 — Streaming Single Instruction, Multiple Data Extensions 2 (Computing) … Abbreviations dictionary

SSE 2 — SSE2 (Streaming SIMD Extensions 2) ist eine x86 Befehlssatzerweiterung, die Intel mit dem Pentium 4 einfuhrte. Die mit SSE eingefuhrten 128 Bit Register konnen in SSE2 auch mit MMX Operationen verwendet werden. SSE2 ermoglicht die Verarbeitung… … Deutsch Wikipedia

Streaming SIMD Extensions 2 — SSE2 (Streaming SIMD Extensions 2) ist eine x86 Befehlssatzerweiterung, die Intel mit dem Intel Pentium 4 einfuhrte. Die mit SSE eingefuhrten 128 Bit Register konnen in SSE2 auch mit MMX Operationen verwendet werden. SSE2 ermoglicht die… … Deutsch Wikipedia

Streaming SIMD Extensions 2 — SSE2 (англ. Streaming SIMD Extensions 2, потоковое SIMD расширение процессора) это Pentium 4. SSE2 использует восемь 128 битных регистров (xmm0 до xmm7), включённых в архитектуру x86 с вводом расширения SSE, каждый из которых трактуется как 2… … Википедия

Comparison of AMD processors — This list is incomplete; you can help by expanding it. Colors of the processor code names indicate same core. Archi tecture Family Code Name Model Group Speed (MHz) Socket Process (nm) Cores FSB/HT (MHz) Cache (KiB) Memory Controller … Wikipedia

List of AMD Athlon 64 microprocessors — This list is incomplete; you can help by expanding it. The Athlon 64 microprocessor from AMD is an eighth generation CPU targeted at the consumer market. Contents 1 Single core desktop processors 1.1 Athlon 64 … Wikipedia

  • Программирование на Visual Fortran. С. Д. Алгазин, В. В. Кондратьев. На русском языке имеется несколько книг по современному Fortran [1-4]. Книги [1, 4] посвящены описанию стандартов Fortran 95 и 90. Книга [2] включает кроме этих стандартов описаниеэлементов… Подробнее Купить за 320 руб

Другие статьи

Prescott New Instructions (SSE3): обзор новых SIMD расширений с точки зрения разработки и оптимизации программного обеспечения

Редакция сайта iXBT.com обращается к вам с просьбой отключить блокировку рекламы на нашем сайте.

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

Мы никогда не размещали навязчивую рекламу и не просили вас кликать по баннерам. Вашей посильной помощью сайту может быть отсутствие блокировки рекламы.

Спасибо вам за поддержку!

Prescott New Instructions (SSE3): обзор новых SIMD расширений с точки зрения разработки и оптимизации программного обеспечения С выпуском нового 90-нм процессора Pentium 4 под кодовым названием Prescott. анонсированного Intel 2 февраля 2004 года архитектура Intel NetBurst приобрела ряд нововведений и дополнений, позволяющих по праву назвать процессор Prescott новым поколением процессоров семейства IA-32. Ключевыми моментами улучшенной архитектуры NetBurst, согласно Intel, являются следующие:
  • Поддержка технологии Hyper-Threading (которая, судя по всему, не претерпела каких-либо изменений);
  • Углубленный конвейер, позволяющий достичь еще более высоких частот;
  • Высокая частота системной шины (800 MHz, появившаяся еще со времен последних моделей Northwood);
  • Увеличенный вдвое объем первого и второго уровней кэша, а также большее количество буферов сохранения (store) и объединения записи (write-combining);
  • Поддержка новых SIMD расширений под кодовым названием Prescott New Instructions (официально — SSE3).
Ряд изменений коснулся информации, выдаваемой инструкцией CPUID (в то время как поведение самой инструкции не изменилось, за исключением большего количества выдаваемых значений). Специфичными для Prescott являются следующие значения CPUID:
  • Prescott New Instructions (SSE3): Extended Features, бит 0;
  • Debug Trace Store Qualification: Extended Features, бит 4;
  • Улучшенная технология Intel SpeedStep (использующая MSR процессора): Extended Features, бит 7;
  • Поддержка инструкций MONITOR/MWAIT: Extended Features, бит 3.

Ключевым элементом новой, улучшенной архитектуры Prescott является, конечно же, поддержка ряда новых инструкций, получивших кодовое название Prescott New Instructions (PNI) и, далее, официальное — SSE3. Это набор из 13 новых инструкций, призванных улучшить производительность процессора в ряде операций потоковой обработки данных. Дополнения коснулись набора команд SSE (Streaming SIMD Extensions), работающих с четырехкомпонентными векторами с одинарной точностью, SSE2 (Streaming SIMD Extensions 2), работающих с двумерными векторами чисел двойной точности, а также x87 FPU. Новая технология является полностью совместимой с существующим программным обеспечением (ПО), разработанным под архитектуру IA-32. В связи с этим гарантируется, что имеющееся ПО будет работать корректно без необходимости какой-либо модификации и на новых процессорах, поддерживающих расширения SSE3. Более того, использование расширений SSE3 не требует какой-либо дополнительной поддержки со стороны операционной системы, связанной с сохранением и восстановлением состояния процессора при переключении контекста, за исключением той, которая является необходимой (и уже имеется) для поддержки потоковых расширений SSE/SSE2.

Краткий экскурс в SSE3

Приступим к рассмотрению этого нового набора из 13 инструкций. Его можно разбить на следующие подгруппы:

1. Преобразование чисел с плавающей точкой (x87) в целые числа

В эту подгруппу входит одна-единственная инструкция из всего набора Prescott New Instructions (SSE3), которая работает на уровне x87 FPU.

FISTTP (сохранение целочисленного значения с освобождением элемента стека x87-FP с округлением в сторону нуля). Ее поведение аналогично поведению стандартной IA-32 инструкции FISTP, но важным отличием является использование округления в сторону нуля (известного как truncate или chop) вне зависимости от того, какой способ округления выбран в данный момент в контрольном слове FPU.

2. Дублирование данных

Эта подгруппа состоит из трех инструкций, первые две из которых можно считать дополнением/расширением набора инструкций SSE, а последнюю можно отнести к набору SSE2.

MOVSLDUP — загрузка 128-битного значения из исходного операнда (памяти или XMM-регистра) в операнд назначения с дублированием первого и третьего 32-битных элементов: Операнд A (128 бит, 4 элемента): a3 | a2 | a1 | a0
Операнд B (128 бит, 4 элемента): b3 | b2 | b1 | b0

MOVSLDUP A, B
Результат (операнд A): b2 | b2 | b0 | b0

MOVSHDUP — загрузка 128-битного значения из исходного операнда в операнд назначения с дублированием второго и четвертого 32-битных элементов: Операнд A (128 бит, 4 элемента): a3 | a2 | a1 | a0
Операнд B (128 бит, 4 элемента): b3 | b2 | b1 | b0

MOVSHDUP A, B
Результат (операнд A): b3 | b3 | b1 | b1

MOVDDUP — загрузка 64-битного значения из памяти или исходного регистра (биты [63-0]) с дублированием в обоих нижней и верхней частях регистра назначения: Операнд A (128 бит, 2 элемента): a1 | a0
Операнд B (64 бита, 1 элемент): b0

MOVDDUP A, B
Результат (операнд A): b0 | b0

3. Загрузка невыровненных переменных

Данную подгруппу представляет инструкция LDDQU. Это операция особой загрузки невыровненного 128-битного значения из памяти, исключающая возможность «разрыва» (пересечения границы) строки кэша. В случае, если адрес загружаемого элемента выровнен по 16-байтной границе, LDDQU осуществляет обычную загрузку запрашиваемого 16-байтного значения (т.е. по сути, ведет себя аналогично инструкциям MOVAPS/MOVAPD/MOVDQA из стандартного набора SSE/SSE2). В противном случае LDDQU загружает целых 32 байта, начиная с выровненного адреса (ниже запрашиваемого) с последующим извлечением требуемых 16 байт. Использование этой инструкции позволяет достичь значительного увеличения производительности при загрузке невыровненных 128-битных значений из памяти, по сравнению со стандартными инструкциями MOVUPS/MOVUPD/MOVDQU SIMD-расширений SSE/SSE2.

4. Одновременное сложение/вычитание

В эту подгруппу входят две новые инструкции, первая из которых работает с четырехкомпонентными векторами чисел одинарной точности (SSE), вторая — с двухкомпонентными векторами чисел двойной точности (SSE2).

ADDSUBPS — сложение второго и четвертого элементов с одинарной точностью с одновременным вычитанием первого и третьего элементов. Эта инструкция полезна при работе с комплексными числами в случае использования соответствующего типа переменных. Операнд A (128 бит, 4 элемента): a3 | a2 | a1 | a0
Операнд B (128 бит, 4 элемента): b3 | b2 | b1 | b0

ADDSUBPS A, B
Результат (операнд A): a3+b3 | a2-b2 | a1+b1 | a0-b0

ADDSUBPD — ведет себя аналогично, но работает с числами двойной точности (двухэлементными операндами SSE2): Операнд A (128 бит, 2 элемента): a1 | a0
Операнд B (128 бит, 2 элемента): b1 | b0

ADDSUBPD A, B
Результат (операнд A): a1+b1 | a0-b0

5. Горизонтальное сложение/вычитание

Пятая подгруппа представлена четырьмя командами, осуществляющими принципиально новые операции для SIMD расширений семейства SSE/SSE2. Первые две из них работают с четырехкомпонентными векторами с одинарной точностью, остальные — с двухкомпонентными векторами с двойной точностью.

HADDPS — осуществляет горизонтальное сложение элементов с одинарной точностью. Первый элемент, записываемый в операнд назначения, является суммой первого и второго элементов первого (исходного) операнда; второй элемент — суммой третьего и четвертого элементов первого операнда; третий элемент — суммой первого и второго элементов второго операнда (операнда назначения) и, наконец, четвертый элемент — суммой третьего и четвертого элементов второго операнда. Для наглядности изобразим это, как и прежде, в виде схемы: Операнд A (128 бит, 4 элемента): a3 | a2 | a1 | a0
Операнд B (128 бит, 4 элемента): b3 | b2 | b1 | b0

HADDPS A, B
Результат (операнд A): b2+b3 | b0+b1 | a2+a3 | a0+a1

HSUBPS — осуществляет горизонтальное вычитание элементов с одинарной точностью. Ее поведение аналогично HADDPS, единственным отличием является использование операции вычитания вместо сложения: Операнд A (128 бит, 4 элемента): a3 | a2 | a1 | a0
Операнд B (128 бит, 4 элемента): b3 | b2 | b1 | b0

HSUBPS A, B
Результат (операнд A): b2-b3 | b0-b1 | a2-a3 | a0-a1

HADDPD — осуществляет горизонтальное сложение элементов с двойной точностью. Первым (нижним) результирующим элементом является сумма нижней и верхней частей первого (исходного) операнда, вторым (верхним) — сумма нижней и верхней половин второго операнда (операнда назначения): Операнд A (128 бит, 2 элемента): a1 | a0
Операнд B (128 бит, 2 элемента): b1 | b0

HADDPD A, B
Результат (операнд A): b0+b1 | a0+a1

HSUBPD — осуществляет горизонтальное вычитание элементов с двойной точностью. Эта инструкция аналогична HADDPS, но использует операцию вычитания вместо сложения: Операнд A (128 бит, 2 элемента): a1 | a0
Операнд B (128 бит, 2 элемента): b1 | b0

HSUBPD A, B
Результат (операнд A): b0-b1 | a0-a1

6. Синхронизация потоков

В последнюю подгруппу можно включить две инструкции, нацеленные на использование в системном программировании с целью предоставления возможности более эффективной синхронизации потоков, в частности, при использовании технологии Hyper-Threading. Ожидается, что эти инструкции будут использоваться при разработке операционных систем и драйверов устройств с целью улучшения производительности процессора и снижения энергопотребления последнего, когда он находится в режиме «пустого» ожидания (по всей видимости, наряду с введенной в расширения SSE2 инструкцией PAUSE).

MONITOR — устанавливает диапазон адресов памяти (обычно используется одна строка кэша), по которому будет осуществляться отслеживание записей по стандартному протоколу write-back.

MWAIT — вводит логический процессор в оптимизированный режим (режим низкого энергопотребления) при ожидании записей по протоколу write-back по пространству адресов, заданных инструкцией MONITOR. С архитектурной точки зрения ее поведение идентично NOP. Выход из оптимизированного состояния осуществляется в случае записи по установленному пространству адресов, а также при срабатывании любого прерывания или исключения.

Использование SSE3 в разработке и оптимизации ПО

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

1. Расчетные задачи, использующие x87 FPU

В задачах такого типа (каковыми является подавляющее большинство профессионального расчетного ПО) может оказаться весьма полезной инструкция быстрого преобразования вещественных чисел в целые (FISTTP), единственная из всего набора SSE3, работающая на уровне x87 FPU (все остальные, как нетрудно видеть, задействуют исполнительные блоки SIMD — они работают с типами данных, присущими SSE или SSE2).

Известно, что правильным с точки зрения стандарта C/C++/Fortran способом преобразования переменных типа float (чисел с плавающей точкой) в переменные типа int (целые числа) в операциях вида: float f;
int i = (int)f;

является округление в сторону нуля (truncate). В то же время, выбранным по умолчанию способом округления x87 FPU является округление в сторону ближайшего точного числа (round-to-nearest). Необходимость существования операции округления, вообще говоря, связана вовсе не с преобразованием вещественных чисел в целые, а с конечным способом представления бесконечного множества чисел с плавающей точкой (32 бита для чисел одинарной точности, 64 бита для чисел двойной точности, 80 бит для переменных с расширенной точностью, а также для внутреннего представления данных в x87 FPU). При этом наиболее точное конечное представление чисел с плавающей точкой достигается именно при таком способе округления.

В связи с этим, приведенный выше C-код в процессорах IA-32 нынешнего поколения будет преобразован любым компилятором, соблюдающим требования стандарта ANSI C, в ассемблерный код примерно следующего вида:

Легко заметить, что такая процедура, довольно часто встречающаяся на практике, содержит в себе три явно лишние операции, связанных с сохранением, загрузкой и восстановлением значения контрольного слова x87 FPU. Заметим, что время исполнения каждой из последних измеряется как минимум несколькими тактами процессора (в ряде случаев — десятью и более, в зависимости от конкретной реализации микроархитектуры процессора). С точки зрения оптимизации кода, в рамках существующий архитектуры IA-32 можно наметить два выхода из этой ситуации.

Первый — это сохранить значение контрольного слова FPU, загрузить новое значение контрольного слова FPU с нужным способом округления, после чего совершить сразу целый ряд преобразований, и, наконец, восстановить исходное состояние FPU. Именно такой способ рекомендуется в ряде документации по оптимизации кода для процессоров x86 (в частности, для AMD Athlon). Трудность такого подхода заключается в том, что, во-первых, необходима реорганизация кода, позволяющая сгруппировать, по возможности, все преобразования значений float в int. Во-вторых, саму процедуру преобразования придется писать в виде ассемблерной вставки.

Второй подход — это использовать доступные SIMD-расширения, вроде SSE или 3DNow! В первом случае для этой цели подходят команды CVTSS2SI и CVTPS2PI (последняя позволяет осуществлять два преобразования одновременно, но использует MMX-регистр, что, в свою очередь, приводит к необходимости переключения режимов FPU/MMX, которое является относительно «бесплатным» далеко не для всех процессоров). Во втором случае преобразование пары вещественных значений в целочисленные можно осуществлять с помощью команды PF2ID. Здесь вновь присутствуют трудности, присущие, кстати, набору 3DNow! в целом — использование MMX-регистров, и, как следствие, необходимость переключения режимов работы процессора (либо очистки, либо сохранения/восстановления содержимого FPU-стека и MMX-регистров). В качестве наиболее простой процедуры преобразования можно придумать следующую, оформленную в виде ассемблерной вставки:

Подобный код вовсе не обязательно писать вручную, его вполне умеют генерировать компиляторы, понимающие SSE (при включении соответствующего ключа оптимизации, например, -QxK для Intel C++ Compiler 7.0). Таким образом, второй подход при наличии должной поддержки со стороны процессора, по идее, должен давать существенный выигрыш в производительности при преобразовании указанных типов данных. Более того, использование команд SSE, в отличие от MMX/3DNow. не требует дополнительных затрат, связанных с переключением режима работы процессора.

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

К сожалению, по непонятным пока что причинам такой код не генерируется автоматически компилятором, понимающим SSE3 (каковым является Intel C++ Compiler 8.0 при использовании ключа оптимизации -QxP). Вместо этого создается аналог рассмотренного выше SSE-кода, использующего команду CVTTSS2SI. Тем не менее, время исполнения SSE3-кода должно быть вполне сопоставимым, если даже не меньшим, чем вышеупомянутого SSE-кода. Самое время проверить это утверждение на практике.

Время исполнения, тактов *

4.6. Четыре скалярных произведения, SSE/SSE3

Что же мы видим? Одно скалярное произведение, использующее расширения SSE/SSE3 далеко не на полную мощность, не то что не выигрывает, но даже несколько проигрывает при использовании новой инструкции HADDPS из набора SSE3. И это несмотря на то, что мы сократили объем кода и устранили необходимость использования дополнительных XMM-регистров. Тем не менее, поскольку увеличение времени исполнения такого кода (4.4) является сравнительно малым, использование SSE3 в этом случае (вычисление одного скалярного произведения трехкомпонентных векторов) можно считать оправданным, хотя бы по причине того, что в распоряжении компилятора, ну или непосредственно разработчика, остается большее количество доступных XMM-регистров.

Но давайте теперь посмотрим, что же получается в случае одновременного вычисления сразу четырех скалярных произведений? В этом случае выигрыш в скорости при использовании SSE3 оказывается весьма и весьма значительным, SSE3-код опережает свой SSE-аналог почти на 84%. Что еще раз доказывает, что использование сразу всех четырех элементов XMM-регистра является оптимальным режимом работы SIMD расширений Intel, и SSE3 здесь не является исключением. В этой связи ручная оптимизация под SSE3 может оказаться намного более эффективной, нежели поручение этой же работы оптимизирующему компилятору.

В заключение, представим данные нашего тестирования новых расширений SSE3 в виде одной таблицы. Из нее видно, что в целом расширения SSE3 можно считать удачными, а их использование в разработке и оптимизации ПО — оправданным, поскольку в большинстве случаев оно позволяет получить серьезный выигрыш в производительности.

Выигрыш в скорости, раз, по сравнению с традиционным FPU/SIMD-кодом

Преобразование данных (float to int)

Сравнение с конкурентными решениями С выпуском процессоров архитектуры AMD64, AMD наконец-то ввела полный набор SIMD-расширений в свои процессоры семейства K8 (Opteron, Athlon 64, Athlon 64 FX). SIMD-расширения AMD64 включают в себя как традиционно присущие процессорам AMD наборы 3DNow! (начиная с K6-2) и Extended 3DNow! (начиная с Athlon), так и расширения Intel SSE/SSE2. Тем не менее, с точки зрения оптимизации ПО такое решение не многим лучше реализованного в обычных Pentium 4 (только SSE/SSE2). А связано это с тем, что подавляющее большинство компиляторов по-прежнему не умеет автоматически генерировать код, использующий расширения 3DNow!/Extended 3DNow! Единственным известным нам примером компилятора, умеющего генерировать 3DNow! код, является VectorC. который, однако, до сих пор находится в стадии бета-тестирования и все еще не имеет полноценной поддержки C++ кода.

Большим минусом SIMD-расширений архитектуры AMD64 является отсутствие принципиально новых и весьма полезных инструкций, наподобие тех, что Intel ввела в свои новые процессоры Prescott. Возьмем, к примеру, операции горизонтального сложения/вычитания векторов. Давно известно, что процессоры AMD, фактически, умеют делать такие вычисления еще со времен K6-2 (инструкция PFACC). Горизонтальное вычитание, правда, появилось несколько позже — с момента введения новых расширений Extended 3DNow! в первых процессорах Athlon (инструкция PFNACC). Но 3DNow. как известно, имеет ряд недостатков. О некоторых из них мы уже говорили выше — это необходимость использования MMX-регистров, что исключает возможность одновременного использования 3DNow! и FPU-кода, с одной стороны, и уменьшает количество свободных регистров при совместном использовании 3DNow! и MMX-кода, с другой. Вторым недостатком является низкая разрядность MMX-регистров (64 бита), так что в них влезает всего два значения с плавающей точкой одинарной точности. Т.е. для эффективных вычислений с трех- и четырехмерными векторами необходимо использовать по два регистра на каждый. В связи с этим, для AMD было бы весьма разумным расширить функциональность этих инструкций так, чтобы они умели работать с XMM-регистрами, наподобие того, как была расширена функциональность инструкций MMX с введением расширений SSE2 в процессоры семейства Pentium 4. И даже опередить тем самым Intel, поскольку получилось бы полное подобие расширений SSE3. Действительно, давайте посмотрим, для примера, как можно уже сейчас эмулировать инструкцию HADDPS XMM0, XMM1 с помощью SIMD-расширений AMD64 (будем считать, что в XMM0 уже загружен вектор A, а в XMM1 — вектор B):

Нетрудно видеть, что в этом коде реальных вычислительных операций всего две — это те самые инструкции PFACC. Все остальные операции (целых 9 штук), по сути, являются лишними — они связаны с необходимостью перемещения данных из XMM- в MMX-регистры и обратно и, как следствие, требуют наличия дополнительных свободных регистров. Заключая, можно сказать, что предпосылки к введению новых расширений в процессоры архитектуры AMD64 явно имеются, и причем уже довольно давно. Теперь остается лишь дождаться, что AMD не будет сильно отставать в этом плане от Intel (а ведь могла бы и опередить!) и все же введет их в последующие модели своих 64-разрядных процессоров.

10 февраля 2004 г.

Дмитрий Беседин