Форум: "Потрепаться";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
ВнизОб оптимизации Найти похожие ветки
← →
Anatoly Podgoretsky (2003-08-16 10:07) [0]Задачка из борландовской группы, сказать не измеряя данный код о времени выполнения двух идетничных кусков, в которых только переставлены местами команды, одинаковое время или разное, если разное, то какой код быстрее.
1.
sub eax,esi
add eax,$10
2.
add eax,$10
sub eax,esi
← →
ZZ (2003-08-16 10:27) [1]2ой вариант быстрее однозначно :))
← →
clickmaker (2003-08-16 13:24) [2]Но 1ый красивее :))
← →
SergP (2003-08-16 14:56) [3]
> clickmaker © (16.08.03 13:24) [2]
> Но 1ый красивее :))
Чем?
← →
Calm (2003-08-16 15:10) [4]
> одинаковое время или разное, если разное, то какой код быстрее
Может это шутка и время одинаковое?
← →
Романов Р.В. (2003-08-16 15:14) [5]По моему одинаковое время
← →
KSergey (2003-08-16 15:17) [6]Calm © (16.08.03 15:10)
Может это шутка и время одинаковое?
Я не знаю, но может с конвейером команд какая-нибудь хитрость?
← →
Anatoly Podgoretsky (2003-08-16 16:24) [7]KSergey © (16.08.03 15:17) [6]
С ними
← →
Calm (2003-08-16 16:47) [8]2 Anatoly Podgoretsky © (16.08.03 16:24) [7]
А вы знаете ответ?
Очень интересно. Если никто за неделю правильного ответа не даст, Вы уж скажите, пожалуйста.
← →
app (2003-08-16 17:05) [9]Calm © (16.08.03 16:47) [8]
Мне самому было интерсно про это прочитать, ведь абсолютно одинаково, a-b+10 и a+10-b
Вот разъяснение от Дениса Христенсена
Оба этих примера имеют зависимость на EAX регистр.
Но пример 2 читает из esi позже чем в примере 1.
Если ESI бул загружен сразу перед этими строками, то пример номер 2 будет работать быстрее, чем пример номер 1 поскольку сложение add eax, constant бужет загружено в конвейер вместе с предыдущей загрузкой ESI.
Пример:
1: mov esi, something // зависимость на something, возможна задержки на загрузки из памяти
2: sub eax, esi // ожидание загрузки esi
3: add eax, 10 // ожидание до завершения eax
сравниваем с:
1: mov esi, something // зависимость на something, возможна задержки на загрузки из памяти
2: add eax, $10 // нет зависимости с предыдущей инструкцией, можно выполнить паралельно
3: sub eax, esi // зависимость до eax и esi завершения.
Тут мы видим в ответе еще одну инструкцию в обоих примерах, mov esi, something, без которой не объяснить почему и это также пример как не надо задавать вопросы, в первоначальном вопросе эта информация отсутствовала, но добавление не портит ответа, в обоих случаях код одинаковый, но поменяны местами две команды и это говорит о важности учета зависимойтей и возможного паралельного выполнения команд.
← →
Skier (2003-08-16 18:23) [10]Классно. Весьма и весьма познавательно.
>app © (16.08.03 17:05) [9]
А нет ли какой поправки у Христенсена касающейся процессоров
с технологией HyperThreading ? Или в данном случае она [HyperThreading] не будет играть роли ?
← →
Anatoly Podgoretsky (2003-08-16 18:51) [11]С HyperThreading пока ничего ясного.
← →
Dionys (2003-08-17 00:23) [12]AGI
AGI — это ситуация, при которой регистр, используемый командой для генерации адреса как базовый или индексный, был приемником предыдущей команды. В этой ситуации процессор тратит один дополнительный такт. Последовательность команд
add edx,4
mov esi,[edx]
выполняется с AGI на любом процессоре.
Последовательность команд
add esi,4 ; U-конвейер - 1 такт (на Pentium)
pop ebx ; V-конвейер - 1 такт
inc ebx ; V-конвейер - 1 такт
mov edi,[esi] ; в U-конвейер - *AGI*, затем 1 такт
выполняется с AGI на Pentium за три такта процессора.
Кроме того, AGI может происходить неявно, например при изменении регистра ESP и обращении к стеку:
sub esp,24
push ebx ; *AGI*
или
mov esp,ebp
pop ebp ; *AGI*
но изменение ESP, производимое командами PUSH и POP, не приводит к AGI, если следующая команда тоже обращается к стеку.
Процессоры Pentium Pro и Pentium II не подвержены AGI.
(C) С.В.Зубков Ассемблер для DOS, Windows и Unix
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c