Коротко из методички №2.




Операции сдвига, как и следует из их названия, осуществляют сдвиг операнда приемника вправо или влево на заданное число битов. Приемником может быть регистр или объект в памяти, источником – непосредственное значение, либо регистр cl.

Основное назначение операций сдвига – осуществление быстрого умножения и деления. Как в десятичной системе счисления дописывание нулей справа, т.е. сдвиг числа влево, соответствует умножению на 10, 100, 1000 и т.д., так в двоичной системе счисления дописывание нулей справа соответствует умножению на 2, 4, 8 и т.д. И наоборот, отбрасывание разрядов справа, т.е. сдвиг вправо, соответствует целочисленному делению на 10, 100, 1000 и т.д. в десятичной системе счисления и на 2, 4, 8 и т.д. - в двоичной. Поэтому практически всегда, когда в целочисленных расчетах встречается умножение или деление на константу, являющуюся целой степенью числа 2, они заменяются операциями сдвига. Кроме того, современные оптимизирующие компиляторы заменяют операции целочисленного умножения и деления на константу последовательностями сдвигов и сложений или вычитаний.

Для сдвигов беззнаковых операндов влево и вправо используются операции логического сдвига с мнемокодами shl и shr – соответственно, а для знаковых - операции арифметического сдвига с мнемокодами sal и sar – соответственно. Мнемокоды sal и shl соответствуют одной и той машинной операции, при которой на освободившиеся места справа записываются нули, и имеют различные обозначения только для симметрии. При логическом сдвиге вправо на освободившиеся места слева записываются нули, а при арифметическом – знаковый бит.

Например:

short i,j;

asm{

sal i, 4 // умножение числа i на 16

shr ax, 2 // деление содержимого рег ax на 4

mov ax, j

sal ax, 2

add j, ax // умножение числа j на 5

}

 

 

+ Панишева 32,33

+ Вадик 10692

 

Предсказание ветвлений

В любой более-менее сложной программе присутствуют команды условного перехода: «Если некое условие истинно — перейти к исполнению одного участка кода, если нет — другого». С точки зрения скорости выполнения кода программы современным процессором, поддерживающим внеочередное исполнение, любая команда условного перехода — воистину бич божий. Ведь до тех пор, пока не станет известно, какой участок кода после условного перехода окажется «актуальным» — его невозможно начать декодировать и исполнять (см. внеочередное исполнение). Для того чтобы как-то примирить концепцию внеочередного исполнения с командами условного перехода, предназначается специальный блок: блок предсказания ветвлений. Как понятно из его названия, занимается он, по сути, «пророчествами»: пытается предсказать, на какой участок кода укажет команда условного перехода, ещё до того, как она будет исполнена. В соответствии с указаниями «штатного внутриядерного пророка», процессором производятся вполне реальные действия: «напророченный» участок кода загружается в кэш (если он там отсутствует), и даже начинается декодирование и выполнение его команд. Причём среди выполняемых команд также могут содержаться инструкции условного перехода, и их результаты тоже предсказываются, что порождает целую цепочку из пока не проверенных предсказаний! Разумеется, если блок предсказания ветвлений ошибся, вся проделанная в соответствии с его предсказаниями работа просто аннулируется.

На самом деле, алгоритмы, по которым работает блок предсказания ветвлений, вовсе не являются шедеврами искусственного интеллекта. Преимущественно они просты… и тупы. Ибо чаще всего команда условного перехода встречается в циклах: некий счётчик принимает значение X, и после каждого прохождения цикла значение счётчика уменьшается на единицу. Соответственно, до тех пор, пока значение счётчика больше нуля — осуществляется переход на начало цикла, а после того, как он становится равным нулю — исполнение продолжается дальше. Блок предсказания ветвлений просто анализирует результат выполнения команды условного перехода, и считает, что если N раз подряд результатом стал переход на определённый адрес — то и в N+1 случае будет осуществлён переход туда же. Однако, несмотря на весь примитивизм, данная схема работает просто замечательно: например, в случае, если счётчик принимает значение 100, а «порог срабатывания» предсказателя ветвлений (N) равен двум переходам подряд на один и тот же адрес — легко заметить, что 97 переходов из 98 будут предсказаны правильно!

Разумеется, несмотря на достаточно высокую эффективность простых алгоритмов, механизмы предсказания ветвлений в современных CPU всё равно постоянно совершенствуются и усложняются — но тут уже речь идёт о борьбе за единицы процентов: например, за то, чтобы повысить эффективность работы блока предсказания ветвлений с 95 процентов до 97, или даже с 97% до 99…

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: