Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Лабораторная работа № 5
Параллельные вычисления в процессорах x86.
5.1. Цель работы
Освоить принцип параллелизма в процессорах x86 на примере технологии SSE.
5.2. Краткие теоретические сведения
Параллелизм (в процессорной архитектуре) — это возможность процессора выполнять параллельно несколько вычислительных операций. Необходимость в параллелизме возникла в процессе эволюции вычислительной техники. Разработчиками процессоров преследовалась вполне определенная цель повышения производительности компьютерных систем путем увеличения объема обрабатываемых за единицу времени данных. В конечном итоге c 1990-х годов в процессорах общего назначения начали появляться так называемые SIMD-расширения или SIMD-инструкции.
SIMD (англ. Single Instruction Multiple Data — одиночный поток команд, множественный поток данных, ОКМД) — это принцип компьютерных вычислений, позволяющий обеспечить параллелизм на уровне данных. Кроме этого, SIMD – это один из классов вычислительных систем в классификации Флинна.
В серийных процессорах Intel архитектуры x86 принцип SIMD был впервые реализован в виде технологии MMX (Multimedia Extensions — мультимедийные расширения) в Intel Pentium MMX в 1997 году. Более массовое же применение в процессорах x86 получило семейство технологий SSE, ставшее логическим продолжением технологии MMX.
Технология SSE (англ. Streaming SIMD Extensions, потоковое SIMD-расширение процессора) — это набор инструкций, разработанный Intel и впервые представленный в процессорах серии Pentium III. SSE включает в архитектуру процессора восемь 128-битных регистров и набор из 70-ти инструкций, работающих со скалярными и упакованными типами данных.
Преимущество в производительности достигается в том случае, когда необходимо произвести одну и ту же последовательность действий над блоком данных. В таком случае процессор осуществляет распараллеливание вычислительного процесса между множеством данных.
В процессор, поддерживающий SSE, добавлены восемь (шестнадцать для x86-64) 128-битных регистров, которые называются xmm0 — xmm7 (-xmm15). Каждый регистр может содержать четыре 32-битных значения с плавающей точкой одинарной точности.
Помимо регистров, технология SSE добавила в процессор команды для работы с числами одинарной точности с плавающей точкой (SPFP-команды). Каждое 32-разрядное число с плавающей точкой имеет 1 знаковый бит, 8 битов порядка и 23 бита мантиссы, что соответствует стандарту IEEE-754 на формат представления чисел одинарной точности с плавающей точкой.
Одна SSE-команда может обрабатывать одновременно четыре 32-разрядных числа. Поддерживается два типа команд над упакованными данными с плавающей запятой: параллельные и скалярные. Параллельные команды, как правило, действуют одновременно на все четыре 32-разрядных элемента данных в каждом из 128-разрядных операндов. В именах команд, выполняющих параллельные операции, присутствует суффикс PS.
Скалярные операции действуют на младшие (занимающие разряды 0-31) элементы данных двух операндов. Остальные три элемента данных в выходном операнде не изменяются (исключение составляет команда скалярного копирования MOVSS). В имени команд, выполняющих скалярные операции, присутствует суффикс SS.
SSE-команды имеют следующий синтаксис: instruction [dest, src]. Здесь instruction – имя команды, dest – выходной операнд, src - входной операнд. Ниже приведен пример нескольких SSE-команд (обозначения: 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 |
команда вычисляет квадратный корень из младшего элемента входного операнда и записывает результат в младший элемент в выходной операнд. Остальные элементы выходного операнда не меняются. |
UNPCKHPS xmm, xmm/m |
команда копирует третьи элементы входного и выходного операндов в соседние младшие элементы выходного операнда, а четвертые элементы входного и выходного операндов - соответственно, в старшие элементы выходного операнда. Распаковка элементов выполняется одновременно. |
UNPCKLPS xmm, xmm/m |
команда копирует первые элементы входного и выходного операндов в соседние младшие элементы выходного операнда, а вторые элементы входного и выходного операндов - соответственно, в старшие элементы этого операнда. Распаковка элементов выполняется одновременно. |
5.4. Методические указания
Для написания программы на Ассемблере удобно использовать интегрированные среды разработки WinAsm или RadAsm.
После написания программы и получения готового *.exe файла, необходимо провести пошаговую отладку программы, например, используя отладчик OllyDbg. При отладке внимательно изучите содержимое регистров SSE. Отобразить регистры в окне Registers (FPU) возможно, если в меню «Options=>Debugging options=>Registers» выбрать опцию «Decode SSE registers».
5.5. Порядок выполнения работы
В лабораторной работе требуется написать ассемблерную программу для получения массива чисел одинарной точности с плавающей точкой Z из двух исходных массивов X и Y. Каждый i-й элемент массива Z должен вычисляться на основании формулы в соответствии с вариантом. Размерность всех массивов 12. Ассемблерный код должен быть основан на использовании команд SSE. Исходные массивы необходимо задать внутри программы в сегменте данных.
5.6. Задания к лабораторной работе, исходные данные
Таблица 5.1.
Вар. № |
Задание |
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |