Вопрос № 179011: Здравствуйте уважаемые эксперты! Помогите пожалуйста разобраться. В приложении код консольного приложения написанного на Delphi с асм-вставками. Суть в умножении элементов массива сначала как ...
Вопрос № 179011:
Здравствуйте уважаемые эксперты! Помогите пожалуйста разобраться. В приложении код консольного приложения написанного на Delphi с асм-вставками. Суть в умножении элементов массива сначала как бы стандартными командами, а потом с помощью MMX причем с определением или времени или количества циклов(не знаю) с помощью команды RDTSC. Так вот сами вопросы: 1. Что вообще делает команда RDTSC и почему здесь участвуют 32 разр. регистры? 2. Насколько
я знаю, все MMX команды кроме умножения выполняются за один такт процессора(поправьте пожалуйста если не так). Тогда почему же MMX time в представленной программе больше, чем user time? Сначала я подумал, что может потому, что используется команда умножения, но я попробовал и такие как сложение и вычитание - во всех случаях MMX time больше... Или может я что-то не так понимаю.
Отвечает amnick, Студент :
Здравствуйте, Мироненко Николай Николаевич.
1. RDTSC (Read Time Stamp Counter) — ассемблерная инструкция для платформы x86, читающая счётчик TSC (Time Stamp Counter) и возвращающая в регистрах EDX:EAX 64-битное количество тактов с момента последнего сброса процессора. rdtsc поддерживается в процессорах Pentium и более новых. Опкод: 0F 31. В многозадачных операционных системах инструкция может быть превращена в привилегированную (установлен 3 бит в управляющем регистре CR4), и её использование приведет
к генерации исключения в программе. Подробнее... Intel
2. В документе "Intel® 64 and IA-32 Architectures Software Developer’s Manual. Instruction Set Reference" (часть 1, часть 2) вообще не сказано о времени выполнения (впрочем, и для других инструкций тоже). Время выполнения инструкции, обращающейся к памяти, зависит от того, загружены ли уже данные в кэш или нет (у Вас должны быть загружены), выровнены ли они требуемым образом, занята шина или нет (если данные еще не в кэше). Кроме того, Ваша программа выполняется в многозадачной
среде, может произойти переключение задач (впрочем, это маловероятно для Вашей программы), а RDTSC возвращает счетчик тактов независимо от выполняемого процесса.
Для того, чтобы повысить точность измерений, зациклите вычисления и воспользуйтесь функцией Win32 API GetThreadTimes.
За неимением Delphi, Я переписал Вашу программу на C++ и протестировал ее. Оказалось, что время выполнения MMX очень сильно зависит от типа переменной rez (double или целочисленный)
. Насколько я знаю (если мне не изменяет память), MMX инструкции выполняются в сопроцессоре. Небольшая вставка
Код:
__asm { movq mm1, A movq mm2, B pmullw mm1, mm2 movq B, mm1 }
перед
измерением времени выполнения MMX-кода привела к устранению зависимости от типа rez и время выполнения MМX стало стабильно меньше.
User Time -> 224 MMX Time -> 105
User Time -> 217 MMX Time -> 98
Вот код на C++ (почти C):
Код:
#include <stdio.h>
short A[4] = { 1,2,3,4 }; short B[4] = { 1,2,3,4 };
int main() { short rez; __int64 StartTime, EndTime;
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.