Реализация «Длинных вычислений» на параллельных структурах

УДК 681.3

РЕАЛИЗАЦИЯ «ДЛИННЫХ ВЫЧИСЛЕНИЙ» НА ПАРАЛЛЕЛЬНЫХ СТРУКТУРАХ

© 2008 г. В.Е. Золотовский, М. Ф. Гильванов

Предлагаются методы построения базовых параллельных вычислительных структур операций сложения, вычитания, умножение, ориентированных на представлении данных в коде c большой разрядностью (n ^ ж). Предложен метод представления чисел с большой разрядностью, основанный на разбиении на группы. Рассмотрены вычислительные структуры основных алгебраических операций и их схемотехнические решения. Показаны преимущества в быстродействии данного метода, по сравнению с существующими на сегодняшний день решениями.

The methods offormation of base parallel calculating structure operations of adding, subtraction, multiplication aligned on the presentation of data in code with big capacity (n ^ ж) are proposed. The method of presentation of numbers with big capacity rested on the fragmentation on groups is offered. Calculating structures of basic algebraic operations and their schematic solutions are viewed. The advantage in performance of this method in comparison with existed solutions this day is achieved.

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

Введение

В последние годы во всем мире усиливается ориентация разработчиков специзделий на сокращения цикла проектирования и производства, при достижении максимальной эффективности (высокое быстродействие и точность при достаточно малом объёме в конкретном приложении). Данное направление получило условное название «системы на кристалле». В качестве базы используются ПЛИС.

Существуют несколько способов повышения производительности вычислений. Основные из них приведены ниже.

1. Конвейеризация вычислений. Недостатком этого решения является потеря времени на заполнение конвейера при обратных связях, а также значительное число соединительных шин при параллельных вычислениях, что серьезно усложняет внедрение конвейерных схем [1, 2].

2. Последовательные вычислители. Все вычисления ведутся в последовательном коде. Это позволяет организовать непрерывный конвейер вычислительных операций по одному каналу. Для повышения производительности каналов может быть несколько. Однако в обычной двоичной системе счисления результат получается лишь после пробега всех разрядов. Это ведёт к тому, что в общем случае, например при умножении, приходится сохранять все 2п разрядов. При «длинных» вычислениях это существенно ограничивает её применение. Эффективность последовательных вы-

числителей может быть существенно увеличена при использовании систем счисления «без переносов». В таких системах перенос распространяется не более чем через разряд и все операции можно вести, начиная со старших разрядов, при сохранении длительности цикла вычисления для всех операций [3-6].

3. Распараллеливание, путем параллельной работы микроопераций над группами разрядов.

В работе предлагается способ повышения быстродействия вычислителей, удобный по своей реализации на ПЛИС - реализация параллельных вычислительных структур в коде «опережающий перенос». Он представляет собой схемотехническое решение, в результате которого время работы вычислителя слабо зависит от разрядности операндов. Другими словами, время, затрачиваемое, например, на сложение чисел с малой (4-8 бит) разрядностью, практически не будет отличаться от времени, затрачиваемого на сложение чисел с высокой (128-256 бит) разрядностью. Актуальность данной тематики не подвергается сомнению, особенно если ставится вопрос о реализации сверхточных вычислений, оперирующих с числами большой разрядности.

Постановка задачи исследования

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

Представление данных в коде «опережающий перенос»

Основная идея заключатся в том, что исходное число, содержащее n разрядов (при n > 64 будем называть его поле бит или просто поле), разбивается на группы разрядностью m (m << n). В результате такого разбиения получим число (рис. 1), представленное

l = ] П/т [

группами (округление в большую

сторону) [7]. Если же l получается не целым, тогда справа или слева в зависимости от формы представления числа добавляются либо нули, либо 1. Каждой группе при этом добавляется дополнительный старший разряд, имеющий значение (-1), для того чтобы перенос не пробегал от точки возникновения до начала числа.

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

Пример. Пусть дано число

X = +53611 = (1101000101101011) 2 при n = 16.

Необходимо представить в коде «опережающий перенос» с т = 4 битами в группе. Тогда представленное число примет вид

X = 0.1101 0.0001 0.0110 0.1011.

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

Нормализация результата. Нормализация (NOR) -обратный перевод числа, представленного в коде «опережающий перенос» в привычную всем двоичную систему счисления. Следует заметить, что результатом любой операции в коде «опережающий перенос» значения дополнительных разрядов может принимать одно из двух значений: либо 0, либо -1. Поэтому для осуществления обратного перевода, достаточно избавиться от -1 в дополнительных разрядах.

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

Приведем пример. Необходимо нормализовать следующее число Z =0.1100 1.1101 1.0011. Произведем нормализацию. Выделяем дополнительные разряды. Тогда имеем Y = - 0.0001 0001 0000. Соответственно число Y в дополнительном коде = 1.111011110000. Число 2доп = 0.110011010011.

Суммируя число 2поп с , найдем результат в исходном двоичном формате:

0.1100 1101 0011

1.11101 111 0000

+-

0.1011 1100 0011

Получим Znor = 0.1011 0.1100 0.0011. В результате нормализации все дополнительные разряды обращаются в 0, поэтому их можно опустить и записать в двоичной системе счисления Z = 0.101111010011.

Теоретическая задержка на выполнение нормализации в данном примере составит 5 условных тактов (1 условный такт на выполнение 1-го пробега переноса). В общем случае задержка составит (m+1) условных тактов.

Выполнение арифметических операций в коде «опережающий перенос»

Операции суммирования ADD. Пусть необходимо реализовать операцию сложения ADD двух чисел.

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

... Поле бит n

j_I_I

Поле бит разбитое на группы

Знак  1  Группа 1 Группа [ ... 1 Группа 1 ' 1

1 г 1 < 1 / Поле в формате кода / 1 \ «опережающий перенос» / 1 ^ ! 1 \ /

Знак Группа Доп. разряд Группа Доп. разряд Группа

Рис. 1. Представление числа в коде «опережающий перенос»

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

X = 0.0101 0.0001 0.0110 0.1011 0.1110 0.0010 0.0111 0.1100 и

Y = 0.0011 0.0011 0.0111 0.1001 0.0111 0.0000 0.0010 0.1011 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1

0.0111

X = 0.0101 0.0001 0.0110 0.1011 0.1110 0.0010 Y = 0.0011 0.0011 0.0111 0.1001 0.0111 0.0000 0.0010

0.1100 0.1011

Z = 0.1001 1.0101 1.1110 0.0101 0.0110 1.0011 1.1010 0.0111

Как мы уже заметили выше, исходные числа могут содержать в дополнительных разрядах либо 0, либо -1. Тогда как при сложении значение в дополнительных разрядах может достигать от 0 до -3. То есть после каждого суммирования требуется коррекция результата. Поэтому под суммирование будет отводиться 2 такта. В первом формируется промежуточная сумма, а во втором коррекция результата.

Если бы мы выполняли операцию сложения традиционным способом, то сложение двух 32-битных чисел заняло бы 32 условных такта (1 условный такт на выполнение 1-го пробега переноса). Выполняя же операцию сложения в коде опережающий перенос над операндами, представленными 8 группами по 4 разряда, получаем, что максимальная задержка составит 5 условных такта (4 такта на сложение в группе + 1 такт на дополнительный разряд).

С учетом того, что еще необходимо произвести коррекцию, задержка увеличится еще на 5 условных тактов. При этом теоретический выигрыш составит 32/10 примерно в 3 раза.

Коррекция результата COR80. В связи с тем что после суммирования значение дополнительных разрядов достигает от 0 до -3, после каждого суммирования необходимо производить коррекцию результата. Коррекция выполняется практически так же, как и нормализация, - вычитанием значения дополнительного разряда младшей группы из ближайшей старшей группы. При этом вычитание заменяется сложением с дополнением дополнительного разряда.

Приведем пример операции коррекции COR. Пусть мы сложили два числа X и Y.

X = 0.1100 -1.1110 -1.0001; Y = 0.0001 - 1.0001 -- 1.0010. Результатом сложения этих двух чисел стало Z = 0.1110 -2.0000 -3.0011. Так как в коде «опережающий перенос» в дополнительном разряде может быть либо 0 либо -1, необходимо избавиться от -2 и -3 в дополнительных разрядах. Произведем коррекцию

+ 0.1110 0.0000 0.0011 1.1110 1.1101

Получим скорректированный результат 2сог =

= 0.1100 1.1101 0.0011. Как уже было упомянуто

выше, задержка на коррекцию составила 5 условных тактов (4 такта на сложение в группе + 1 такт на дополнительный разряд).

Вычитание. Операция NEG -смена знака у числа. Для выполнения вычитания, как и во всех случаях, принято заменять операцию вычитания операцией сложения с дополнительным кодом вычитаемого. То есть вместо того чтобы реа-лизовывать А-В, достаточно выполнить А+(-В). Операция, приводящая число В -> (-В), обозначается NEG. Таким образом, для получения дополнения числа, в силу аддитивности разрядов, достаточно представить в дополнительном коде каждую группу числа.

Пример X = 0.0001 0.1110 0.1001 тогда -X = = -1.1111 -1.0010 -1.0111

Построение умножителя в коде «опережающий перенос»

Умножение в коде «опережающий перенос» можно получить, вычислив сумму частных произведений множимого на группы множителя, начиная со старшей группы с учетом их весов. При умножении группы на группу разрядность результата увеличивается в 2 раза. Таким образом, результат перемножения групп должен быть представлен двумя группами. Результат разбивается на две части - младшую и старшую. В старшей части дополнительный разряд формируется автоматически, а в младшей группе всегда равен 0.

Общее время умножения определяется как время, затрачиваемое на формирование частичных произведений и время суммирования частичных произведений (рис. 2).

А1

АО

В1

ВО

В1хА1

В1хА1

+ + +

В1хА0 В1хА0

А1хВ0 А1ХВ0

ВОхАО ВОхАО

R3

R2

R1

R0

0.1100 1.1101 0.0011

Рис. 2. Организация умножения в коде «опережающий перенос»

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

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

Количество сумматоров, необходимых для получения произведения при длине поля в п групп, будет равно

N = 2х(3 + 5 + 7 + 9 +... + (2п -1)) = 2(п2 -1) .

Разрядность же каждого из сумматоров равна числу разрядов в группе.

Следует подчеркнуть, что время получения окончательного произведения определяется задержкой сигнала в столбце с максимальным числом сумматоров. Поэтому общее время формирования произведения получится Т= (2п - 1)ту + хм , где хЕ - время

- время произведения

получится Т= (2п - 1) х Е +1 суммирования двух групп; тм

группы на группу; п - число групп в операнде.

Можно заметить, что сложение групп в способе, описанном выше, происходят последовательно. Такой подход не самый оптимальный по быстродействию. Можно существенно снизить задержку, если использовать пирамидальный способ суммирования в столбце. Для сложения столбца из 8 групп получим пирамиду, представленную рис. 3.

Общее время формирования произведения в пи-

рамидальной схеме составит T = т Е log 2

М :

)Т, ТЛ

1м = ( т +1) х , где т - количество бит в группе; х - время сложения в однобитовом сумматоре.

Сравнение

В данном пункте сравним два способа аппаратной реализации операций:

- стандартные примитивы;

- операции в коде «опережающий перенос».

Каждый способ реализации имеет свои преимущества и недостатки, и его выбор зависит от поставленных целей.

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

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

Проведем сравнение быстродействие и ресурсо-емкость этих методов над некоторыми операциями в программной САПР Quartus. Характеристики даются по двум параметрам:

- числу элементов;

- времени выполнения операции.

Сведем результаты в таблицы. В табл. 1 приведены результаты операции суммирования обычным методом.

Таблица 1

Характеристики двоичного сумматора на ПЛИС

Разрядность Задержка, ns Ёмкость в элементах ПЛИС

256 45,693 274

128 25,364 137

64 23,733 70

32 13,914 35

16 12,890 19

8 12,426 11

Рис. 3. Пирамидальный способ суммирования

В табл. 2 отражены результаты операции суммирования двух ^разрядных операндов, представленных полями по М-разрядов в группе.

Таблица 2

Характеристики сумматора в коде «опережающий перенос»

Разрядность Представление NxM Задержка, ns Ёмкость в элементах ПЛИС

256 32x8 19,120 632

256 64x4 19,629 760

128 8x16 18,598 271

128 16x8 18,700 312

128 32x4 18.218 380

64 4x16 18,413 128

64 8x8 17,851 152

64 16x4 18,168 187

Экспериментальные данные подтверждают, что время, затрачиваемое на выполнение операций в коде «опережающий перенос», слабо зависит от общей разрядности операндов. Существенным фактором, влияющим на скорость выполнения операций в коде «опережающий перенос», является количество разрядов в группе. Чем больше группа, тем в целом дольше выполняется операция. Даже если сравнить результаты операции сложения, выполненных стандартным способом, и в коде «опережающий перенос» видно, что, начиная с разрядности операндов 64 бита и выше, сложение стандартным способом существенно уступает альтернативному способу. Дальнейшее снижение времени суммирования в коде «опережающий перенос» возможно за счёт ускорения переноса в группе. Так как разрядность групп не превышает 8 бит, то в группе можно использовать все виды переносов -последовательный, сквозной или параллельный.

Операция умножения в коде «опережающий перенос» также имеет преимущество перед двоичной системой. На рис. 4 показаны зависимости времени умножения от разрядности слова. Рассмотрен метод последовательного умножения на разряд множителя и на группу разрядов множителя. Так как в ПЛИС имеется стандартный умножитель 1,8x1,8, то разрядность группы выбирается равной 8 бит. Как следует из графиков, уже на этом уровне код «опережающий перенос» даёт существенный выигрыш в быстродействии. При использовании параллельных схем выигрыш будет расти, так как для кода «опережающий перенос»

матрица умножения на высокую разрядность (64-256 бит) легко формируется из матриц умножения 8x8, т.е. фактически организуется параллельное умножение групп и векторное суммирование групп одноимённых разрядов кода «опережающий перенос» (см. рис. 2).

Разрядность, бит

Рис. 4 . Сравнительная временная характеристика умножения в двоичной системе счисления и в коде «опережающий перенос»

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

Литература

1. Хокни З., Джессхоуп К. Параллельные ЭВМ. М., 1986.

2. Валях Е. Последовательно-параллельные вычисления. М., 1985.

3. Поспелов Д.А. Арифметические основы вычислительных машин дискретного действия. М., 1970.

4. Ричардс Р. Арифметические операции на цифровых вычислительных машинах. М., 1957.

5. Dietmeyer D.L. Conversion from positive to negative and imaginary radix // IEEE Transaction on electronic Computer. 1963, № 1. C. 7-12.

6. Галкин Ф.Я. Об арифметических возможностях кода «2 из 5» // Изв. вузов. Приборостроение. 1965. № 6. С. 27-31

7. Золотовский В.Е. Арифметические и алгебраические основы проблемно-ориентированных систем. Таганрог, 2007.

5 марта 2008 г.

Золотовский Виктор Евдокимивич - д-р техн. наук, профессор кафедры ВТ Таганрогского технологического института Южного Федерального университета. E-mail: Zol@dce.isure.ru.

Гильванов Марат Фаритович - аспирант кафедры ВТ Таганрогского технологического института Южного Федерального университета, начальник отдела НПО «Марс».