Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа № 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 |