Статья:

Об одной программной реализации многопоточного умножения целых чисел большой разрядности

Конференция: IV Международная заочная научно-практическая конференция «Научный форум: инновационная наука»

Секция: Технические науки

Выходные данные
Чурсин В.Б. Об одной программной реализации многопоточного умножения целых чисел большой разрядности // Научный форум: Инновационная наука: сб. ст. по материалам IV междунар. науч.-практ. конф. — № 3(4). — М., Изд. «МЦНО», 2017. — С. 91-99.
Конференция завершена
Мне нравится
на печатьскачать .pdfподелиться

Об одной программной реализации многопоточного умножения целых чисел большой разрядности

Чурсин Вячеслав Борисович
канд.физ.-мат. наук, доц., ФБГОУ ВО «Самарский университет путей сообщения» (филиал) в г. Орске, РФ, г. Орск

 

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

Abstract. The article deals with the software implementation of the algorithm for multithread multiplication of integers of large-digit numbers. Interest in this topic is based on the fact that arithmetic with large-digit numbers is widely used in systems with asymmetric encryption and in algorithms related to the factorization of large integers.

 

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

Keywords: Parallel and sequential algorithms, algorithm for multi-thread multiplication of large numbers.

 

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

В данной публикации рассматривается программный модуль, в котором реализуется алгоритм многопоточного умножения целых чисел большой разрядности – далее ЦБР-чисел (под числом большойразрядности будем понимать число, состоящееиз нескольких тысяч или миллионов двоичных знаков). В качестве языка реализации выбран компилятор FreePascal IDE for Win32 for i386 (Compiler Version 2.6.4), а в качестве операционной системы – Windows XP.

В качестве объектов исследования рассматриваются классический алгоритм умножения «столбиком» и алгоритм многопоточного умножения ЦБР-чисел.

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

Результатом умножения будет число 772608554310, которое получается в результате следующих действий – выполнения промежуточных умножений и арифметических сдвигов с последующим результирующим суммированием (в соответствии с рисунком 1)

 

Рисунок 1. Результат умножения двух целых чисел классическим способом

 

В то же время последовательность указанных действий можно выполнить и в произвольном порядке (в соответствии с рисунком 2):

 

Рисунок 2. Модифицированный алгоритм умножения двух целых чисел

 

Из рисунка 2 видно, что выполнение последовательности действий «операция i» (i=1..4)может осуществляться в произвольном порядке с последующим результирующим суммированием «операция 5». Именно на этом свойстве суммирования и будет основан алгоритм многопоточного умножения, когда «операция i» (i=1..4) выполняется в отдельном потоке с последующим результирующим суммированием.

Опишем более детально основные моменты алгоритма многопоточного умножения. Пусть заданы два ЦБР-числа А и В, где число А имеет длину в m+1 цифр в системе счисления по основанию BASE (BASE>1), которое можно представить следующим образом:

А = amam-1a0 ,

где: ai– значенияиз диапазона 0 .. BASE-1.

В соответствии с определением числа, представимого в позиционной системе счисления по основания BASE, число А можно представить следующим образом:

 А = a+ a1´ BASE + … + am-1´ BASE m-1 +am´ BASE m                                                        (1)

В формуле (1) произведем группировку слагаемых таким образом, чтобы число А было представимо в системе счисления по основанию BASEP, где p = (m+1) div k количество элементов в группе,(k+1) количество групп. Тогда получим:

А=,                                           (2)

где: div, modоперации получение частного и остатка при целочисленном делении.

Тогда из формулы (2) при умножении числа А на число В получаем:

А´В =                                      (3)

Из формулы (3) следует, что умножение числа А на число В сводится к умножению числа В на более «короткие части» числа А и максимум k+1 сложений полученных результатов умножений. Процедуру умножения числа В на более «короткие части» числа А можно будет реализовать в отдельных процессах/потоках. Таким образом, при наличии в вычислительной системе более одного процессора (или при наличии нескольких ядер процессора) следует ожидать сокращения времени выполнения операцииумножения для ЦБР-чисел.

Продемонстрируем работу алгоритма потокового умножения чисел А и В (результат будет храниться в переменной R) с помощью рисунков 3–5.

Этап 1: Формирование контекста окружения потоков.

Например, пусть для чисел A и В значения А.MSB и В.MSB равны соответственно3381 и 300 (при А.LSB=В.LSB=0), элементы массива данных, соответствующие числам А и В (A.BigNumber и В.BigNumber) заполнены произвольными числовыми значениями, число потоков равно 17, а элементы массива ContextList (массив данных контекста окружения потоков), будут представлены следующими значениями (таблица 3):

Таблица 3.

Формирование значений контекста окружения потока, этап 1

Поля

Поток 0

Поток 1

Поток 2

…..

Поток 15

Поток 16

aLSB

0

211

422

…..

3165

3376

aMSB

210

421

632

…..

3375

3381

bLSB

0

0

0

…..

0

0

bMSB

300

300

300

…..

300

300

RMSB

0

0

0

…..

0

0

NumThread

0

1

2

…..

15

16

ThreadID

5466*

23587*

1268*

…..

96543*

25631*

EndProcessing

False

False

False

…..

False

False

IsAdd

False

False

False

…..

False

False

Res

**

**

**

…..

**

**

AP

@A***

@A

@A

…..

@A

@A

BP

@B***

@B

@B

…..

@B

@B

 

* – значения присваиваются службами ОС Windows и отличаются от указанных значений;

** – на момент начала работы алгоритма умножения массив Res заполнен нулевыми значениями;

*** – ссылки на ЦБР-числа А и В соответственно

 

Рисунок 3. Формирование блоков данных для числа АP

 

Комментарии к рисунку 3:

·     области, заштрихованные различными видами узоров, представляют собой элементы блоков данных с произвольными числовыми значениями;

·     не заштрихованные области – элементы массива, содержащие нулевые значения;

·     числовые метки над заштрихованными областями – это числовые значенияначалаиконца соответствующих блоков ЦБР-чисел А и В.

После формирования данных контекста окружения, начинает выполняться этап 2 – этап выполнения умноженияблоков значений из массива числа А на число В. Содержание этого этапа можно представить в соответствии с рисунками 4 и 5 (на примере умножения в двух потоках):

Этап 2: Умножение в потоках.

 

Рисунок 4. Выполнение умножения блока данных числа А на число В потоке с номером 0

 

 

Рисунок 5. Выполнение умножения блока данных числа А на число В потоке с номером 1

 

Анализ действий алгоритма на представленных рисунках 4 и 5 показывает, что вычисления производятся независимо друг от друга и результаты промежуточныхвычислений не искажают друг друга. После окончания этапа 2 наступает этап 3 – этап результирующего суммирования.

Этап 3. Этап результирующего суммирования.

Содержание этапа 3 заключается в том, что все промежуточные вычисленные значения (которые хранятся в контексте окружения каждого потока в массиве Res), суммируются в итоговом ЦБР-числе R. Результирующее суммирование выполняется с каждым из полученных блоков данных Res и соответствующим блоком данных числа R (в соответствии с рисунком 6).

 

Рисунок 6. Выполнение этапа 3 – этапа результирующего суммирования

 

Следует отметить, что результирующее суммирование выполняется сразу же по окончании вычислений тем или иным потоком.

Результаты:

По результатам тестирования были получены следующие результаты:

·     время выполнения алгоритма последовательного умножения в два раза превышает время выполнения многопоточного умножения для многоядерных (однопроцессорных) систем (коэффициент ускорения вычислений k=2);

·     коэффициент k на тестируемых компьютерах не изменялся при увеличении количества ядер процессора (тестировались однопроцессорные системы с двумяи четырьмя ядрами);

·     на тестируемых компьютерах для ЦБР-чисел<500 байт классическое умножение эффективнее многопоточного умножения;

·     при значительном увеличении числа потоков (>64) наблюдалось уменьшение коэффициента k (большое количество потоков начинает скорее «угнетать» операционную систему, чем способствовать ускорению вычислений).

Выводы:

Анализируя полученные результаты можно сделать следующие выводы:

·     алгоритм многопоточного умножения является масштабируемым;

·     алгоритм многопоточного умножения может быть реализован как в OPENMP, так и в MPI-подобных системах;

·     использование механизмов распараллеливания вычислительных процессов позволяет сократить общее время выполнения вычислений;

·     можно предположить, что использование систем с несколькими процессорами и общей памятью позволит повысить коэффициент k пропорционально количеству процессоров;

·     алгоритм умножения в потоке может быть заменен на любой алгоритм быстрого умножения.

По результатам разработки модуля следует сделать следующие замечания:

·     модуль в основном тестировался в инструментальной среде программированияFreePascal IDE for Win32 for i386 в режиме Delphi Compatible;

·     данную схему вычислений следует рассматривать как некую одностороннюю схему, в которой только одно ЦБР-число разбивалось на блоки. Анализ алгоритма показывает, что данную схему можно реализовать и как двустороннюю, когда оба ЦБР-числа разбиваются на блоки, которые будут умножаться в отдельных потоках;

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

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

 

Список литературы:
1. Бабенко Л.К., Ищукова Е.А., Сидоров И.Д. Параллельные алгоритмы для решения задач защиты информации. – М.: Издательство: Горячая линия-Телеком, 2014. – 299 с.