

Кафедра Вычислительной Техники СПбГУ ИТМО
Лабораторная Работа №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 |