|
Методические указания по Организации ЭВМ и систем
Супер скалярная обработка данных
Введение
В процессорах, начиная с Pentium III, возможно использование специального архитектурного расширения, предназначенного для потоковой обработки данных, - Streaming SIMD Extensions (SIMD - single instruction, multip le data, т.е. одна команда - много данных). Это расширение включает дополнительный набор команд, дополнительные режимы генерации ошибок и исключений, дополнительные внутренние регистры и форматы данных, воспринимаемые процессором. Данное расширение - усовершенствованные команды мультимедийной обработки ММХ.
Доступ ко всем SIMD-регистрам возможен только с помощью новых SIMD-команд. Перед использованием данного расширения ПО должно с помощью команды CPUID проверить, поддерживается ли оно конкретной моделью микропроцессора.
Новые SIMD-команды, реализованные в процессоре Pentium® III, увеличивают производительность прикладных программ в следующих областях:
- трехмерная графика и моделирование, расчет освещенности с использованием вычислений с плавающей запятой;
- обработка сигналов и моделирование процессов с широким диапазоном изменения параметров (вычисления с плавающей запятой);
- генерация трехмерных изображений в программах реального времени, использующих целочисленный код;
- алгоритмы кодирования и декодирования видеосигнала, обрабатывающие данные блоками;
- численные алгоритмы фильтрации, работающие с потоками данных.
Регистры и типы данных
Восемь 128-битных регистров общего назначения (ХММО...ХММ7) вводятся в процессор (Pentium III...) для использования командами потоковой обработки. SIMD-регистры ХММО...ХММ7 (см. рис.) могут применяться для вычислений и хранения данных. Они не могут использоваться для косвенной адресации, как регистры общего назначения (ЕАХ, ЕВХ, ЕСХ, EDX, EBP, ESI, EDI и ESP)

Команды SIMD делятся на 4 категории:
- SIMD-команды для данных одинарной точности с плавающей запятой (SPFP-команды);
- Дополнительные SIMD-команды для целочисленных данных;
- Команды управления кэшированием;
- Команды сохранения и восстановления компонент состояния процессора.
Одна SIMD-команда с плавающей запятой может обрабатывать одновременно четыре 32-разрядных числа одинарной точности с плавающей запятой (называемых SPFP-элементами данных).

SIMD-команды для работы с SPFP-данными используют восемь новых 128-разрядных регистров - XMM-регистров. Команды обращаются к XMM-регистрам по именам: XMM0, XMM1, :, XMM7.
Каждое 32-разрядное число с плавающей запятой имеет 1 знаковый бит, 8 битов порядка и 23 бита мантиссы, что соответствует стандарту IEEE-754 на формат представления чисел одинарной точности с плавающей запятой (SPFP-чисел).
SIMD-команды поддерживают два типа операций над упакованными данными с плавающей запятой - параллельные и скалярные.
Параллельные операции, как правило, действуют одновременно на все четыре 32-разрядных элемента данных в каждом из 128-разрядных операндов. В именах команд, выполняющих параллельные операции, присутствует суффикс PS. Например, команда addps складывает 4 пары элементов данных xmm1 и xmm2 и записывает полученные 4 суммы в соответствующие элементы первого операнда xmm1.
Скалярные операции действуют на младшие (занимающие разряды 0-31) элементы данных двух операндов. Остальные три элемента данных в выходном операнде не изменяются (исключение составляет команда скалярного копирования MOVSS). В имени команд, выполняющих скалярные операции, присутствует суффикс SS. Например, команда addss действует только на младшие элементы в регистрах xmm1 и xmm2. Результат записывается в xmm1 (выходной операнд). Содержимое трех старших элементов в xmm1 не изменяется.
Большинство команд имеют два операнда. Данные, содержащиеся в первом операнде, могут использоваться командой, а после ее выполнения, как правило, замещаются результатами. Данные во втором операнде используются в команде и после ее выполнения не изменяются. Далее в тексте входным называется второй операнд, а выходным - первый.
Организация данных для технологии SIMD

Хранение наборов данных в памяти организуется, как правило, одним из следующих способов:
- Массив, состоящий из структур (модель AOS);
- Структура, состоящая из массивов (модель SOA).
На рисунке иллюстрируются эти два способа на примере организации хранения компонентов вершин геометрических объектов.
В модели AOS все четыре компоненты (x,y,z,w) каждой вершины располагаются в памяти последовательно одна за другой.
В отличие от этого, модель SOA задает последовательное расположение в памяти одноименных компонент (например, x0, x1, x2,…,xn ) для различных вершин объекта.
Для наиболее эффективного использования технологии SIMD, группируйте в Ваших программах элементы данных, требующие сходной обработки, в массивы в рамках структур (модель SOA). Так, в приведенном примере, x-компоненты нескольких вершин могут быть кэшированы в одной кэш-линии и обрабатываться параллельно.

Алгоритмы решения ряда задач организуют хранение данных в памяти по модели AOS. Однако в большинстве случаев для вычислений по технологии SIMD модель AOS менее эффективна, чем SOA. Поэтому для повышения производительности программы, использующей новые SIMD-команды, рекомендуется перестроить алгоритм так, чтобы он работал с организацией данных по модели SOA. Такое перестроение может быть осуществлено двумя способами:
Попробуйте сначала перестроить свой алгоритм статическим способом. Если этого сделать не удается, используйте динамический способ, даже если это повлечет дополнительные программные затраты на манипуляции с данными. Помните, что организация данных по модели AOS наименее эффективна и может не обеспечивать загрузку всех четырех устройств выполнения, хотя это все же предпочтительнее, чем скалярные вычисления.
Характер организации данных во многом зависит от используемого алгоритма и может быть различным для разных приложений.
В задачах, связанных с преобразованиями в трехмерном пространстве, осуществляется пересчет координат вершин объектов из одного положения в другое.
В приводимом примере кода показывается, как следует перегруппировать данные для четырех вершин из модели AOS в модель SOA.
В модели AOS данные для каждой вершины изначально представлены в виде структуры, состоящей из ее координат x, y, z и компоненты w ( w часто нормируется на 1).
Чтобы преобразовать данные к модели SOA, нужно выделить в отдельные группы сначала x-координаты всех вершин, затем y, z и w–координаты, и занести их в разные XMM-регистры (по 4 координаты за один цикл обработки).
SIMD – Команды
SIMD-команды имеют следующий синтаксис: instruction [dest, src]
Здесь instruction - имя команды, dest обозначает выходной операнд, src - входной операнд.
Доступны следующие SIMD-команды (обозначения: xmm - XMM-регистр; mm - MMX-регистр; m - память; imm - 8-битный непосредственный операнд; ir32 - целочисленный регистр):
| ADDPS xmm, xmm/m |
команда попарно складывает упакованные элементы данных и записывает суммы в соответствующие элементы XMM-регистра. |
| SUBPS xmm, xmm/m |
команда вычитает элементы входного операнда из элементов первого регистра и записывает полученные разности в соответствующие элементы первого регистра. |
| MULPS xmm, xmm/m |
команда попарно перемножает упакованные элементы. Произведения записываются в соответствующие элементы XMM-регистра. |
| DIVPS xmm, xmm/m |
команда делит элементы первого операнда на соответствующие элементы входного операнда . Результаты деления записываются в XMM-регистр на место делимых. |
| ADDSS xmm, xmm/m |
команда складывает младшие элементы данных и записывает результат в младший элемент XMM-регистра. Остальные элементы выходного операнда не меняются. |
| SUBSS xmm, xmm/m |
команда вычитает младший элемент входного операнда из соответствующего элемента выходного операнда и записывает разность в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются. |
| MULSS xmm, xmm/m |
команда перемножает младшие элементы данных и записывает результат в младший элемент XMM-регистра. Остальные элементы выходного операнда не меняются. |
| DIVSS xmm, xmm/m |
команда делит младший элемент выходного операнда на соответствующий элемент входного операнда и записывает результат в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются. |
| SQRTPS xmm, xmm/m |
команда вычисляет квадратный корень для каждого из четырех чисел во входном операнде и записывает результаты в выходной операнд. |
| SQRTSS xmm, xmm/m |
команда вычисляет квадратный корень из младшего элемента входного операнда и записывает результат в младший элемент в выходной операнд. Остальные элементы выходного операнда не меняются. |
| RCPPS xmm, xmm/m |
команда определяет приближенное обратное значение для каждого из четырех чисел входного операнда и записывает результаты в XMM-регистр. |
|
RSQRTPS xmm, xmm/m |
команда вычисляет приближенное обратное значение для квадратного корня из каждого из четырех чисел входного операнда и записывает результаты в XMM-регистр. |
| RCPSS xmm, xmm/m |
команда определяет приближенное обратное значение для числа, находящегося в младшем элементе входного операнда и записывает результат в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются. |
| RSQRTSS xmm, xmm/m |
команда вычисляет приближенное обратное значение для квадратного корня из числа , находящегося в младшем элементе входного операнда и записывает результат в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются. |
| MAXPS xmm, xmm/m |
команда попарно сравнивает элементы данных и записывает большее значение из каждой пары в соответствующий элемент выходного операнда. |
| MINPS xmm, xmm/m |
команда попарно сравнивает элементы данных и записывает меньшие значения из каждой пары в соответствующие элементы выходного операнда. |
| MAXSS xmm, xmm/m |
команда сравнивает младшие элементы данных и записывает большее из значений в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются. |
| MINSS xmm, xmm/m |
команда сравнивает младшие элементы данных и записывает меньшее из значений в младший элемент выходного операнда. Остальные элементы выходного операнда не меняются. |
| SHUFPS xmm, xmm/m, imm |
команда с непосредственным операндом выбирает из первого операнда два элемента с 2-битными номерами из непосредственного операнда (непосредственный операнд делится справа налево на 4 2-битовых числа) и записывает их в младшие элементы выходного операнда. Из второго операнда выбираются два элемента со следующими 2-битными номерами и записываются в старшие элементы выходного операнда. Перестановка всех элементов происходит одновременно. |
| UNPCKHPS xmm, xmm/m |
команда копирует третьи элементы входного и выходного операндов в соседние младшие элементы выходного операнда, а четвертые элементы входного и выходного операндов - соответственно, в старшие элементы выходного операнда. Распаковка элементов выполняется одновременно. |
| UNPCKLPS xmm, xmm/m |
команда копирует первые элементы входного и выходного операндов в соседние младшие элементы выходного операнда, а вторые элементы входного и выходного операндов - соответственно, в старшие элементы этого операнда. Распаковка элементов выполняется одновременно. |
MOVAPS xmm/m, xmm/m - команда копирует четыре FP-элемента одним из следующих способов:
- из памяти в XMM-регистр
- из XMM-регистра в память
- из одного XMM-регистра в другой
Линейный адрес соответствует адресу младшего байта группы данных в памяти. Обращение в память должно быть по адресу, кратному 16 байтам; в противном случае генерируется исключение.
MOVUPS xmm/m, xmm/m - команда копирует четыре FP-элемента одним из следующих способов:
- из памяти в XMM-регистр
- из XMM-регистра в память
- из одного XMM-регистра в другой
Линейный адрес соответствует адресу младшего байта группы данных в памяти. Команда применяется для обращения к невыровненным данным в памяти.
MOVHPS xmm/m, xmm/m - команда копирует два FP-элемента одним из следующих способов:
- из памяти в два старшие элемента XMM-регистра
- из двух старших элементов XMM-регистра в память
При копировании данных из памяти в XMM-регистр, два младших элемента этого регистра не изменяются. Команда работает с адресом младшего байта группы данных в памяти.
MOVLPS xmm/m, xmm/m - команда копирует два FP-элемента одним из следующих способов:
- из памяти в два младшие элемента XMM-регистра
- из двух младших элементов XMM-регистра в память
При копировании данных из памяти в XMM-регистр, два старших элемента этого регистра не изменяются. Линейный адрес соответствует адресу младшего байта группы данных в памяти.
MOVSS xmm/m, xmm/m - команда копирует один 32-рарядный FP-элемент одним из следующих способов:
- из памяти в младший элемент XMM-регистра
- из младшего элемента XMM-регистра в память
- из младшего элемента одного XMM-регистра в младший элемент другого XMM-регистра
При копировании 32 битов данных из памяти в XMM-регистр, все 96 оставшихся старших битов этого регистра обнуляются. Команда работает с адресом младшего байта группы данных в памяти.
| MOVLHPS xmm, xmm |
команда копирует 64 младших разряда входного регистра в 64 старших разряда выходного регистра, не меняя содержимое 64 младших разрядов выходного регистра. |
| MOVHLPS xmm, xmm |
команда копирует 64 старших разряда входного регистра в 64 младших разряда выходного регистра, не меняя содержимое 64 старших разрядов выходного регистра. |
| MOVMSKPS ir32, xmm |
команда копирует содержимое старших (знаковых) разрядов каждого из четырех FP-элементов, находящихся во входном XMM-регистре, в младшие разряды выходного целочисленного регистра, и формирует таким образом 4-битовую маску. Старшие 28 разрядов целочисленного регистра обнуляются. |
| CMPEQPS xmm, xmm/m; CMPLTPS xmm, xmm/m; CMPLEPS xmm, xmm/m; CMPUNORDPS xmm, xmm/m; CMPNEQPS xmm, xmm/m; CMPNLTPS xmm, xmm/m; CMPNLEPS xmm, xmm/m; CMPORDPS xmm, xmm/m |
команды попарно сравнивают числа в соответствующих элементах операндов, проверяя выполнение условий равно, меньше, меньше или равно, несравнимы, не равно, не меньше, не { меньше или равно}, сравнимы соответственно. Элементы выходного операнда заполняются масками из единиц или нулей в зависимости от результата. |
| CMPEQSS xmm, xmm/m; CMPLTSS xmm, xmm/m; CMPLESS xmm, xmm/m; CMPUNORDSS xmm, xmm/m; CMPNEQSS xmm, xmm/m; CMPNLTSS xmm, xmm/m; CMPNLESS xmm, xmm/m; CMPORDSS xmm, xmm/m |
команды сравнивают числа в младших элементах операндов, проверяя выполнение условий равно, меньше, меньше или равно, несравнимы, не равно, не меньше, не { меньше или равно}, сравнимы соответственно. Младший элемент выходного операнда заполняется маской из единиц или нулей в зависимости от результата. Содержимое трех старших элементов выходного операнда сохраняется. |
| ANDPS xmm, xmm/m |
команда вычисляет поразрядное логическое И своих 128-битных входного и выходного операндов. Каждый бит результата полагается равным 1, если оба соответствующих бита операндов равны 1, и равным 0 в противном случае. Результат записывается в выходной операнд. |
| ANDNPS xmm, xmm/m |
команда сначала инвертирует все разряды выходного операнда (логическое НЕ), а затем вычисляет поразрядное логическое И входного и инвертированного выходного операндов. Каждый бит результата полагается равным 1, если для входного операнда соответствующий бит равен 1, а для выходного - равен 0. В противном случае присваивается 0. Результат записывается в выходной операнд. |
| ORPS xmm, xmm/m |
команда вычисляет поразрядное логическое ИЛИ своих 128-битных входного и выходного операндов. Каждый бит результата полагается равным 0, если оба соответствующих бита операндов равны 0, и равным 1 в противном случае. Результат записывается в выходной операнд. |
| XORPS xmm, xmm/m |
команда вычисляет поразрядное логическое исключающее ИЛИ своих 128-битных входного и выходного операндов. Каждый бит результата полагается равным 1, если соответствующие биты операндов содержат различные значения. В случае одинаковых значений присваивается 0. Результат записывается в выходной операнд. |
| COMISS xmm, xmm/m |
команда выполняет сравнение двух младших элементов операндов и устанавливает для них одно из соотношений: "меньше", "равны", "больше", "несравнимы". По результатам сравнения устанавливаются следующие значения флагов состояния ZF, PF и CF: |
| UCOMISS xmm, xmm/m |
команда выполняет те же действия, что и команда COMISS xmm, xmm/m. Разница заключается в обработке нечисловых операндов. Для операндов типа SNaN команда генерирует исключение, а для операндов типа QNaN - нет. Флаги устанавливаются в значение "несравнимы" в каждом из случаев. |
| CVTPS2PI mm, xmm/m |
команда преобразует FP-числа из двух младших элементов входного операнда в целые 32-разрядные числа со знаком, записываемые в два элемента выходного MMX-регистра. При необходимости результаты округляются в соответствии со значением поля RC в регистре MXCSR. |
|
CVTPS2SI ir32, xmm/m |
команда преобразует одно FP-число, содержащееся в младшем элементе входного операнда, в целое 32-разрядное число со знаком, записываемое в выходной целочисленный регистр. При необходимости результат округляется в соответствии со значением поля RC в регистре MXCSR. |
| CVTTPS2PI mm, xmm/m |
команда преобразует FP-числа из двух младших элементов входного операнда в целые 32-разрядные числа со знаком, записываемые в два элемента выходного MMX-регистра. Когда необходимо округление, дробная часть результата отбрасывается, без учета значения поля RC в регистре MXCSR. Используйте эту команду для преобразований, где при округлении требуется только отбрасывание дробной части. |
| CVTTPS2SI ir32, xmm/m |
команда преобразует одно FP-число, содержащееся в младшем элементе входного операнда, в целое 32-разрядное число со знаком, записываемое в выходной целочисленный регистр. Когда необходимо округление, дробная часть результата отбрасывается, без учета значения поля RC в регистре MXCSR. Используйте эту команду для преобразований, где требуется только отбрасывание дробной части при округлении. |
| CVTPI2PS xmm, mm/m |
команда преобразует два 32-разрядных целых числа со знаком в два FP-числа, записываемые в два младших элемента выходного XMM-регистра. Два старших элемента выходного регистра не изменяются. |
| CVTSI2SS xmm, ir32/m |
команда преобразует 32-разрядное целое число со знаком в FP-число, записываемое в младший элемент выходного XMM-регистра. Три старших элемента выходного регистра не изменяются. |
| PEXTRV ir32, mm, imm |
команда копирует 16-разрядное слово, на которое указывают два младших разряда непосредственного операнда, из MMX-регистра в целочисленный регистр. Старшие 16 разрядов целочисленного регистра заполняются нулями. |
| PINSRW mm, ir32/m, imm |
команда копирует 16-разрядное слово из входного операнда в слово MMX-регистра, на которое указывают два младших разряда непосредственного операнда. |
| PMINSW mm, mm/m |
команда попарно сравнивает четыре слова со знаком в MMX-регистре с четырьмя словами со знаком во входном операнде. Минимальные значения записываются в выходной операнд. |
| PMAXSW mm, mm/m |
команда попарно сравнивает четыре слова со знаком в MMX-регистре с четырьмя словами со знаком во входном операнде. Максимальные значения записываются в выходной операнд. |
| PMINUB mm, mm/m |
команда попарно сравнивает восемь байтов без знака в MMX-регистре с восемью байтами без знака во входном операнде. Минимальные значения записываются в выходной операнд. |
| PMAXUB mm, mm/m |
команда попарно сравнивает восемь байтов без знака в MMX-регистре с восемью байтами без знака во входном операнде. Максимальные значения записываются в выходной операнд. |
| PMOVMSKB ir32, mm |
команда копирует старшие (знаковые) биты всех восьми упакованных байтов входного операнда - MMX-регистра и формирует 8-разрядную маску в младших разрядах 32-разрядного целочисленного регистра. Все старшие 24 разряда выходного целочисленного регистра обнуляются. |
| PMULHUW mm, mm/m |
команда записывает в выходной операнд старшие 16 разрядов попарных промежуточных произведений 16-разрядных слов без знака входного и выходного операндов. |
| PSHUFW mm, mm/m, imm |
команда выбирает четыре 16-разрядных слова (не обязательно различных) из входного операнда и записывает их в определенном порядке в выходной операнд. Порядок записи слов задается 2-разрядными полями 8-разрядного непосредственного операнда. |
| MOVNTPS m, xmm |
команда записывает 128 бит SPFP-данных непосредственно в память и не кэширует данные при кэш-промахе (cache miss). При кэш-попадании (cache hit) данные в кэше обновляются, а прямой записи в память не происходит. |
| MOVNTQ m, mm |
команда записывает 64 бита целочисленных данных непосредственно в память и не кэширует данные при кэш-промахе. При кэш-попадании данные в кэше обновляются, а прямой записи в память не происходит. |
| MASKMOVQ mm, mm |
команда выборочно записывает байты из MMX-регистра непосредственно в память. Байты выбираются в соответствии с 8-разрядной маской, состоящей из старших битов в байтах второго операнда - MMX-регистра. Единица в некотором разряде маски означает запись соответствующего байта в память, нуль - отсутствие записи. Адрес памяти, по которому производится запись, указывается в регистре EDI. |
| hrefETCHT0 m |
команда записывает кэшируемые данные из памяти в кэш всех уровней. |
| hrefETCHT1 m ; hrefETCHT2 m |
команды в архитектуре процессора PentiumR III записывают кэшируемые данные из памяти в кэш L2. |
| hrefETCHTA m |
команда записывает кэшируемые данные из памяти в кэш для данных со слабой локализацией. В архитектуре процессора PentiumR III данные обходят L2-кэш и переносятся в L1-кэш, используемый для этих целей. |
| SFENCE |
команда применяется для строгого упорядочения последовательности обращений в память и синхронизации ее с содержимым кэш-памяти, если такие обращения являются слабо упорядоченными. При использовании данной команды в основную память копируются все данные предшествующих команд записи, хранящиеся в буфере записи и кэше. Только после этого будут выполняться следующие команды записи. Команда временно блокирует выполнение лишь последующих команд сохранения данных, не влияя при этом на работу других команд. |
| STMXCSR m |
команда записывает в 32-разрядное слово памяти содержимое регистра MXCSR. |
| IDMXCSR m |
команда загружает из памяти 32-разрядное слово состояния и управления в регистр MXCSR. |
| FXSAVE m |
команда сохраняет в области памяти по указываемому адресу состояние регистров данных с плавающей запятой, MMX-регистров, а также новых регистров процессора PentiumR III. Размер области памяти, в которой хранится информация о состоянии процессора, составляет 512 байт. |
| FXSTOR m |
команда загружает предварительно сохраненную информацию о состоянии регистров данных с плавающей запятой, MMX-регистров, а также новых регистров процессора PentiumR III из 512-байтной области памяти в соответствующие регистры. Начальный адрес области памяти при загрузке должен быть выровнен на 16 байт. |
Задание
Даны матрицы A, B размерностью 4´4.
Найти A + B = Z

1. movaps xmm1, [a1]
| xmm1 |
a11 |
a12 |
a13 |
a14 |
| xmm2 |
0.0 |
0.0 |
0.0 |
0.0 |
| xmm3 |
0.0 |
0.0 |
0.0 |
0.0 |
| xmm4 |
0.0 |
0.0 |
0.0 |
0.0 |
2. movaps xmm2, [a2]
| xmm1 |
a11 |
a12 |
a13 |
a14 |
| xmm2 |
a21 |
a22 |
a23 |
a24 |
| xmm3 |
0.0 |
0.0 |
0.0 |
0.0 |
| xmm4 |
0.0 |
0.0 |
0.0 |
0.0 |
3. movaps xmm3, [a3]
| xmm1 |
a11 |
a12 |
a13 |
a14 |
| xmm2 |
a21 |
a22 |
a23 |
a24 |
| xmm3 |
a31 |
a32 |
a33 |
a34 |
| xmm4 |
0.0 |
0.0 |
0.0 |
0.0 |
4. movaps xmm4, [a4]
| xmm1 |
a11 |
a12 |
a13 |
a14 |
| xmm2 |
a21 |
a22 |
a23 |
a24 |
| xmm3 |
a31 |
a32 |
a33 |
a34 |
| xmm4 |
a41 |
a42 |
a43 |
a44 |
Последовательные команды movaps загружают из памяти элементы
строк матрицы A в четыре XMM регистра xmm1..xmm4 поэлементно.
5. addps xmm1, [b1]
| xmm1 |
a11 + b11 |
a12 + b12 |
a13 + b13 |
a14 + b14 |
| xmm2 |
a21 |
a22 |
a23 |
a24 |
| xmm3 |
a31 |
a32 |
a33 |
a34 |
| xmm4 |
a41 |
a42 |
a43 |
a44 |
6. addps xmm2, [b2]
| xmm1 |
a11 + b11 |
a12 + b12 |
a13 + b13 |
a14 + b14 |
| xmm2 |
a21 + b21 |
a22 + b22 |
a23 + b23 |
a24 + b24 |
| xmm3 |
a31 |
a32 |
a33 |
a34 |
| xmm4 |
a41 |
a42 |
a43 |
a44 |
7. addps xmm3, [b3]
| xmm1 |
a11 + b11 |
a12 + b12 |
a13 + b13 |
a14 + b14 |
| xmm2 |
a21 + b21 |
a22 + b22 |
a23 + b23 |
a24 + b24 |
| xmm3 |
a31 + b31 |
a32 + b32 |
a33 + b33 |
a34 + b34 |
| Xmm4 |
a41 |
a42 |
a43 |
a44 |
8. addps xmm4, [b4]
| xmm1 |
a11 + b11 |
a12 + b12 |
a13 + b13 |
a14 + b14 |
| xmm2 |
a21 + b21 |
a22 + b22 |
a23 + b23 |
a24 + b24 |
| xmm3 |
a31 + b31 |
a32 + b32 |
a33 + b33 |
a34 + b34 |
| xmm4 |
a41 + b41 |
a42 + b42 |
a43 + b43 |
a44 + b44 |
Команда addps складывает строки матриц B поэлементно с регистрами
xmm1..xmm4.
|