Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 2492
∙ повысить рейтинг »
_Ayl_
Статус: Профессионал
Рейтинг: 1865
∙ повысить рейтинг »
vladisslav
Статус: 6-й класс
Рейтинг: 1227
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Assembler (Ассемблер)

Номер выпуска:1358
Дата выхода:13.06.2010, 21:00
Администратор рассылки:Лысков Игорь Витальевич, Старший модератор
Подписчиков / экспертов:236 / 62
Вопросов / ответов:1 / 1
IRC-канал по теме:#assembler

Вопрос № 179011: Здравствуйте уважаемые эксперты! Помогите пожалуйста разобраться. В приложении код консольного приложения написанного на Delphi с асм-вставками. Суть в умножении элементов массива сначала как ...



Вопрос № 179011:

Здравствуйте уважаемые эксперты! Помогите пожалуйста разобраться. В приложении код консольного приложения написанного на Delphi с асм-вставками. Суть в умножении элементов массива сначала как бы стандартными командами, а потом с помощью MMX причем с определением или времени или количества циклов(не знаю) с помощью команды RDTSC. Так вот сами вопросы:
1. Что вообще делает команда RDTSC и почему здесь участвуют 32 разр. регистры?
2. Насколько я знаю, все MMX команды кроме умножения выполняются за один такт процессора(поправьте пожалуйста если не так). Тогда почему же MMX time в представленной программе больше, чем user time? Сначала я подумал, что может потому, что используется команда умножения, но я попробовал и такие как сложение и вычитание - во всех случаях MMX time больше... Или может я что-то не так понимаю.

Спасибо большое

Отправлен: 08.06.2010, 19:46
Вопрос задал: Мироненко Николай Николаевич, Практикант
Всего ответов: 1
Страница вопроса »


Отвечает 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;

__asm {
RDTSC
mov dword ptr [StartTime], eax
mov dword ptr [StartTime+4], edx
}

for( int i=0; i < 4; ++i )
rez = A[i]*B[i];

__asm {
RDTSC
mov dword ptr [EndTime], eax
mov dword ptr [EndTime+4], edx
}
printf( "User Time -> %lu\n", EndTime-StartTime );

__asm {
movq mm1, A
movq mm2, B
pmullw mm1, mm2
movq B, mm1
}

__asm {
RDTSC
mov dword ptr [StartTime], eax
mov dword ptr [StartTime+4], edx

movq mm1, A
movq mm2, B
pmullw mm1, mm2
movq B, mm1

RDTSC mov dword ptr [EndTime], eax
mov dword ptr [EndTime+4], edx
EMMS
}

printf( "MMX Time - > %lu\n", EndTime-StartTime );
return 0;
}

(Для компиляции использовался MSVC++ 6.0)

Успехов!

Ответ отправил: amnick, Студент
Ответ отправлен: 08.06.2010, 23:56
Номер ответа: 262018

Оценка ответа: 5
Комментарий к оценке:
Просто нет слов, СУПЕР. Спасибо Вам большое :)

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 262018 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное