Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Чемпионы рейтинга экспертов в этой рассылке Номер выпуска: | 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 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий