Кафедра Вычислительной Техники СПбГУ ИТМО

Лабораторная Работа №2 «Введение в технологию MMX»

Выполнил: Раевский С.С. гр. 2103

- Санкт-Петербург 2011 –

Раевский Сергей Сергеевич, группа 2103

1

Кафедра Вычислительной Техники СПбГУ ИТМО

Цель работы:

Изучить основы технологии MMX и написать программы с использованием этой техноогии.

Сравнить эффективность использования этой технологии и стандартных средств

(for(;;), movsd)

Исходный текст программы на языке C:

//

// ASM Lab 2 - Copyng arrays by for(;;), movsd and MMX

//

#include "stdafx.h" #include <stdlib.h> #include <ctime>

const int ARRAYSIZE = 10485760; const int TIMES = 100;

int a1[ARRAYSIZE]; int a2[ARRAYSIZE];

// Simpliest method void SimpleCopy()

{

for (int i=0; i<ARRAYSIZE; i++)

{

a1[i]=a2[i];

}

}

// Assembler method void ASMCopy()

{

unsigned int p1 = (unsigned int)&a1[0]; unsigned int p2 = (unsigned int)&a2[0];

__asm

{

mov esi, p1 mov edi, p2

mov ecx, ARRAYSIZE

rep movsd

}

}

Раевский Сергей Сергеевич, группа 2103

2

Кафедра Вычислительной Техники СПбГУ ИТМО

// MMX method void MMXCopy()

{

unsigned int p1 = (unsigned int)&a1[0]; unsigned int p2 = (unsigned int)&a2[0];

__asm

{

mov esi, p1 mov edi, p2

mov ebx, 0

mov ecx, ARRAYSIZE

shr ecx, 1 // because array elem = 4 byte // and mmx regisrter = 8 byte

_loop:

movq mm0, [esi+ebx] movq [edi+ebx], mm0 add ebx, 8

//Yeah, i know about loop

//instruction, but it works 2 times slowly,

//dont know why

dec ecx jnz _loop

emms // Switching to default FP mode

}

}

// Copies array with method MethodDelegate for TIMES void CopyBy(void (*MethodDelegate)(void))

{

for (int i=0; i<TIMES; i++)

{

MethodDelegate();

}

}

Раевский Сергей Сергеевич, группа 2103

3

Кафедра Вычислительной Техники СПбГУ ИТМО

// Timing function

void CalcTime(char *MethodName, void (*MethodDelegate)(void))

{

printf("Calculating execution time \\w method \"%s\"...\n", MethodName);

// Begin time

clock_t Time = clock();

// Copyng

CopyBy(MethodDelegate);

// End time - Begin Time

Time = clock() - Time;

printf("Timer ticks=%d\n\n", Time);

}

int _tmain(int argc, _TCHAR* argv[])

{

// Randomizing array srand(time(0));

for (int i=0; i<ARRAYSIZE; i++)

{

a1[i] = rand();

a2[i] = rand();

}

// So, now copyng arrays by simpliest method...

CalcTime("SimpleCopy", SimpleCopy);

// ...and assembler...

CalcTime("ASMCopy", ASMCopy);

// ...and MMX.

CalcTime("MMXCopy", MMXCopy);

printf("All done.\n");

// Exit system("pause"); return 0;

}

Раевский Сергей Сергеевич, группа 2103

4

Кафедра Вычислительной Техники СПбГУ ИТМО

Результаты работы программы:

Результат работы с отключенной оптимизацией (/Od):

Calculating execution time \w method "SimpleCopy"...

Timer ticks=8219

Calculating execution time \w method "ASMCopy"...

Timer ticks=4172

Calculating execution time \w method "MMXCopy"...

Timer ticks=4281

All done.

Для продолжения нажмите любую клавишу . . .

Результат работы с полной оптимизацией (/Ox):

Calculating execution time \w method "SimpleCopy"...

Timer ticks=4563

Calculating execution time \w method "ASMCopy"...

Timer ticks=4484

Calculating execution time \w method "MMXCopy"...

Timer ticks=4438

All done.

Для продолжения нажмите любую клавишу . . .

Описание использованных MMX команд:

movq выполняет пересылку 8 байт (регистр память, память регистр или регистр регистр). Например, в программе инструкция movq mm0, [esi+ebx] помещает 8 байт из памяти начиная с адреса esi+ebx в регистр mm0 (8 байтный MMX регистр).

Выводы по работе программы:

Из приведенных результатов работы видно, что movsd и MMX справляются с заданием за примерно одинаковое время. В этом нет ничего удивительного, ведь movsd делает практически те же шаги, что и процедура MMXCopy() (изменение esi, edi). Низкая производительность SimpleCopy() объясняется по видимому тем, что используется переменная в памяти для хранения счетчика (об этом говорят ассемблерные листинги,

Раевский Сергей Сергеевич, группа 2103

5

Кафедра Вычислительной Техники СПбГУ ИТМО

выдаваемые компилятором). При включенной оптимизации, ассемблерный код этой функции практически повторяет ASMCopy().

Вопросы:

1. На каком главном принципе основана технология ММХ ?

В технологии MMX использована модель обработки данных SIMD (single instruction, multiple data, т.е. одна команда - много данных). Это повышает производительность программ, поскольку одна команда обрабатывает несколько элементов данных одновременно. MMX-команды обеспечивают параллельную обработку нескольких байтов, слов или двойных слов.

2.С какими типами данных работают ММХ команды ?

Команды технологии MMX работают со следующими типами данных:

упакованные байты (восемь байтов в одном 64-разрядном регистре)

упакованные слова (четыре 16-разрядных слова в 64-разрядном регисте)

упакованные двойные слова (два 32-разрядных слова в 64-разрядном регистре)

64-разрядные слова.

По-английски эти типы данных называются, соответственно, packed byte, packed word, packed doubleword и quadword.

3.Какая команда обеспечивает переход процессора из режима исполнения MMX- команд в режим исполнения обычных команд с плавающей запятой?

MMX-команды исполняются в том же режиме процессора, что и команды с

плавающей запятой. Поэтому при исполнении всех MMX-команд (кроме EMMS) "портится" слово состояния регистров с плавающей запятой. Команда EMMS обеспечивает переход процессора от исполнения MMX-команд к исполнению обычных команд с плавающей запятой: она устанавливает значение 1 во всех разрядах слова состояния. Заканчивайте командой EMMS любой фрагмент программы, в котором есть MMX-команды. Если этого не делать, то

операции с плавающей запятой будут давать неверные результаты;

иногда в результате операций с плавающей запятой будут генерироваться исключения типа Stack overflow.

4.Что делает команда movq mm0, [esi+ebx] ?

Инструкция movq mm0, [esi+ebx] помещает 8 байт (quadword) из памяти начиная

садреса esi+ebx в регистр mm0 (8 байтный MMX регистр).

Раевский Сергей Сергеевич, группа 2103

6

Соседние файлы в папке лабораторные работы (отчеты) по ассемблеру