BC/NW 2007, №2, (11) :7.2
о возможности обобщения параллельной
модулярной арифметики
для работы с двоичными дробями.
Ш. А.Оцоков
(Москва, Московский Энергетический Институт (ТУ),
Россия)
Эффективность решения многих
вычислительных задач на ЭВМ зависит от быстродействия и точности вычислений с
плавающей точкой. Быстродействие
вычислений с плавающей точкой ограничивается необходимостью учета межразрядных
переносов, возникающих при сложении, вычитании и умножении чисел.
В модулярной системе счисления
(МСС) арифметические выполняются без переносов по нескольким выбранным модулям.
Благодаря чему существует возможность ускорения вычислений с многоразрядными
числами за счет их распараллеливания по
нескольким модулям [1]. Однако, МСС
ориентирована на проведение целочисленных вычислений и поэтому применяется при решении
специализированных задач цифровой обработки сигналов, в помехозащищенном
кодировании и др.
Цель настоящей работы обобщить
арифметику МСС для работы с двоичными дробями и тем самым расширить область её
применения. Для описания предложенных
алгоритмов работы с дробями рассмотрим
представление двоичных дробей в МСС.
Известно, что любую двоичную дробь можно представить в
следующем виде:
, (1)
где
целая часть числа,
некратная двум.
дробная часть числа, .
Пусть произведение простых модулей МСС, такое,
что
, (2)
где
-
максимально возможное значение.
Условие (2) обеспечивает представление отрицательных
чисел в МСС.
В МСС число по модулю будет иметь следующий вид:
Восстановить число по
его модулярному представлению при
условии (2) можно, если:
- определить знаменатель .
- умножить знаменатель на по
модулю и
получить числитель .
Определение
знаменателя
В процессе сложения, вычитания и
умножения двоичных дробей возможны сокращения числителя и знаменателя
на числа, которые являются степенями двойки. Для их обнаружения нужна проверка
делимости числителя на числа вида 2t, (t>=1)
Необходимо, чтобы эта проверка осуществлялась как можно быстрее, т.к. в
противном случае применение модулярной арифметики не даст какого-либо эффекта
ускорения вычислений.
Один из эффективных способов
обнаружения делимости числителя – применение арифметики кодов Гензеля по модулю
два [2]. Вычисления проводятся с
двоичными дробями в модулярной арифметике и в кодах Гензеля параллельно и
независимо друг от друга. Делимость
числителя проверяется с помощью свойства
кодов Гензеля: если в мантиссе кода Гензеля
t
младших разрядов нулевые, то числитель имеет делитель 2t . Коды Гензеля
характеризуются двумя параметрами: модулем и длиной мантиссы. Так как
вычисления проводятся с двоичными дробями, то модуль должен быть равным двум,
если код Гензеля имеет s-разрядную мантиссу, то это означает, что может обнаружен делитель числителя вида 2t, где (t<=s). Если в процессе
выполнения арифметических операций с двоичными дробями получен код
Гензеля с нулевой мантиссой, тогда необходимы преобразование предыдущего
результата арифметических операций из МСС в дробь, коррекция соответствующего ему кода Гензеля,
увеличение длины мантиссы.
Предложен следующий формат представления двоичных дробей
(рис 1).
m1 |
… mN |
H |
Рис. 1. Формат представления двоичной дроби
На рис.1 поля m1, … mN – это значения в МСС по модулям
m1, … mN соответственно, а поле
Н – это код Гензеля числа .
Переполнение, округление в МСС
Неравенство (2)
определяет диапазон представимых двоичных дробей в МСС. Если в результате вычислений получена дробь, выходящая за пределы
допустимого диапазона, то возникает ошибка переполнения и необходимо округление результата. Один из известных способов обнаружения
переполнения в модулярных вычислениях основан на методе нулевизации,
разработанный Акушским И.Я [1]. Для его
реализации необходимо выбрать дополнительный модуль mN+1 удовлетворяющий
условию:
( m1 ×…× mN mod mN+1 )-1
mod mN+1 º 1.
Увеличение количества модулей с одной стороны дает
возможность расширить диапазон представления двоичных дробей и уменьшить
количество возможных округлений в процессе вычислений, с другой стороны при
заданном диапазоне уменьшить величину
самих модулей. Последнее можно
использовать для ускорения вычислений путем совмещения модульных операций. Если
модули невелики можно заранее вычислить результаты выполнения
последовательности
2-х арифметических операций для всевозможных входных данных и за один такт их
выполнить. Рассмотрим правило
округления двоичных дробей.
Правило округления числа А
1.
По коду Гензеля
числа А
(поле Н рисунок 1) определение знаменателя А и
преобразование его в МСС
2.
Умножение
модулярного представления числа А ( поля
m1, … mN рис. 1) на результат в п.1
3.
Преобразование
модулярного представления числа А ( поля
m1, … mN рис. 1) в позиционную систему счисления.
4.
Округления
результата, полученного в п.3. до ближайшего целого, принадлежащему допустимому
диапазону представления двоичных дробей.
Округление в МСС отличается от округления в позиционной системе счисления,
тремя дополнительными операциями (пункт 1-3). Существуют различные способы
ускорения их выполнения, поэтому можно считать, что время округления в МСС не сильно отличается
от времени округления в ПСС.
Для уменьшения количества округлений в процессе
вычислений необходимо увеличить величину каждого из модулей или их количество в
соответствие с неравенством:
m1 ×…× mN > (K max)V,
где
V - характеризует параметр, показывающий какое
количество арифметических операций умножения можно провести без округлений.
Модель вычислений с двоичными дробями представлена на
рис.2.
В соответствии с этой моделью исходные данные,
решаемой задачи – Х, преобразуются в СОК по заданным модулям р1,…,рN и коды Гензеля. Далее проводятся вычисления по
правилам модулярной арифметики и кодов Гензеля. После выполнения каждых арифметических операций
результат округляется. Если в ходе вычислений возникает ошибка
переполнения, т.е. , то результат корректируется и вычисления продолжаются. Конечные результаты вычислений преобразуются
в двоичные дроби Y.
Рис. 2 . Модель вычислений с двоичными дробями.
Деление
двоичных дробей сводится к преобразованию в позиционную систему счисления делителя,
нахождению его обратного,
преобразования в МСС и умножения на делимое. Недостатком МСС является сложность деления
чисел. Поэтому модулярные вычислений с двоичными дробями будут эффективны в
задачах с минимальным количеством делений. В целях ускорения целесообразно
заменять операцию деления где это возможно на операцию умножения, например,
если деление производится на некоторые заданные константы.
Ниже представлены правила сложения/вычитания и умножения двоичных дробей в МСС.
Сложение / вычитание
Входные данные:
Х1 mod m1, Х1
mod m 2,
…, Х1 mod m N
Х2 mod m 1, Х2
mod m 2,
…, Х2 mod m N
H(2,r, Х1 ), H(2,r, Х2 ) – коды Гензеля
чисел Х1 и Х2
Выходные данные:
Сумма /разность чисел Y1=
Х1 ± Х2 .
Y1 mod m 1, Y1
mod m 2, …, Y1 mod m N
H(2,r, Y1 ) – код Гензеля Y1 суммы/разности чисел Х1 и Х2
1. Определяется сумма/разность H(2,r, Y1 ) = H(2,r, Х1 )
± H(2,r, Х2 )
2. Определяются значения выражений Y1 как сумма/разность
чисел Х1 и Х2 по
модулям m1, m 2,
…, m N
Умножение
Входные данные:
Х1 mod P1, Х1
mod P2,
…, Х1 mod PN
Х2 mod P1, Х2
mod P2,
…, Х2 mod PN
H(2,r, Х1 ), H(2,r, Х2 ) – коды Гензеля
чисел Х1 и Х2
Выходные данные:
Произведение чисел Y1=
Х1 ± Х2 .
Y1 mod P1, Y1
mod P2, …, Y1 mod PN
H(2,r, Y1 ) –
код Гензеля Y1 произведения чисел Х1 и Х2
1. Определяется
произведение H(2,r, Y1 ) = H(2,r, Х1 )*
H(2,r, Х2 )
2. Определяются
значения выражений Y1 как
произведение чисел Х1 и Х2 по модулям
m1, m 2,
…, m N
ВЫВОДЫ
В статье обобщены
алгоритмы многомодульной арифметики для работы с двоичными дробями.
Перспективным направлением дальнейшей работы
является исследование возможностей реализации методов решения дифференциальных
уравнений Рунге-Кутта, Эйлера и других численных методов на основе
многомодульной арифметики двоичных дробей на процессорах многоядерной
архитектуры.
Литература
1. Акушский И.Я, Юдицкий. Д.И.
Машинная арифметика системы остаточнх классов. – М.: 1968.
2. Грегори Р., Кришнамурти Е.
Безошибочные вычисления. Методы и приложения: Пер. с англ. – М.: Мир, 1998.