Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3-й семестр / Организация ЭВМиС; Орлов С.А., Цилькер Б.Я

..pdf
Скачиваний:
422
Добавлен:
25.12.2020
Размер:
5.43 Mб
Скачать

Операционные устройства для чисел в форме с фиксированной запятой

211

 

 

2.Из ЧО вычитается делитель и анализируется знак остатка.

3.Если остаток положительный, то деление невозможно, формируется признак переполнения и процесс завершается, в противном случае ЧО восстанавливается путем прибавления делителя и деление продолжается.

4.Частичный остаток сдвигается на один разряд влево, а в освобождающийся при сдвиге младший разряд ЧО заносится очередная цифра делимого.

5.Из сдвинутого ЧО вычитается делитель и анализируется знак результата вычитания.

6.Очередная цифра модуля частного равна единице, когда результат вычитания положителен, и нулю, если отрицателен. В последнем случае ЧО восстанавливается до того значения, которое было до вычитания.

7.Пункты 4–6 последовательно выполняются для получения всех цифр модуля частного.

На рис. 5.46 показан процесс деления с восстановлением остатка, здесь число 41 делится на 7.

Рис. 5.46. Пример деления с восстановлением остатка

Деление без восстановления остатка

Недостаток описанного алгоритма — необходимость выполнения на отдельных шагах дополнительных операций сложения для восстановления частичного остатка.

212

Глава 5. Операционные устройства

 

 

Это увеличивает время выполнения деления, которое, к тому же, может меняться в зависимости от конкретного сочетания кодов операндов. В силу указанных причин реальные делители строятся на основе алгоритма деления с неподвижным делителем без восстановления остатка. В нем пункты 1–4 и 7 полностью совпадают с соответствующими пунктами предыдущего алгоритма деления, а пункты 5 и 6 имеют следующую формулировку:

1.Из сдвинутого ЧО вычитается делитель, если остаток положителен, и к сдвинутому частичному остатку прибавляется делитель, если остаток отрицательный.

2.Очередная цифра модуля частного равна единице, если результат операции (сложения или вычитания) положителен, и нулю, если он отрицателен.

Процесс деления без восстановления остатка для ранее рассмотренного примера демонстрируется на рис. 5.47.

Рис. 5.47. Пример деления без восстановления остатка

Деление чисел со знаком

Как и в случае умножения, деление чисел со знаком может быть выполнено путем перехода к абсолютным значениям делимого и делителя, с последующим присвоением частному знака «плюс» при совпадающих знаках делимого и делителя либо «минус» — в противном случае.

Деление чисел, представленных в дополнительном коде, можно осуществлять не переходя к модулям. Рассмотрим необходимые для этого изменения в алгоритме без восстановления остатка. Так как делимое и делитель не обязательно имеют одинаковые знаки, то действия с частичным остатком (прибавление или вычитание B) зависят от знаков ЧО и делителя. Если эти знаки совпадают, то в очередной итерации деления производится вычитание делителя, а очередной цифрой частного

Операционные устройства для чисел в форме с фиксированной запятой

213

 

 

будет 1. При разных знаках ЧО и делителя последний прибавляется к ЧО, и очередная цифра частного — 0.

По завершении деления может понадобиться коррекция результата, заключающаяся в увеличении частного на единицу. Такая коррекция производится в следующих случаях:

A > 0 и B < 0;

A < 0, B > 0 и R 0;

A < 0, B < 0 и R = 0.

При стандартном определении операции деления частное Q и остаток R отвечают

отношению A = Q × B + R, где остаток от деления 0 ≤ R < B . При таком определении возможны два вида остатка. Например, результат деления −42 на −5 может быть представлен как −42 = 9 × (–5) + 3 или −42 = 8 × (–5) + (–2), то есть остаток может быть 3 или –2. Для определенности в ВМ принято, что остаток всегда приводится к положительному числу, то есть если по завершении деления он отрицателен, к нему следует прибавить модуль делителя.

Устройство деления

Рассмотренный алгоритм деления без восстановления остатка может быть реализован с помощью устройства, схема которого приведена на рис. 5.48.

Рис. 5.48. Схема деления по алгоритму без восстановления остатка

Процедура начинается с занесения делимого A в 2n-разрядный регистр делимого (РгА), роль которого исполняют n-разрядный регистр остатка (РгR) и n-разрядный регистр частного (РгQ). В РгR заносятся старшие разряды делимого (Aст), а в РгQ — младшие (Амл). Делитель B записывается в n-разрядный регистр делителя (РгB). В счетчик циклов, служащий для подсчета количества полученных цифр частного, помещается исходное значение, равное числу итераций в процедуре деления.

На каждом шаге содержимое РгR и РгQ совместно сдвигается на один разряд влево. В зависимости от сочетания знаков частичного остатка (rn–1) и делителя (bn–1)

214

Глава 5. Операционные устройства

 

 

определяется значение очередной цифры частного и требуемое действие: вычитание или прибавление делителя. Знаки анализируются контроллером в соответствии

с выражением rn1 bn1 . Операция вычитания заменяется прибавлением делителя, взятого с обратным знаком и представленного в дополнительном коде. Изменение знака и преобразование в дополнительный код реализуется путем передачи делителя на вход сумматора инверсным кодом (инвертирование обеспечивают схемы исключающего ИЛИ на одном из входов сумматора) с последующим добавлением единицы к младшему разряду сумматора. Очередная цифра частного записывается в освободившийся при сдвиге младший разряд РгQ. Содержимое счетчика циклов уменьшается на единицу.

Процедура повторяется до исчерпания всех цифр делимого, о чем свидетельствует нулевое содержимое счетчика циклов. По окончании операции деления частное располагается в регистре частного, а в регистре остатка будет находиться остаток от деления.

На заключительном этапе, если это необходимо, производится корректировка полученного результата, как это предусматривает алгоритм деления чисел со знаком (цепи коррекции результата на схеме не показаны).

Ускорение целочисленного деления

Следует отметить, что операция деления предоставляет не слишком много путей для своей оптимизации по времени. Тем не менее определенные возможности для убыстрения деления существуют. В ряде случаев эффект достигается применением алгоритмов, сокращающих число итераций в процедуре деления. Ускорение деления может быть достигнуто и за счет более совершенной аппаратной реализации операции. Наилучшие результаты обычно дает сочетание обоих этих подходов. Ниже рассматриваются наиболее распространенные в настоящее время методы ускорения операции деления.

Алгоритм SRT

Свое название алгоритм SRT [68, 132, 157] получил по фамилиям авторов (Sweeney, Robertson, Tocher), разработавших его независимо друг от друга приблизительно в одно и то же время. Алгоритм представляет собой модификацию деления без восстановления остатка, где на каждом шаге помимо сдвига частичного остатка производится прибавление либо вычитание делителя. В SRT-алгоритме сдвиг ЧО также имеется в каждой итерации, однако сложение или вычитание, в зависимости от получающегося ЧО, на отдельных шагах может не выполняться, что, естественно, позитивно влияет на быстродействие устройства деления.

Алгоритм был ориентирован на операции над мантиссами чисел с плавающей запятой и опирается на то обстоятельство, что мантиссы в таких числах нормализованы. Впервые SRT-алгоритм был реализован в модели 91 вычислительной машины IBM 360. В настоящее время он широко применяется в блоках обработки чисел с плавающей запятой, в частности в микропроцессорах фирмы Intel.

Сначала рассмотрим алгоритм применительно к положительным целым числам. Делимое представляется (2n + 1)-разрядным числом, а делитель — n-разрядным.

Операционные устройства для чисел в форме с фиксированной запятой

215

 

 

Процедура деления начинается с удаления в делителе всех нулей, предшествующих старшей единице, то есть с операции, аналогичной нормализации мантиссы в числах с плавающей запятой. По той же аналогии будем в дальнейшем условно называть эту операцию нормализацией. Исключение k предшествующих нулей реализуется за счет сдвига делителя влево на k разрядов. На аналогичное число разрядов влево сдвигается и делимое. Далее выполняются n итераций, в которых вычисляются цифры частного и частичные остатки. Действия, выполняемые на i-й итерации, можно описать следующим образом:

 

 

1, если 2R(i1) B

 

 

 

 

0, если B

2R

(i

1)

< B

qi =

 

 

 

 

1, если 2R

(i1)

< −B

 

 

 

 

 

 

 

 

 

 

 

 

R(i) =

2Ri1 q B.

 

 

 

 

 

 

 

i

 

 

 

 

 

Обратим внимание на то, что частное представляется в избыточной системе счисления, где цифры частного могут иметь три значения: –1, 0, 1.

По завершении всех n итераций, если последний остаток отрицателен, выполняется коррекция этого остатка и полученного частного, для чего к остатку прибавляется делитель, а из частного вычитается единица с весом младшего разряда.

Последний момент в алгоритме — преобразование частного из системы {1, 0, 1} в систему {0, 1}, то есть в обычную двоичную систему.

На практике это выливается в следующую процедуру (при объяснении будем ссылаться на схему деления без восстановления остатка, приведенную на рис. 5.48). Делимое и делитель, представленные в дополнительном коде, размещаются в регистре делимого (РгА) и делителя (РгВ) соответственно. Дальнейшие действия можно описать следующим образом.

1.Если в делителе В имеются k предшествующих нулей (при В > 0) или предшествующих единиц (при В < 0), то производится предварительный сдвиг содержимого РгА и РгВ влево на k разрядов.

2.Для i от 0 до n–1:

если три старшие цифры частичного остатка в РгА совпадают, то qi = 0 и производится сдвиг содержимого РгА на один разряд влево;

если три старшие цифры частичного остатка в РгА не совпадают, а сам ЧО

отрицателен, то qi = –1, делается сдвиг содержимого РгА на один разряд влево и к ЧО прибавляется делитель;

если три старшие цифры частичного остатка в РгА не совпадают, а сам ЧО положителен, то qi = 1, выполняется сдвиг содержимого РгА на разряд влево

ииз ЧО вычитается делитель.

3.Если после завершения пункта 2 остаток отрицателен, то производится коррекция (к остатку прибавляется делитель, а из частного вычитается единица).

4.Остаток сдвигается вправо на k разрядов.

Описанную процедуру иллюстрирует пример, приведенный на рис. 5.49.

216

Глава 5. Операционные устройства

 

 

Рис. 5.49. Пример деления целых чисел по алгоритму SRT

На первом шаге для удаления предшествующих нулей делитель сдвигается на два разряда влево. Аналогично поступают и с ЧО, который вначале совпадает с делимым. Далее выполняется процедура, описанная выше в пункте 2. Операция вычитания В обеспечивается прибавлением делителя с противоположным знаком. Поскольку по завершении операции остаток отрицателен, производится его коррекция путем прибавления В. Одновременно частное уменьшается на единицу (эта операция показана в системе {1, 0, 1} , в которой представлено частное). Наконец, на последнем шаге форма представления частного меняется — переходит к представлению в стандартной двоичной системе.

В стандартном алгоритме деления без восстановления остатка помимо сдвига в каждой итерации выполняется операция сложения или вычитания. В варианте SRT, в зависимости от кодов операндов в отдельных итерациях, достаточно только сдвига, что, безусловно, ускоряет процесс деления. Согласно статистическим данным, в среднем число сложений и вычитаний при использовании этого алгоритма сокращается в 2,67 раза.

Представление частного в избыточной системе счисления

Наиболее распространенные методы ускорения операции деления основаны на применении алгоритмов, где частное представляется в избыточной системе счисления. Очередная цифра частного в избыточной системе счисления, в зависимости

Операционные устройства для чисел в форме с фиксированной запятой

217

 

 

от базы этой системы, соответствует двум или более цифрам в двоичном представлении частного, и для вычисления нужного количества двоичных цифр частного

иостатка требуется меньше итераций. В то же время реализация такого подхода ведет к усложнению аппаратуры делителя, в частности надстраивается логика определения операции, выполняемой в очередной итерации. Для этой цели в состав устройства деления включается специальная память, хранящая таблицу для определения необходимых действий (в зависимости от текущей комбинации цифр в частичном остатке и делителе). Тем не менее выигрыш в быстродействии оказывается решающим моментом. Так, в микропроцессорах Pentium при делении мантисс чисел с плавающей запятой используется алгоритм SRT с базой 4 (Radix-4), то есть частное сначала вычисляется с использованием цифр –2, –1, 0, 1, 2 с последующим преобразованием результата к стандартному двоичному представлению. В этом варианте выбор очередной цифры частного производится с помощью таблицы, состоящей из отдельных секций. Конкретную секцию определяют четыре старшие цифры делителя (после его нормализации). Входом в секцию служат шесть старших цифр частичного остатка. ЧО в каждой итерации сдвигается не на один, а на два разряда, то есть число итераций сокращается вдвое. В микропроцессорах Nehalem и Penryn фирмы Intel деление как целых чисел, так и мантисс чисел с плавающей запятой реализуется блоком, получившим название Fast Radix-16 Divider. Поскольку используется система счисления с основанием 16, блок способен обрабатывать сразу 4 бита за такт, благодаря чему новые микропроцессоры выполняют операции деления целых и вещественных чисел примерно в два раза быстрее, чем в рассмотренном выше варианте, в которых использовалось основание 4 (Radix-4)

иза один такт обрабатывались два бита.

Деление с использованием операции умножения

С появлением быстрых параллельных устройств умножения матричного и древовидного типа практическую значимость в плане ускорения операции деления получили алгоритмы, где эта операция сводится к умножениям, сложениям и сдвигам. Среди таких алгоритмов, прежде всего, следует упомянуть алгоритм Голдшмита (Robert Elliott Goldshmidt) и алгоритм Ньютона–Рафсона. Оба этих алгоритма особенно удобны при делении правильных дробей, в частности при делении мантисс в операциях с плавающей запятой.

Алгоритм Голдшмита

Этот алгоритм сводит операцию деления правильных дробей к последовательным операциям умножения. Представим операцию деления в следующем виде:

Q = A = A× F0 × F1 × F2 ×... .

B B × F0 × F1 × F2 ×...

На каждом шаге числитель и знаменатель умножаются на очередной постоянный множитель Fi, при этом величина отношения не меняется. Последовательность множителей Fi выбирается таким образом, чтобы результирующий знаменатель сходился к единице:

B ×F0 ×F1 ×F2 ×... 1.

218

Глава 5. Операционные устройства

 

 

Как следствие,

A×F0 ×F1 ×F2 ×... Q.

Поскольку речь идет о правильных дробях, то 0 < B < 1, и в качестве первого множителя F0 предлагается принять F0 = 2 B. Далее процесс деления сводится к рекуррентному вычислению очередной оценки числителя Ai + 1, знаменателя Bi + 1 и очередного множителя Fi + 1:

Ai + 1 = Ai × Fi ; Bi + 1 = Bi × Fi ; Fi + 1 = 2 Bi ,

где i = 0, …, k, A0 = A, B0 = B.

Вычисления прекращаются на k-м шаге, когда выполнится условие 1Bk ≤ ∆ (

допустимая погрешность вычислений).

Проиллюстрируем алгоритм на примере деления десятичных дробей с допустимой погрешностью вычислений = 0,001. Для A = 0,127 и B = 0,445 при заданной по-

грешности имеем Q =

0,127

 

= 0,285 . Деление в соответствии с алгоритмом Голдшми-

0,445

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

та можно описать следующим образом:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A0 = 0,127;

B0 = 0,445;

F0 = 1,555;

 

1 0,445

 

 

 

 

 

 

= 0,555 ≥ ∆;

 

 

 

 

 

 

 

1 0,692

 

 

 

= 0,308 ≥ ∆;

A1

= 0,197;

B1 = 0,692;

F1 = 1,308;

 

 

 

 

 

 

1 0,905

 

 

 

= 0,095 ≥ ∆;

A2

= 0,258;

B2

= 0,905;

F2 = 1,095;

 

 

 

 

 

1 0,991

 

 

= 0,009 ≥ ∆;

A3

= 0,283;

B3

= 0,991;

F3 = 1,009;

 

 

 

 

 

 

1 1

 

0,000 < ∆.

A4

0,285;

B4

1,000;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

После 4-й итерации (k = 4) условие завершения вычислений выполнено, поэтому Q = A4 0,285.

Метод Голдшмита используется в устройстве деления микропроцессора Athlon и последующих микропроцессорах фирмы AMD.

Алгоритм Ньютона—Рафсона

Идея алгоритма заключается в замене операции деления на B умножением делимого на величину, обратную делителю ( B1 ): Q = BA = A× B1 . В этом случае проблема

сводится к эффективному вычислению B1 . Задача решается методом Ньютона– Рафсона путем нахождения корня уравнения

f ( X ) = X1 B = 0,

то есть X = 1 . Решение может быть получено с привлечением рекуррентного соот-

ношения: Xi+1B = Xi (2 – Xi B). Начальное значение оценки X0 для нормализованного делителя (0,5 ≤ B < 1) вычисляется по формуле X0 = 2,9142 – 2B. Вычисление X завершается, когда будет выполнено условие X i+1 X i ≤ ∆ . Для 32-разрядных чисел

Операционные устройства для чисел в форме с фиксированной запятой

219

 

 

обычно достаточно четырех итераций, а для 64-разрядных — пяти. Поэтому можно считать, что реализация метода для n-разрядных чисел требует 2 log2 n −1 операций умножения.

Для иллюстрации метода воспользуемся примером из предыдущего раздела.

A0 = 0,127;

B0 = 0,445;

 

X0 = 2,024;

 

 

 

 

 

 

 

 

 

 

 

X1

= 2,225;

 

2,225 2,024

 

 

 

 

= 0,201 ≥ ∆;

 

 

 

 

 

 

 

 

 

 

 

2,247 2,225

 

 

 

 

 

= 0,022 ≥ ∆;

 

 

 

X2

= 2,247;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2,247 2,247

 

 

 

0,000 < ∆;

После третьей итерации имеем

1

X3

2,247;

 

 

 

 

 

 

 

 

 

 

 

 

= X3 = 2,247 и Q = 0,127 × 2,247 = 0,285.

B

 

 

 

 

 

 

 

 

 

 

 

 

Ускорение вычисления частичных остатков

Возможности данного подхода весьма ограничены и связаны в основном с ускорением операций сложения (вычитания). Способы достижения этой цели ничем не отличаются от тех, что применяются, например, при выполнении умножения. Это различные приемы для убыстрения распространения переноса, матричные схемы сложения и т. п.

Матричная схема деления

Для ускорения вычисления частичных остатков может быть применена матричная схема [7], показанная на рис. 5.50.

Рис. 5.50. Матричное устройство деления для алгоритма без восстановления остатка

220

Глава 5. Операционные устройства

 

 

В роли строк матрицы выступают n-разрядные параллельные сумматоры. В каждой следующей строке вычисляется очередной частичный остаток. Поскольку схема реализует алгоритм деления без восстановления остатка, сумматоры обеспечивают прибавление или вычитание делителя в зависимости от знака предыдущего ЧО. Как видно из рисунка, вычитание реализуется так же, как это было описано при рассмотрении операционного блока для сложения и вычитания (см. рис. 5.15), то есть путем прибавления делителя, взятого с обратным знаком и представленного в дополнительном коде. Результирующие частное и остаток будут представлены в дополнительном коде. Окончательный остаток не всегда верен и может нуждаться в коррекции.

Нетрудно заметить, что схеме присущ длинный тракт распространения переноса, что явно не способствует сокращению времени деления. Таким образом, матричное исполнение деления нельзя считать очень эффективным в плане быстродействия, хотя данный метод и выигрывает в сравнении с традиционным устройством деления. Основное достоинство матричной схемы заключается в ее регулярности, что удобно при реализации устройства в виде интегральной микросхемы.

Операционные устройства для чисел в форме с плавающей запятой

Операции над числами в форме с плавающей запятой (ПЗ) имеют существенные отличия от аналогичных операций в форме с фиксированной запятой, поэтому их обычно реализуют с помощью самостоятельного операционного устройства. Как и целочисленное ОПУ, операционное устройство для чисел в форме ПЗ как минимум должно обеспечивать выполнение четырех арифметических действий: сложения, вычитания, умножения и деления. Кроме того, в таких ОПУ в качестве стандартной предусмотрена также операция извлечения квадратного корня.

После принятия стандарта IEEE 754 негласным требованием ко всем ВМ является обеспечение операций с числами, представленными в форматах стандарта. Это требование не исключает использования в конкретной ВМ также иных форматов чисел с ПЗ, что обычно связано с сохранением совместимости с предыдущими моделями данной вычислительной машины.

Напомним основные положения записи чисел в стандарте IEEE 754 (рис. 5.51). Мантиссы чисел m представляются в нормализованном виде, при этом действует прием скрытого разряда, когда старшая цифра мантиссы, всегда равная единице, в записи числа отсутствует, то есть в поле мантиссы старшей является вторая цифра нормализованной мантиссы.

В отличие от общепринятого условия нормализации ½ ≤ |m| < 1, в стандарте IEEE 754 используется условие 1 ≤ |m| < 2.

Запись числа содержит смещенный порядок, то есть порядок, увеличенный на величину смещения, которое в стандарте IEEE 754 для одинарного формата равно 127, а для двойного — 1023.