51312

Использование SIMD-расширений

Лабораторная работа

Информатика, кибернетика и программирование

Цель работы Научиться использовать в программах SIMD-расширения архитектуры х86. Написать программу с использованием SIMD-расширений.

Русский

2014-02-09

103 KB

1 чел.

Министерство образования и науки

ФГБОУ ВПО Тульский государственный университет

КАФЕДРА АВТОМАТИКИ И ТЕЛЕМЕХАНИКИ

Использование SIMD-расширений

Отчет по лабораторной работе № 6

по дисциплине «Кодирование и сжатие данных»

Выполнил:                студент группы      230691   __________  Гриценко И.В.

                                      (подпись)                                            

Проверил:                                                                 __________  Гетманец В.М.

                                                              (подпись)

Тула 2013
Цель работы

 Научиться использовать в программах SIMD-расширения архитектуры х86. Написать программу с использованием SIMD-расширений.

Задание на работу

Реализовать приложение для выполнения простейших арифметических действий с матрицами с использованием SIMD-расширений.

Ход работы

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

unit MUnit;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ExtCtrls, cxGraphics, cxControls, cxLookAndFeels,

 cxLookAndFeelPainters, cxContainer, cxEdit, Grids, cxTextEdit,

 cxMaskEdit, cxSpinEdit, dxLayoutContainer, dxLayoutcxEditAdapters,

 dxLayoutControlAdapters, Menus, cxButtons, dxLayoutControl, dxBevel,

 cxLabel;

type

 TfrmMain = class(TForm)

   dxLayoutControl1Group_Root: TdxLayoutGroup;

   dxLayoutControl1: TdxLayoutControl;

   sgA: TStringGrid;

   dxLayoutControl1Item1: TdxLayoutItem;

   seN: TcxSpinEdit;

   dxLayoutControl1Item2: TdxLayoutItem;

   dxLayoutControl1Group1: TdxLayoutGroup;

   sgB: TStringGrid;

   dxLayoutControl1Item6: TdxLayoutItem;

   teTReg: TcxTextEdit;

   dxLayoutControl1Item7: TdxLayoutItem;

   teTMMX: TcxTextEdit;

   dxLayoutControl1Item8: TdxLayoutItem;

   seNum: TcxSpinEdit;

   dxLayoutControl1Item9: TdxLayoutItem;

   dxLayoutControl1Group4: TdxLayoutGroup;

   sgC: TStringGrid;

   dxLayoutControl1Item10: TdxLayoutItem;

   btnAdd: TcxButton;

   dxLayoutControl1Item11: TdxLayoutItem;

   btnSub: TcxButton;

   dxLayoutControl1Item12: TdxLayoutItem;

   btnMul: TcxButton;

   dxLayoutControl1Item13: TdxLayoutItem;

   lbEq: TcxLabel;

   dxLayoutControl1Item14: TdxLayoutItem;

   dxLayoutControl1Group2: TdxLayoutGroup;

   dxLayoutControl1Group6: TdxLayoutGroup;

   dxLayoutControl1Item15: TdxLayoutItem;

   bvSeparator1: TdxBevel;

   dxLayoutControl1Item16: TdxLayoutItem;

   bvSeparator2: TdxBevel;

   procedure seNPropertiesChange(Sender: TObject);

   procedure sgAKeyPress(Sender: TObject; var Key: Char);

   procedure FormCreate(Sender: TObject);

   procedure seNumPropertiesChange(Sender: TObject);

   procedure btnMulClick(Sender: TObject);

   procedure btnAddClick(Sender: TObject);

   procedure btnSubClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

 TArray4 = array [0..3] of Smallint;

 TArray2 = array [0..1] of Longint;

 TMatrInt = array of array of Smallint;

 TMatrReal = array of array of Real;

var

 frmMain: TfrmMain;

implementation

uses Math;

{$R *.dfm}

function MAddMMX(m1: TMatrInt; nm1, mm1: Integer; m2: TMatrInt; nm2, mm2: Integer;

 var mr: TMatrInt): Extended;

var       

 QPF, T1, T2: Int64;

 i, k: Integer;

 ar1, ar2: TArray4;

 ares: TArray4;

begin

 QueryPerformanceFrequency(QPF);

 QueryPerformanceCounter(T1);

 for i := 0 to nm1-1 do

 begin

   k := 1;

   while k < mm1 do

   begin

     ar1[0] := m1[i,k-1]; ar1[1] := m1[i,k]; ar1[2] := m1[i,k+1]; ar1[3] := m1[i,k+2];

     ar2[0] := m2[i,k-1]; ar2[1] := m2[i,k]; ar2[2] := m2[i,k+1]; ar2[3] := m2[i,k+2];

     asm

       movq MM0, ar1[0]

       movq MM1, ar2[0]

       paddw MM0, MM1

       movq ares[0], MM0

       emms

     end;

     mr[i,k-1] := ares[0]; mr[i,k] := ares[1]; mr[i,k+1] := ares[2]; mr[i,k+2] := ares[3];

     Inc(k, 4);

   end;

 end;

 QueryPerformanceCounter(T2);

 Result := (T2 - T1) / QPF;

end;

function MSubMMX(m1: TMatrInt; nm1, mm1: Integer; m2: TMatrInt; nm2, mm2: Integer;

 var mr: TMatrInt): Extended;

var       

 QPF, T1, T2: Int64;

 i, k: Integer;

 ar1, ar2: TArray4;

 ares: TArray4;

begin

 QueryPerformanceFrequency(QPF);

 QueryPerformanceCounter(T1);

 for i := 0 to nm1-1 do

 begin

   k := 1;

   while k < mm1 do

   begin

     ar1[0] := m1[i,k-1]; ar1[1] := m1[i,k]; ar1[2] := m1[i,k+1]; ar1[3] := m1[i,k+2];

     ar2[0] := m2[i,k-1]; ar2[1] := m2[i,k]; ar2[2] := m2[i,k+1]; ar2[3] := m2[i,k+2];

     asm

       movq MM0, ar1[0]

       movq MM1, ar2[0]

       psubw MM0, MM1

       movq ares[0], MM0

       emms

     end;

     mr[i,k-1] := ares[0]; mr[i,k] := ares[1]; mr[i,k+1] := ares[2]; mr[i,k+2] := ares[3];

     Inc(k, 4);

   end;

 end;

 QueryPerformanceCounter(T2);

 Result := (T2 - T1) / QPF;

end;

function MMulMMX(m1: TMatrInt; nm1, mm1: Integer; m2: TMatrInt; nm2, mm2: Integer;

 var mr: TMatrInt): Extended;

var       

 QPF, T1, T2: Int64;

 i, j, k: Integer;

 ar1, ar2: TArray4;

 ares: TArray2;

begin

 QueryPerformanceFrequency(QPF);

 QueryPerformanceCounter(T1);

 for i := 0 to nm1-1 do

   for j := 0 to mm2-1 do

   begin

     k := 1;

     while k < mm1 do

     begin

       ar1[0] := m1[i,k-1]; ar1[1] := m1[i,k]; ar1[2] := m1[i,k+1]; ar1[3] := m1[i,k+2];

       ar2[0] := m2[k-1,j]; ar2[1] := m2[k,j]; ar2[2] := m2[k+1,j]; ar2[3] := m2[k+2,j];

       asm

         movq MM0, ar1[0]

         movq MM1, ar2[0]

         pmaddwd MM0, MM1

         movq ares[0], MM0

         emms

       end;

       mr[i,j] := ares[0] + ares[1];

       Inc(k, 4);

     end;

   end;   

 QueryPerformanceCounter(T2);

 Result := (T2 - T1) / QPF;

end;

function MAddRegular(m1: TMatrInt; nm1, mm1: Integer; m2: TMatrInt; nm2, mm2: Integer;

 var mr: TMatrInt): Extended;

var

 QPF, T1, T2: Int64;

 i, j: Integer;

begin

 QueryPerformanceFrequency(QPF);

 QueryPerformanceCounter(T1);

 for i := 0 to nm1-1 do

   for j := 0 to mm2-1 do

   begin

     mr[i,j] := 0;

     mr[i,j] := mr[i,j] + m1[i,j] + m2[i,j];

   end;

 QueryPerformanceCounter(T2);

 Result := (T2 - T1) / QPF;

end;

function MSubRegular(m1: TMatrInt; nm1, mm1: Integer; m2: TMatrInt; nm2, mm2: Integer;

 var mr: TMatrInt): Extended;

var

 QPF, T1, T2: Int64;

 i, j: Integer;

begin

 QueryPerformanceFrequency(QPF);

 QueryPerformanceCounter(T1);

 for i := 0 to nm1-1 do

   for j := 0 to mm2-1 do

   begin

     mr[i,j] := 0;

     mr[i,j] := mr[i,j] + m1[i,j] - m2[i,j];

   end;

 QueryPerformanceCounter(T2);

 Result := (T2 - T1) / QPF;

end;

function MMulRegular(m1: TMatrInt; nm1, mm1: Integer; m2: TMatrInt; nm2, mm2: Integer;

 var mr: TMatrInt): Extended;

var

 QPF, T1, T2: Int64;

 i, j, k: Integer;

begin

 QueryPerformanceFrequency(QPF);

 QueryPerformanceCounter(T1);

 for i := 0 to nm1-1 do

   for j := 0 to mm2-1 do

   begin

     mr[i,j] := 0;

     for k := 0 to mm1-1 do

       mr[i,j] := mr[i,j] + m1[i,k]*m2[k,j];

   end;  

 QueryPerformanceCounter(T2);

 Result := (T2 - T1) / QPF;

end;

procedure TfrmMain.seNPropertiesChange(Sender: TObject);

var

 i, j, n: Integer;

begin

 n := seN.Value;

 sgA.ColCount := n;

 sgA.RowCount := n;

 sgB.ColCount := n;

 sgB.RowCount := n;

 sgC.ColCount := n;

 sgC.RowCount := n;

 for i := 0 to n-1 do

   for j := 0 to n-1 do

   begin

     if sgA.Cells[i,j] = '' then

       sgA.Cells[i,j] := '0';

     if sgB.Cells[i,j] = '' then

       sgB.Cells[i,j] := '0';

   end;

 for i := 0 to n-1 do

   sgC.Cols[i].Clear;

 teTReg.Clear;

 teTMMX.Clear;

end;

procedure TfrmMain.sgAKeyPress(Sender: TObject; var Key: Char);

begin

 teTReg.Clear;

 teTMMX.Clear;

end;

procedure TfrmMain.seNumPropertiesChange(Sender: TObject);

begin

 teTReg.Clear;

 teTMMX.Clear;

end;

procedure TfrmMain.FormCreate(Sender: TObject);

begin

 seN.Value := 4;

end;

procedure TfrmMain.btnAddClick(Sender: TObject);

var

 n, num, i, j: Integer;

 a, b, c: TMatrInt;

 time_reg, time_mmx: extended;

 QPF, t1, t2: Int64;

begin

 n := seN.Value;

 num := seNum.Value;

 SetLength(a, n, n);

 for i := 0 to n-1 do

   for j := 0 to n-1 do

     a[i,j] := strtoint(sgA.Cells[j,i]);

 SetLength(b, n, n);

 for i := 0 to n-1 do

   for j := 0 to n-1 do

     b[i,j] := strtoint(sgB.Cells[j,i]);

 SetLength(c, n, n);

 QueryPerformanceFrequency(QPF);

 QueryPerformanceCounter(t1);

 for i := 1 to num do

   MAddRegular(a, n, n, b, n, n, c);

 QueryPerformanceCounter(t2);

 time_reg := (t2 - t1) / QPF;

 QueryPerformanceCounter(t1);

 for i := 1 to num do

   MAddMMX(a, n, n, b, n, n, c);

 QueryPerformanceCounter(t2);

 time_mmx := (t2 - t1) / QPF;

 for i := 0 to n-1 do

   for j := 0 to n-1 do

     sgC.Cells[j,i] := inttostr(c[i,j]);

 teTReg.Text := floattostr(time_reg);

 teTMMX.Text := floattostr(time_mmx);

end;

procedure TfrmMain.btnSubClick(Sender: TObject);

var

 n, num, i, j: Integer;

 a, b, c: TMatrInt;

 time_reg, time_mmx: extended;

 QPF, t1, t2: Int64;

begin

 n := seN.Value;

 num := seNum.Value;

 SetLength(a, n, n);

 for i := 0 to n-1 do

   for j := 0 to n-1 do

     a[i,j] := strtoint(sgA.Cells[j,i]);

 SetLength(b, n, n);

 for i := 0 to n-1 do

   for j := 0 to n-1 do

     b[i,j] := strtoint(sgB.Cells[j,i]);

 SetLength(c, n, n);

 QueryPerformanceFrequency(QPF);

 QueryPerformanceCounter(t1);

 for i := 1 to num do

   MSubRegular(a, n, n, b, n, n, c);

 QueryPerformanceCounter(t2);

 time_reg := (t2 - t1) / QPF;

 QueryPerformanceCounter(t1);

 for i := 1 to num do

   MSubMMX(a, n, n, b, n, n, c);

 QueryPerformanceCounter(t2);

 time_mmx := (t2 - t1) / QPF;

 for i := 0 to n-1 do

   for j := 0 to n-1 do

     sgC.Cells[j,i] := inttostr(c[i,j]);

 teTReg.Text := floattostr(time_reg);

 teTMMX.Text := floattostr(time_mmx);

end;

procedure TfrmMain.btnMulClick(Sender: TObject);

var

 n, num, i, j: Integer;

 a, b, c: TMatrInt;

 time_reg, time_mmx: extended;

 QPF, t1, t2: Int64;

begin

 n := seN.Value;

 num := seNum.Value;

 SetLength(a, n, n);

 for i := 0 to n-1 do

   for j := 0 to n-1 do

     a[i,j] := strtoint(sgA.Cells[j,i]);

 SetLength(b, n, n);

 for i := 0 to n-1 do

   for j := 0 to n-1 do

     b[i,j] := strtoint(sgB.Cells[j,i]);

 SetLength(c, n, n);

 QueryPerformanceFrequency(QPF);

 QueryPerformanceCounter(t1);

 for i := 1 to num do

   MMulRegular(a, n, n, b, n, n, c);

 QueryPerformanceCounter(t2);

 time_reg := (t2 - t1) / QPF;

 QueryPerformanceCounter(t1);

 for i := 1 to num do

   MMulMMX(a, n, n, b, n, n, c);

 QueryPerformanceCounter(t2);

 time_mmx := (t2 - t1) / QPF;

 for i := 0 to n-1 do

   for j := 0 to n-1 do

     sgC.Cells[j,i] := inttostr(c[i,j]);

 teTReg.Text := floattostr(time_reg);

 teTMMX.Text := floattostr(time_mmx);

end;

end. 

           

Тестовый пример

На рисунке 1 представлен снимок экрана, демонстрирующей работу разработанной программы при сложении матриц.

Рисунок 1 – Пример работы программы (сложение матриц)

На рисунке 2 представлен снимок экрана, демонстрирующей работу разработанной программы при вычитании матриц.

Рисунок 2 – Пример работы программы (вычитание матриц)

На рисунке 3 представлен снимок экрана, демонстрирующей работу разработанной программы при умножении матриц.

Рисунок 3 – Пример работы программы (умножение матриц)

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

Вывод

Для повышения быстродействия и качества работы программ  часто используются SIMD-расширения. Команды SIMD-расширений обеспечивают параллельную обработку нескольких байтов, слов или двойных слов. Однако следует отметить, что не во всех программах можно существенно увеличить эффективность за счет использования SIMD-расширений.


 

А также другие работы, которые могут Вас заинтересовать

80571. Анализ финансового состояния ООО «Транстехсервис» 191.37 KB
  Целью данной выпускной квалификационной работы является выявление и обоснование основных направлений совершенствования финансового состояния ООО «Транстехсервис» Исходя из цели исследования данного дипломного проекта, в работе поставлены следующие задачи: рассмотреть теоретические основы анализа финансового...
80572. Электрооборудование и электроснабжение электромеханического цеха 370.94 KB
  Организация проверки и наладки электрооборудования после монтажа или ремонта. Спецификация электрооборудования. Избыток тепла от электрооборудования и освещения. Для безопасного обслуживания электрооборудования находящегося на ферме моста устанавливают блокировочные контакты на люке и двери кабины.
80573. Розробка автономного недорогого універсального охоронного пристрою 1.1 MB
  Види систем охоронної сигналізації: охоронна система, яка у випадку спрацьовування будь-якого датчика активує сирену або строб-спалах; система сигналізації з підключенням до телефонної лінії. При появі сигналу тривоги по телефонній лінії передається заздалегідь записане голосове повідомлення...
80574. Проект благоустройства и озеленения территории при Новоайдарской районной больнице 3.98 MB
  Целью дипломной работы является создание проекта благоустройства и озеленения территории при Новоайдарской районной больницы. Актуальность темы состоит в том, что совмещению эстетических и практичесих свойств зеленых насаждений для улучшения микроклиматических и эстетических условий на территории больницы.
80575. Художественный мир прозы Захара Прилепина (на материале книг «Санькя» и «Грех») 560.5 KB
  Семантика заголовка произведения в контексте образа героя и проблематики. Необходимо остановиться на таких содержательных компонентах художественного мира произведения как сюжет и композиция стиль и язык идея и основные мотивы образ героя и система персонажей и т.
80577. Театрализованный конкурс «Мистер Академия Правосудия 2013» 2.91 MB
  На первый взгляд довольно простая и понятная схема, не вызывающая вопросов. Но на самом деле, множество вопросов и проблем возникает уже на самом первом этапе подготовки участников. Дело в том, что эти ребята в будущем юристы, прокуроры и судьи. И лишь единицы из них имеют хоть какой-то опыт выступления перед публикой.
80579. Формування системи мотивації персоналу підприємства 314 KB
  Актуальність теми дослідження. В умовах, що склалися в Україні на нинішньому етапі її розвитку, проблема мотивації особистості набула важливого значення, оскільки вирішення задач, які стоять перед суспільством, можливе лише за умови створення належної мотиваційної основи...