Параллельное умножение матрицы на вектор: Курсовая работа

РЕФЕРАТ
Паралельні методи множення матриці на вектор // Курсова робота // Якубів
Петро Степанович // Тернопільський національний технічний університет імені
Івана Пулюя, факультет комп'ютерно-інформаційних систем і програмної
інженерії, кафедра комп’ютерних наук, група СНм-51 // Тернопіль, 2016 // c. – _
, рис. – _ , табл. – _ , додат. – _ , бібліогр. – _ , креслення - _.
Ключові слова: МАТРИЦЯ, ВЕКТОР, ПАРАЛЕЛЬНІ ОБИЧСЛЕННЯ, GRID.
Метою роботи є: продемонструвати реалізацію множення матриці на
векто
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
ЗМІСТ
Вступ ...........................................................................................................................
1 Основний розділ .....................................................................................................
1.1 Постановка задачі ............................................................................................
2 Виконання завдання ..............................................................................................
2.1 Послідовний алгоритм ....................................................................................
2.2 Множення матриць при стрічковій схемі розділення даних ......................
2.2.1 Визначення підзадач ................................................................................
2.2.2 Виділення інформаційних залежностей ................................................
2.2.3 Масштабування і розприділення під задач по процесорам .................
2.2.4 Аналіз ефективності.................................................................................
2.2.5 Результати обчислювальних експериментів .........................................
2.3 Алгоритм Фокса множення матриць при блоковому розділенні
даних ...........................................................................................................................
2.3.1 Визначення під задач ...............................................................................
2.3.2 Виділення інформаційних залежностей ................................................
2.3.3 Масштабування і розприділення під задач по процесорам .................
2.3.4 Аналіз ефективності.................................................................................
2.3.5 Результати обчислювальних експериментів .........................................
2.4 Алгоритм Кэннона множення матриць при блоковому розділенні
даних ...........................................................................................................................
2.4.1 Визначення під задач ...............................................................................
2.4.2 Виділення інформаційних залежностей ................................................
2.4.3 Масштабування і розприділення під задач по процесорам .................
2.4.4 Аналіз ефективності.................................................................................
2.4.5 Результати обчислювальних експериментів .........................................
Висновок ....................................................................................................................
Перелік використаних джерел .................................................................................
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
ВСТУП
Операція множення матриць є одним із основних завдань матричних
обчислень. У даному розділі розглядаються декілька різних паралельних
алгоритмів для виконання цієї операції. Два з них засновані на стрічковій схемі
розділення даних. Інші два методи використовують блокову схему розділення це широко відомі алгоритми Фокса(Fox) і Кэннона(Cannon).
Існує широке коло обчислювальних задач, що вимагають для свого
рішення значно більших обчислювальних ресурсів, ніж може надати звичайний
персональний комп'ютер. Таким завданням необхідно:
- більшу швидкодію;
- більший обєм оперативної пам’яті;
- більшу кількість передаючої інформації;
- опрацювання і збереження великої кількості інформації.
Якщо присутній хоча б один з перерахованих вимог, то використання
високопродуктивних обчислень необхідно і виправдано.
В даний час фундаментальні і прикладні проблеми, ефективне вирішення
яких можливе лише з використанням високопродуктивних обчислень,
включають дуже багато галузей.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
1 ОСНОВНИЙ РОЗДІЛ
1.1 Постановка задачі
Множення матриці A розміру
і матриці B розміру
приводить до
отримання матриці C розміру , кожен елемент якої визначається відповідно до
виразу.
Кожен елемент результуючої матриці є скалярний результат відповідної
строки матриці і стовбця матриці .
Цей алгоритм припускає виконання
операцій множення і стільки ж
операцій складання елементів початкових матриць. При множенні квадратних
матриць розміру кількість виконаних операцій має порядок Відомі послідовні
алгоритми
множення
складність(наприклад,
матриць,
алгоритм
що
мають
меншу
Страссена(Strassen's
обчислювальну
algorithm)),
але
ці
алгоритми вимагають певних зусиль для їх освоєння і, тому, у даному розділі
при розробці паралельних методів за основу було взято приведений вище
послідовний алгоритм. Також мається на увазі, що всі матриці надалі будуть
квадратними, і матимуть розмір .
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
2 ВИКОНАННЯ ЗАВДАННЯ
2.1 Послідовний алгоритм
матриця інформаційний залежність алгоритм
Послідовний алгоритм множення матриць реалізується трьома вкладеними
циклами:
// Алгоритм 1.2
double MatrixA[Size][Size];
double MatrixB[Size][Size];
double MatrixC[Size][Size];
int i,j,k;
...
for (i=0; i<Size; i++){
for (j=0; j<Size; j++){
MatrixC[i][j] = 0;
for (k=0; k<Size; k++){
MatrixC[i][j]
=
MatrixC[i][j]
+
MatrixA[i][k]*MatrixB[k][j];
}
}
}
Алгоритм 1.1. Послідовний алгоритм множення двох квадратних матриць.
Цей алгоритм є ітеративним і орієнтований на послідовне обчислення
рядків матриці С. Дійсно, при виконанні однієї ітерації зовнішнього циклу(по
змінній ) обчислюється один рядок результуючої матриці.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
На першій ітерації циклу по змінній
використовується перший рядок
матриці A та усі стовпці матриці B для того, щоб вичислити елементи першого
рядка результуючої матриці
Оскільки кожен елемент результуючої матриці є скалярний результат
рядка і стовпця початкових матриць, то для обчислення усіх елементів матриці С
розміром необхідно виконати скалярних операцій і витратити час
де це час виконання однієї елементарної скалярної операції.
2.2 Множення матриць при стрічковій схемі розділення даних
Розглянемо два паралельні алгоритми множення матриць, в яких матриці A
і B розбиваються на безперервні послідовності рядків або стовпців(смуги).
2.2.1 Визначення підзадач
З визначення операції матричного множення виходить, що обчислення усіх
елементів матриці С може бути виконано незалежно один від одного. Як
результат, імовірний підхід для організації паралельних обчислень полягає у
використанні у якості базової підзадачі процедури визначення одного елементу
результуючої матриці С. Для проведення усіх необхідних обчислень кожна
підзадача повинна містити по одному рядку матриці А і одному стовпцю матриці
В. Загальна кількість отримуваних при такому підході підзадач виявляється
рівним n2 (по числу елементів матриці С).
Розглянувши запропонований підхід, можна відмітити, що досягнутий
рівень паралелізму є в деякій мірі надмірним. Зазвичай при проведенні
практичних розрахунків кількість сформованих підзадач перевищує число
наявних процесорів і, як результат, неминучим є етап укрупнення базових
завдань. У цьому плані може виявитися корисною агрегація обчислень вже на
Арк.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
кроці виділення базових під задач. Для подальшого розгляду у рамках цього
підрозділу визначимо базове завдання як процедуру обчислення усіх елементів
одного з рядків матриці С. Такий підхід призводить до зниження загальної
кількості підзадач до величини .
Для виконання усіх необхідних обчислень базовій підзадачі має бути
доступним один із рядків матриці A та усі стовпці матриці B. Просте рішення
цієї проблеми – це дублювання матриці B в усіх під задачах, але воно являється,
як правило, неприйнятним в силу великих витрат пам'яті на зберігання даних. Як
результат, організація обчислень має бути побудована так, щоб у кожен
теперішній момент часу підзадачі містили лише частину цих, необхідних для
проведення розрахунків, а доступ до іншої частини даних забезпечувався б за
допомогою передачі повідомлень. Два можливі способи виконання паралельних
обчислень подібного типу розглянуті далі.
2.2.2 Виділення інформаційних залежностей
Для обчислення одного рядка матриці С необхідно, щоб в кожній підзадачі
містився рядок матриці А і був забезпечений доступ до усіх стовпців матриці B.
Можливі способи організації паралельних обчислень полягають в наступному.
1) Перший алгоритм. Алгоритм є ітераційною процедурою, кількість
ітерацій якої співпадає з числом підзадач. На кожній ітерації алгоритму кожна
підзадача містить по одному рядку матриці А і одному стовпцю матриці В. При
виконанні ітерації проводиться скалярне множення рядків, що містяться в
підзадачах, і стовпців, що призводить до отримання відповідних елементів
результуючої матриці С. Після закінчення обчислень у кінці кожної ітерації
стовпці матриці В мають бути передані між підзадачами так, щоб у кожній
підзадачі опинилися нові стовпці матриці В і могли бути вичислені нові
елементи матриці C. При цьому така передача стовпців між підзадачами має
бути організована так, щоб після завершення ітерацій алгоритму в кожній
підзадачі послідовно опинилися усі стовпці матриці В.
Схема організації необхідної послідовності передач стовпців матриці В
Арк.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
між підзадачами полягає в уявленні топології інформаційних зв'язків підзадач у
вигляді кільцевої структури. В цьому випадку, на кожній ітерації підзадача,
передаватиме свій стовпець матриці В підзадачі з номером (відповідно до
кільцевої структури підзадача передає свої дані підзадачі з номером 0) . Після
виконання усіх ітерацій алгоритму необхідна умова буде забезпечена – в кожній
підзадачі по черзі опиняться усі стовпці матриці В.
Представлені ітерації алгоритму матричного множення для випадку, коли
матриці складаються з чотирьох рядків і чотирьох стовпців(n=4). На початку
обчислень в кожній підзадачі , розташовуються -ий рядок матриці A та -ий
стовпець матриці B. В результаті їх перемножування підзадача отримує елемент
результуючої матриці С. Далі підзадачі здійснюють обмін стовпцями, в ході
якого кожна підзадача передає свій стовпець матриці B наступній підзадачі
відповідно до кільцевої структури інформаційних взаємодій. Виконання
описаних дій повторюється до завершення усіх ітерацій паралельного алгоритму.
2) Другий алгоритм. Відмінність другого алгоритму полягає в тому, що
в підзадачах розташовуються не стовпці, а рядки матриці B. Як результат,
перемножування даних кожної підзадачі зводиться не до скалярного множення
наявних векторів, а до їх по елементного множення. В результаті подібного
множення в кожній підзадачі виходить рядок часткових результатів для матриці
C.
При розглянутому способі розділення даних для виконання операції
матричного множення треба забезпечити послідовне отримання в підзадачах усіх
рядків матриці B, поелементне множення даних і підсумовування нових значень,
із раніше вичисленими результатами. Організація необхідної послідовності
передач рядків матриці B між підзадачами також може бути виконана з
використанням кільцевої структури інформаційних зв'язків.
Представлені ітерації алгоритму матричного множення для випадку, коли
матриці складаються з чотирьох рядків і чотирьох стовпців. На початку
обчислень в кожній підзадачі, розташовуються i рядки матриці A і матриці B. В
результаті їх перемножування підзадача визначає i-ий рядок часткових
Арк.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
результатів шуканої матриці C. Далі підзадачі здійснюють обмін рядками, в ході
якого кожна підзадача передає свій рядок матриці B наступній підзадачі
відповідно до кільцевої структури інформаційних взаємодій. Далі виконання
описаних дій повторюється до завершення усіх ітерацій паралельного алгоритму.
2.2.3 Масштабування і роз приділення під задач по процесорам
Виділені базові підзадачі характеризуються однаковою обчислювальною
складністю і рівним об'ємом передаваних даних. У разі, коли розмір матриць
виявляється більшим, за число процесорів , базові підзадачі можна збільшити,
об'єднавши у рамках однієї підзадачі декілька сусідніх рядків і стовпців
перемножуваних матриць. В цьому випадку, початкова матриця A розбивається
на ряд горизонтальних смуг, а матриця B представляється у вигляді набору
вертикальних(для
першого
алгоритму)
або
горизонтальних(для
другого
алгоритму) смуг. Розмір смуг при цьому слід вибрати рівним k=n/p(при кратно),
що дозволить як і раніше забезпечити рівномірність розподілу обчислювального
навантаження на процесори, які складають багатопроцесорну обчислювальну
систему.
Для розподілу підзадач між процесорами може бути використаний будьякий спосіб, що забезпечує ефективне представлення кільцевої структури
інформаційної взаємодії підзадач. Для цього досить, наприклад, щоб підзадачі,
що є сусідніми в кільцевій топології, розташовувалися на процесорах, між якими
є прямі лінії передачі даних.
2.2.4 Аналіз ефективності
Виконаємо
аналіз
ефективності
першого
паралельного
алгоритму
множення матриць.
Загальна трудомісткість послідовного алгоритму, як вже відзначалося
раніше, є пропорційною . Для паралельного алгоритму на кожній ітерації кожен
процесор виконує множення наявних у процесорі смуг матриці А і матриці В
(розмір смуг рівний і, як результат, загальна кількість виконуваних при цьому
Арк.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
множенні операцій рівна). Оскільки число ітерацій алгоритму співпадає з
кількістю процесорів, складність паралельного алгоритму без урахування витрат
на передачу даних може бути визначена за допомогою вираження.
З урахуванням цієї оцінки показники прискорення і ефективності цього
паралельного алгоритму матричного множення набирають вигляду:
Таким чином, загальний аналіз складності дає ідеальні показники
ефективності паралельних обчислень. Для уточнення отриманих співвідношень
оцінимо точніше кількість обчислювальних операцій алгоритму і врахуємо
витрати на виконання операцій передачі даних між процесорами.
З урахуванням числа і тривалості виконуваних операцій час виконання
обчислень паралельного алгоритму може бути оцінений таким чином.
Для оцінки комунікаційної складності паралельних обчислень матимемо
на увазі, що усі операції передачі даних між процесорами в ході однієї ітерації
алгоритму можуть бути виконані паралельно. Об'єм передаваних даних між
процесорами визначається розміром смуг і складає рядків або стовпців довжини
. Загальна кількість паралельних операцій передачі повідомлень на одиницю
менше числа ітерацій алгоритму(на останній ітерації передача даних не є
обов'язковою). Тим самим, оцінка трудомісткості виконуваних операцій передачі
даних може бути визначена як
де α – латентність, β – пропускна здатність мережі, а w – розмір елементу
матриці в байтах
Відповідно до отриманих співвідношень загальний час виконання
паралельного
алгоритму
матричного
множення
визначається
наступним
вираженням.
2.2.5 Результати обчислювальних експериментів
Експерименти
проводилися
в
обчислювальному
кластері
на
базі
процесорів Intel XEON 4 EM64T, 3000 Мгц і мереж Gigabit Ethernet під
управлінням операційної системи Microsoft Windows Server 2003 Standart x64
Edition
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
Для оцінки тривалості базової скалярної операції відбувалося вирішення
задачі множення матриць за допомогою послідовного алгоритму і отриманий
таким чином час обчислень ділилвся на загальну кількість виконаних операцій, в
результаті подібних експериментів для величини було отримано значення 6.4 нс.
Експерименти, виконані для визначення параметрів мережі передачі даних,
показали значення латентності і пропускної здатності відповідно 130 мкс і 53.29
Мбайт/с. Усі обчислення робилися над числовими значеннями типу double, т. е.
величина дорівнює 8 байт.
Результати обчислювальних експериментів приведені в таблиці 2.1.
Експерименти виконувалися з використанням двох, чотирьох і восьми
процесорів.
Таблиця 2.1. Результати обчислювальних експериментів по дослідженню
першого паралельного алгоритму матричного множення при стрічковій схемі
розподілу даних
Розмі
Послі
р матриць
довний
2 процесори
4 ЦП
8 ЦП
час
Прискоренн
час
алгоритм
500
Прискоренн
я
час
я
Прискоренн
я
0,875
0,3758
2,3287
0,1535
5,6982
0,0968
9,0371
12,87
5,4427
2,3662
2,2628
5,6912
0,6998
18,4014
43,47
20,9503
2,0750
11,0804
3,9234
5,1766
8,3978
103,0
45,7436
2,2529
21,6001
4,7710
9,4127
10,9485
201,2
99,5097
2,0228
56,9203
3,5363
18,3303
10,9813
347,8
171,9232
2,0232
111,9642
3,1067
45,5482
7,6368
2
1000
87
1500
31
2000
561
2500
915
3000
434
Порівняння
експериментального
часу
виконання
експерименту
теоретичного часу з формули(1.8) представлені в таблиці 2.2.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
і
Арк.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
Таблиця 2.2. Порівняння експериментального і теоретичного часу
виконання першого паралельного алгоритму матричного множення при
стрічковій схемі розподілу даннях
Розмір
матриць
4 ЦП
2
8 ЦП
процесори
час
час Прискорення
Прискоре
час
Прискорення
ння
500
0,8243
0,3758
0,4313
0,1535
0,2353
0,0968
1000
6,51822
5,4427
3,3349
2,2628
1,7436
0,6998
1500
21,9137
20,9503
11,127
11,0804
5,7340
5,1766
26,223
21,6001
13,4144
9,4127
51,040
56,9203
25,9928
18,3303
87,994
111,9642
44,6772
45,5482
0
2000
51,8429
45,7436
6
2500
101,1377
99,5097
8
3000
174,6301
171,9232
6
З результатів в таблицях можна зробити висновок продуктивності
алгоритму.
2.3 Алгоритм Фокса множення матриць при блоковому розділенні
даних
При побудові паралельних способів виконання матричного множення
разом з розглядом матриць у вигляді наборів рядків і стовпців широко
використовується блокове представлення матриць. Виконаємо детальніший
розгляд цього способу організації обчислень.
2.3.1 Визначення підзадач
Блокова схема розбиття матриць детально розглянута в попередньому
підрозділі. При такому способі розділення даних початкові матриці,
і
результуюча матриця представляються у вигляді наборів блоків. Для простішого
викладу матеріалу матимемо на увазі, що усі матриці є квадратними розміру
Арк.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
кількість блоків по горизонталі і вертикалі є однаковою і рівною (тобто розмір
усіх блоків рівний). При такому представленні даних операція множення
матриць А і B у блоковому виді може бути представлена так.
При блоковому розбитті даних для визначення базових підзадач за основу
беруться обчислення, що виконуються над матричними блоками. З урахуванням
сказаного визначимо базову підзадачу як процедуру обчислення усіх елементів
одного з блоків матриці .
Для виконання усіх необхідних обчислень базовим підзадачам мають бути
доступні відповідні набори рядків матриці A і стовпців матриці B. Розміщення
усіх необхідних даних в кожній підзадачі неминуче приведе до дублювання і до
значного зростання об'єму використовуваної пам'яті. Як результат, обчислення
мають бути організовані так, щоб в кожен теперішній момент часу підзадачі
містили лише частину необхідних для проведення розрахунків даних, а доступ
до іншої частини даних забезпечувався б за допомогою передачі повідомлень.
Один з можливих підходів – це алгоритм Фокса(Fox).
2.3.2 Виділення інформаційних залежностей
Отже, за основу паралельних обчислень для матричного множення при
блоковому розділенні даних прийнятий підхід, при якому базові підзадачі
відповідають за обчислення окремих блоків матриці і при цьому в підзадачах на
кожній ітерації розрахунків розташовуються тільки по одному блоку початкових
матриць і . Для нумерації підзадач використовуватимемо індекси розміщуваних
в підзадачах блоків матриці C, тобто підзадача() відповідає за обчислення блоку
– тим самим, набір підзадач утворює квадратні грати, що відповідають структурі
блокового представлення матриці .
Можливий спосіб організації обчислень за таких умов полягає в
застосуванні широко відомого алгоритму Фокса(Fox), - див, наприклад, Fox et al.
(1987)Kumar et al. (1994).
Відповідно до алгоритму Фокса в ході обчислень на кожній базовій
підзадачі розташовується чотири матричні блоки:
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
• блок матриці , що обчислюється підзадачею;
• блок
матриці , що розміщується в підзадачі перед початком
обчислень;
• блоки , матриць і , що отримуються підзадачею в ході виконання
обчислень.
Виконання паралельного методу включає:
• етап ініціалізації, на якому кожній підзадачі передаються блоки , і
обнуляються блоки в усіх підзадачах;
• етап обчислень, у рамках якого на кожній ітерації , здійснюються
наступні операції:
• для кожного рядка , ,блок підзадачі пересилається в усі підзадачі
того ж рядка
грат; індекс , що визначає положення підзадачі в рядку,
обчислюється відповідно до виразу.
де – це операція отримання залишку від цілочисельного ділення;
• отримані в результати пересилок блоки ,
кожної під задачі
перемножуються і додаються до блоку ;
• блоки кожної підзадачі пересилаються сусідніми підзадачами, що
знаходяться, зверху в стовпцях грат під задач (блоки підзадач з першого рядка
грат пересилаються підзадачам останнього рядка грат).
2.3.3 Масштабування і розподіл підзадач по процесорах
У розглянутій схемі паралельних обчислень кількість блоків може
змінюватися залежно від вибору розміру блоків. Ці розміри можуть бути
підібрані так, щоб загальна кількість базових підзадач співпадала з числом
процесорів . Так, наприклад, в найбільш простому випадку, коли число
процесорів можна спів ставити з (тобто є повним квадратом) можна вибрати
кількість блоків в матрицях по вертикалі і горизонталі рівною. Такий спосіб
визначення кількості блоків призводить до того, що об'єм обчислень в кожній
підзадачі є однаковим і, тим самим, досягається повне балансування
обчислювального навантаження між процесорами. У загальному випадку при
Арк.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
довільних кількості процесорів і розмірах матриць балансування обчислень
може бути не однаковим, але за належного вибору параметроів може бути
оптимізованим.
Для ефективного виконання алгоритму Фокса, в якому базові підзадачі
представлені у вигляді квадратних грат, найбільш адекватним рішенням є
організація великої кількості процесорів у вигляді квадратних грат. В цьому
випадку можна здійснити безпосереднє відображення набору підзадач на безліч
процесорів - базову підзадачу слід розташовувати на процесорі . Необхідна
структура мережі передачі даних може бути забезпечена на фізичному рівні,
якщо топологія обчислювальної системи має вигляд грат або повного графа.
2.3.4 Аналіз ефективності
Визначимо обчислювальну складність цього алгоритму Фокса. Побудова
оцінок відбуватиметься за умови виконання усіх раніше висунених припущень,
тобто усі матриці є квадратними розміру , кількість блоків по горизонталі і
вертикалі є однаковою і рівною (тобто розмір усіх блоків рівний ), процесори
утворюють квадратні грати і їх кількість рівна .
Як вже відзначалося, алгоритм Фокса вимагає для свого виконання
ітерацій, в ході яких кожен процесор перемножує свої поточні блоки матриць і
та додає результати множення до поточного значення блоку матриці. З
урахуванням висунених припущень загальна кількість виконуваних при цьому
операцій матиме порядок . Як результат, показники прискорення і ефективності
алгоритму мають вигляд.
Загальний аналіз складності знову дає ідеальні показники ефективності
паралельних обчислень. Уточнимо отримані співвідношення - вкажемо для цього
точнішу кількість обчислювальних операцій алгоритму і врахуємо витрати на
виконання операцій передачі даних між процесорами.
Визначимо кількість обчислювальних операцій. Складність виконання
скалярного множення рядка блоку матриці на стовпець блоку матриці можна
оцінити як . Кількість рядків і стовпців у блоках рівна
Змн.
Арк.
№ докум.
Підпис
Дата
і, як результат,
Арк.
КПКН 16.279.24.001 ПЗ
трудомісткість операції блокового множення виявляється рівною. Для складання
блоків потрібні
операцій. З урахуванням усіх перерахованих виразів час
виконання обчислювальних операцій алгоритму Фокса може бути оцінений
таким чином.
Оцінимо витрати на виконання операцій передачі даних між процесорами.
На кожній ітерації алгоритму перед множенням блоків один з процесорів рядка
процесорних грат розсилає свій блок матриці іншим процесорам свого рядка. Як
вже відзначалося раніше, при топології мережі у вигляді гіперкуба або повного
графа виконання цієї операції може бути забезпечене за
кроків, а об'єм
передаваних блоків рівний . Як результат, час виконання операції передачі
блоків матриці при використанні моделі Хокни може оцінюватися як де латентність, - пропускна спроможність мережі передачі даних, а
є розмір
елементу матриці у байтах. У разі ж, коли топологія рядків процесорних грат є
кільцем, вираження для оцінки часу передачі блоків матриці набирає вигляду.
Далі після множення матричних блоків процесори передають свої блоки
матриці попереднім процесорам по стовпцях процесорних грат(перші процесори
стовпців передають свої дані останнім процесорам в стовпцях грат). Ці операції
можуть бути виконані процесорами паралельно і, тим самим, тривалість такої
комунікаційної операції складає.
Підсумувавши усі отримані вирази, можна отримати, що загальний час
виконання алгоритму Фокса може бути визначений за допомогою наступних
співвідношень.
2.3.5 Програмна реалізація
Представимо можливий варіант програмної реалізації алгоритму Фокса
для множення матриць при блоковому представленні даних. Приведений
програмний код містить основні модулі паралельної програми, відсутність
окремих допоміжних функцій не позначається на загальному розумінні схеми
паралельних обчислень, що реалізовується.
1) Головна функція програми.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
Визначає основну логіку роботи алгоритму, послідовно викликає необхідні
підпрограми.
Програма 2.1
int ProcNum = 0; // Number of available processes
int ProcRank = 0; // Rank of current process
int GridSize; // Size of virtual processor grid
int
GridCoords[2];
//
Coordinates
of
current
processor in grid
MPI_Comm GridComm; // Grid communicator
MPI_Comm ColComm; // Column communicator
MPI_Comm RowComm; // Row communicator
void main ( int argc, char * argv[] ) {
double*
pAMatrix;
//
The
first
argument
of
matrix
multiplication
double* pBMatrix; // The second argument of matrix
multiplication
double* pCMatrix; // The result matrix
int Size; // Size of matricies
int BlockSize; // Sizes of matrix blocks on current
process
double
*pAblock;
//
Initial
block
of
matrix
A
on
//
Initial
block
of
matrix
B
on
//
Block
result
matrix
C
on
current process
double
*pBblock;
current process
double
*pCblock;
of
current process
double *pMatrixAblock;
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
double Start, Finish, Duration;
setvbuf(stdout, 0, _IONBF, 0);
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
GridSize = sqrt((double)ProcNum);
if (ProcNum != GridSize*GridSize) {
if (ProcRank == 0) {
printf ("Number of processes must be a perfect square
\n");
}
}
else {
if (ProcRank == 0)
printf("Parallel matrix multiplication program\n");
//
Creating
the
cartesian
grid,
row
and
column
of
matrix
communcators
CreateGridCommunicators();
//
Memory
allocation
and
initialization
elements
ProcessInitialization ( pAMatrix, pBMatrix, pCMatrix,
pAblock, pBblock,
pCblock, pMatrixAblock, Size, BlockSize );
DataDistribution(pAMatrix,
pBMatrix,
pMatrixAblock,
pBblock, Size,
BlockSize);
// Execution of Fox method
ParallelResultCalculation(pAblock,
pMatrixAblock,
pBblock,
pCblock, BlockSize);
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
ResultCollection(pCMatrix, pCblock, Size, BlockSize);
TestResult(pAMatrix, pBMatrix, pCMatrix, Size);
// Process Termination
ProcessTermination
(pAMatrix,
pBMatrix,
pCMatrix,
pAblock, pBblock,
pCblock, pMatrixAblock);
}
MPI_Finalize();}
2) Функція CreateGridCommunicators.
Ця функція створює комунікатор у вигляді двовимірних квадратних грат,
визначає координати кожного процесу в цих гратах, а також створює
комунікатори окремо для кожного рядка і кожного стовпця.
Створення грат робиться за допомогою функції MPI _ Cart _ create(вектор
Periodic визначає можливість передачі повідомлень між граничними процесами
рядків і стовпців створюваних грат). Після створення грат кожен процес
паралельної програми матиме координати свого положення в гратах; отримання
цих координат забезпечується за допомогою функції MPI _ Cart _ coords.
Формування топологій завершується створенням безлічі комунікаторів для
кожного рядка і кожного стовпця грат окремо(функція MPI _ Cart _ sub).
// Creation of two-dimensional grid communicator
// and communicators for each row and each column of
the grid
void CreateGridCommunicators() {
int
DimSize[2];
//
Number
of
processes
in
each
dimension of the grid
int Periodic[2]; // =1, if the grid dimension should
be periodic
int Subdims[2]; // =1, if the grid dimension should
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
be fixed
DimSize[0] = GridSize;
DimSize[1] = GridSize;
Periodic[0] = 0;
Periodic[1] = 0;
// Creation of the Cartesian communicator
MPI_Cart_create(MPI_COMM_WORLD, 2, DimSize, Periodic,
1, &GridComm);
//
Determination
of
the
cartesian
coordinates
for
every process
MPI_Cart_coords(GridComm, ProcRank, 2, GridCoords);
// Creating communicators for rows
Subdims[0] = 0; // Dimensionality fixing
Subdims[1]
=
1;
//
The
presence
of
the
given
dimension in the subgrid
MPI_Cart_sub(GridComm, Subdims, &RowComm);
// Creating communicators for columns
Subdims[0] = 1;
Subdims[1] = 0;
MPI_Cart_sub(GridComm, Subdims, &ColComm);
3) Функція ProcessInitialization.
Для визначення розмірів матриць і матричних блоків, виділення пам'яті
для їх зберігання і визначення елементів початкових матриць реалізується
функція ProcessInitialization.
Ця функція визначає параметри вирішуваної задачі(розміри матриць і їх
блоків), виділяє пам'ять для зберігання даних і здійснює введення початкових
матриць(чи формує їх за допомогою якого-небудь датчика випадкових чисел).
Всього в кожному процесі має бути виділена пам'ять для зберігання чотирьох
блоків - для покажчиків використовуються змінні pAblock, pBblock, pCblock,
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
pMatrixAblock. Перші три покажчики визначають блоки матриць, і відповідно.
Слід зазначити, що вміст блоків pAblock і pBblock постійно змінюється
відповідно до пересилки даних між процесами, тоді як блок pMatrixAblock
матриці залишається незмінним і використовується при розсилках блоків по
рядках грат процесів(див. функцію AblockCommunication).
//
Function
for
memory
allocation
ProcessInitialization
(double*
and
data
initialization
void
&pAMatrix,
double* &pBMatrix,
double*
&pCMatrix,
double*
&pAblock,
double*
&pBblock, double* &pCblock,
double* &pTemporaryAblock, int &Size, int &BlockSize
) {
if (ProcRank == 0) {
do {
printf("\nEnter size of the initial objects: ");
scanf("%d", &Size);
if (Size%GridSize != 0) {
printf ("Size of matricies must be divisible by the
grid size! \n");
}
}
while (Size%GridSize != 0);
}
MPI_Bcast(&Size, 1, MPI_INT, 0, MPI_COMM_WORLD);
BlockSize = Size/GridSize;
pAblock = new double [BlockSize*BlockSize];
pBblock = new double [BlockSize*BlockSize];
pCblock = new double [BlockSize*BlockSize];
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
pTemporaryAblock = new double [BlockSize*BlockSize];
for (int i=0; i<BlockSize*BlockSize; i++) {
pCblock[i] = 0;
}
if (ProcRank == 0) {
pAMatrix = new double [Size*Size];
pBMatrix = new double [Size*Size];
pCMatrix = new double [Size*Size];
RandomDataInitialization(pAMatrix, pBMatrix, Size);
}
}
4) Функція DataDistribution для розподілу початкових даних і функція
ResultCollection для збору результатів.
Після задання початкових матриць на нульовому процесі необхідно
здійснити розподіл початкових даних. Для цього призначена функція
DataDistribution. Можуть бути запропоновані два способи виконання блокового
розділення матриць між процесорами, організованими в двовимірні квадратні
грати. З одного боку, для організації передачі блоків у рамках однієї і тієї ж
комунікаційної операції можна сформувати засобами MPI похідний тип даних. З
іншого боку, можна організувати двохетапну процедуру. На першому етапі
матриця розділяється на горизонтальні смуги. Ці смуги розподіляються на
процеси, що складають нульовий стовпець процесорних грат. Далі кожна смуга
розділяється на блоки між процесами, що становлять рядки процесорних грат.
Для виконання збору результуючої матриці з блоків призначена функція
ResultCollection. Збір даних також виконати двома способами: або з
використанням похідного типу даних, або за допомогою двоетапної процедури,
що дзеркально відображає процедуру розподілу матриці.
Реалізація функцій DataDistribution і ResultCollection є завданням для
самостійної роботи.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
5) Функція AblockCommunication обміну блоками матриці A.
Функція виконує розсилку блоків матриці по рядках процесорних грат.
Для цього в кожному рядку грат визначається провідний процес Pivot, що
здійснює розсилку. Для розсилки використовується блок pMatrixAblock,
переданий в процес у момент початкового розподілу даних. Виконання операції
розсилки блоків здійснюється за допомогою функції MPI _ Bcast. Слід зазначити,
що ця операція є колективною і її локалізація межами окремих рядків грат
забезпечується за рахунок використання комунікаторів RowComm, визначених
для набору процесів кожного рядка грат окремо.
// Broadcasting matrix A blocks to process grid rows
int BlockSize) {
// Defining the leading process of the process grid
row
int Pivot = (GridCoords[0] + iter) % GridSize;
// Copying the transmitted block in a separate memory
buffer
if (GridCoords[1] == Pivot) {
for (int i=0; i<BlockSize*BlockSize; i++)
pAblock[i] = pMatrixAblock[i];
} // Block broadcasting
MPI_Bcast(pAblock,
BlockSize*BlockSize,
MPI_DOUBLE,
Pivot, RowComm);
}
6) Функція перемножування матричних блоків BlockMultiplication.
Функція забезпечує перемножування блоків матриць і . Слід зазначити,
що для легшого розуміння даної програми наводиться простий варіант реалізації
функції - виконання операції блокового множення може бути істотним чином
оптимізовано для скорочення часу обчислень. Ця оптимізація може бути
спрямована, наприклад, на підвищення ефективності використання кешу
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
процесорів, векторизації виконуваних операцій і тому подібне:
// Множення матричних блоків
void
BlockMultiplication
(double
*pAblock,
double
*pBblock,
double *pCblock, int BlockSize) {
// вычисление произведения матричных блоков
for (int i=0; i<BlockSize; i++) {
for (int j=0; j<BlockSize; j++) {
double temp = 0;
for (int k=0; k<BlockSize; k++ )
temp
+=
pAblock
[i*BlockSize
+
k]
*
pBblock
[k*BlockSize + j]
pCblock [i*BlockSize + j] += temp;
}
}
}
7) Функція BblockCommunication обміну блоками матриці B.
Функція виконує циклічне зрушення блоків матриці
по стовпцях
процесорних грат. Кожен процес передає свій блок наступному процесу
NextProc у стовпці процесів і отримує блок, переданий з попереднього процесу
PrevProc в стовпці грат. Виконання операцій передачі даних здійснюється за
допомогою функції MPI _ SendRecv _ replace, яка забезпечує усі необхідні
пересилки блоків, використовуючи при цьому один і той же буфер пам'яті
pBblock. Крім того, ця функція гарантує відсутність можливої безвиході, коли
операції передачі даних починають одночасно виконуватися декількома
процесами при кільцевій топології мережі.
// Cyclic shift of matrix B blocks in the process
grid columns
void
Змн.
Арк.
BblockCommunication
№ докум.
Підпис
Дата
(double
*pBblock,
КПКН 16.279.24.001 ПЗ
int
Арк.
BlockSize) {
MPI_Status Status;
int NextProc = GridCoords[0] + 1;
if ( GridCoords[0] == GridSize-1 ) NextProc = 0;
int PrevProc = GridCoords[0] - 1;
if ( GridCoords[0] == 0 ) PrevProc = GridSize-1;
MPI_Sendrecv_replace(
pBblock,
BlockSize*BlockSize,
MPI_DOUBLE,
NextProc, 0, PrevProc, 0, ColComm, &Status);
}
8) Функція ParallelResultCalculation.
Для безпосереднього виконання паралельного алгоритму Фокса множення
матриць призначена функція ParallelResultCalculation, яка реалізує логіку роботи
алгоритму.
void
ParallelResultCalculation(double*
pAblock,
double* pMatrixAblock,
double* pBblock, double* pCblock, int BlockSize) {
for (int iter = 0; iter < GridSize; iter ++) {
// Sending blocks of matrix A to the process grid
rows
ABlockCommunication
(iter,
pAblock,
pMatrixAblock,
BlockSize);
// Block multiplication
BlockMultiplication(pAblock,
pBblock,
pCblock,
BlockSize);
// Cyclic shift of blocks of matrix B in process grid
columns
BblockCommunication(pBblock, BlockSize);
}
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
}
2.3.6 Результати обчислювальних експериментів
Обчислювальні експерименти для оцінки ефективності паралельного
алгоритму проводилися за тих же умов. Результати експериментів з
використанням чотирьох і дев'яти процесорів приведені в таблиці 2.3.
Таблиця 2.3 Результатів обчислювальних експериментів по дослідженню
паралельного алгоритму Фокса:
Розмір матриці
Послідовний
алгоритм
Паралельний алгоритм
4 ЦП
9 ЦП
Час
Присокрення
Час
Присокрення
500
0,8527
0,2190
3,8925
0,1468
5,8079
1000
12,8787
3,0910
4,1664
2,1565
5,9719
1500
43,4731
10,8678
4,0001
7,2502
5,9960
2000
103,0561
24,1421
4,2687
21,4157
4,8121
2500
201,2915
51,4735
3,9105
41,2159
4,8838
3000
347,8434
87,0538
3,9957
58,2022
5,9764
Порівняння часу виконання експерименту і теоретичного часу , обчислено
і представлено в таблиці 2.4.
Таблиця 2.4 Порівняння експериментального і теоретичного часу
виконання паралельного алгоритму Фокса.
Розмір матриці
Паралельний
алгоритм
Змн.
Арк.
4 ЦП
9 ЦП
500
0,4217
0,2190
0,2200
0,1468
1000
3,2970
3,0910
1,5924
2,1565
1500
11,0419
10,8678
5,1920
7,2502
2000
26,0726
24,1421
12,0927
21,4157
2500
50,8049
51,4735
23,3682
41,2159
3000
87,6548
87,0538
40,0923
58,2022
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
2.4 Алгоритм Кэннона множення матриць при блоковому розділенні
даних
Розглянемо ще один паралельний алгоритм матричного множення,
грунтований на блоковому розбитті матриць.
2.4.1 Визначення підзадач
Як і при розгляді алгоритму Фокса, в якості базової підзадачі виберемо
обчислення, пов'язані з визначенням одного з блоків результуючої матриці . Як
вже відзначалося раніше, для обчислення елементів цього блоку підзадача
повинна мати доступ до елементів горизонтальної смуги матриці і до елементів
вертикальної смуги матриці .
2.4.2 Виділення інформаційних залежностей
Відмінність алгоритму Кэннона від представленого в попередньому
підрозділі методу Фокса полягає в зміні схеми початкового розподілу блоків
перемножуваних матриць між підзадачами обчислювальної системи. Початкове
розташування блоків в алгоритмі Кэннона підбирається так, щоб блоки, які
розташовуються, в підзадачах могли б бути перемножені без додаткового обміну
даними. При цьому подібний розподіл блоків може бути організований таким
чином, що переміщення блоків між підзадачами в ході обчислень може
здійснюватися з використанням простіших комунікаційних операцій.
Зважаючи на висловлені зауваження етап ініціалізації алгоритму Кэннона
включає виконання наступних операцій обміну даними :
• у кожну підзадачу(i, j) передаються блоки Aij, Bij;
• для кожного рядка i грат підзадач блоки матриці A зрушуються на(i 1) позицій вліво;
•
Змн.
Арк.
для кожного стовпця j грат підзадач блоки матриці B зрушуються
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
на(j - 1) позицій вгору.
Перерозподіл блоків матриць A и В
В результаті такого початкового розподілу в кожній базовій підзадачі
розташовуватимуться блоки, які можуть бути перемножені без додаткового
обміну даними. Крім того, отримання усіх подальших блоків для підзадач може
бути забезпечене за допомогою простих комунікаційних дій. Після виконання
операції блокового множення кожен блок матриці
має бути переданий
попередній підзадачі вліво по рядках грат підзадач, а кожен блок матриці попередній підзадачі вгору по стовпцях грат. Послідовність таких циклічних
зрушень і множення отримуваних блоків початкових матриць і приведе до
отримання у базових підзадачах відповідних блоків результуючої матриці .
2.4.3 Масштабування і розподіл підзадач по процесорах
Як і раніше в методі Фокса, для алгоритму Кэннона розмір блоків може
бути підібраний так, щоб кількість базових підзадач співпадала з числом наявних
процесорів. Оскільки об'єм обчислень в кожній підзадачі є однаковим, це
забезпечує
повне
балансування
обчислювального
навантаження
між
процесорами.
Для розподілу підзадач між процесорами може бути застосований підхід,
використаний в алгоритмі Фокса, - безліч наявних процесорів представляється у
вигляді квадратних грат і розміщення базових підзадач здійснюється на
процесорах відповідних вузлів процесорних грат. Необхідна структура мережі
передачі даних, як і раніше, може бути забезпечена на фізичному рівні при
топології обчислювальної системи у вигляді грат або повного графа.
2.4.4 Аналіз ефективності
Перед проведенням аналізу ефективності слід зазначити, що алгоритм
Кэннона відрізняється від методу Фокса тільки видом виконуваних в ході
обчислень комунікаційних операцій. Як результат, використовуючи оцінки часу
виконання обчислювальних операцій, проведемо тільки аналіз комунікаційної
Арк.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
складності алгоритму Кэннона.
Відповідно
до
правил
алгоритму
на
етапі
ініціалізації
робиться
перерозподіл блоків матриць і за допомогою циклічного зрушення матричних
блоків по рядках і стовпцях процесорних грат. Трудомісткість виконання такої
операції передачі даних істотним чином залежить від топології мережі. Для
мережі із структурою повного графа усі необхідні пересилки блоків можуть бути
виконані одночасно(тобто тривалість операції виявляється рівною часу передачі
одного матричного блоку між сусідніми процесорами). Для мережі з топологією
гіперкуба операція циклічного зрушення може потребувати виконання ітерацій.
Для мережі з кільцевою структурою зв'язків необхідна кількість ітерацій
виявляється рівною . Детальніше методи виконання операції циклічного
зрушення розглянуті в розділі 3. Для побудови оцінки комунікаційної складності
етапу ініціалізації використовується варіант топології повного графа. Час
виконання початкового перерозподілу блоків може оцінюватися.
(вираз
визначає розмір блоків, що пересилаються, а коефіцієнт 2
відповідає двом виконуваним операціям циклічного зрушення).
Оцінимо тепер витрати на передачу даних між процесорами при виконанні
основної частини алгоритму Кэннона. На кожній ітерації алгоритму після
множення матричних блоків процесори передають свої блоки попереднім
процесорам по рядках(для блоків матриці ) і стовпцях (для блоків матриці )
процесорних грат. Ці операції також можуть бути виконані процесорами
паралельно і, тим самим, тривалість таких комунікаційних дій складає.
Оскільки кількість ітерацій алгоритму Кэннона являється рівним q, то з
урахуванням оцінки загальний час виконання паралельних обчислень може бути
визначений за допомогою наступного співвідношення:
2.4.5 Результати обчислювальних експериментів
Обчислювальні експерименти для оцінки ефективності паралельного
алгоритму проводилися за тих же умов, що і раніше виконані експерименти.
Результати експериментів для випадків чотирьох і дев'яти процесорів приведені
Арк.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
в таблиці 2.5.
Таблиця 2.5 Результатів обчислювальних експериментів по дослідженню
паралельного алгоритму Кэннона.
Розмір
об’єктів
Послідовний
алгоритм
Паралельний
алгоритм
4 ЦП
9 ЦП
Час
Присокренн
Час
Присокрення
я
1000
12,8787
3,0806
4,1805
1,1889
10,8324
1500
43,4731
11,1716
3,8913
4,6310
9,3872
2000
103,0561
24,0502
4,2850
14,4759
7,1191
2500
201,2915
53,1444
3,7876
23,5398
8,5511
3000
347,8434
88,2979
3,9394
36,3688
9,5643
З результатів наведених в таблиці, можна зробити аналіз алгоритму на
ефективність, а порівнянні з іншими алгоритмами.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
ВИСНОВОК
У даній курсовій роботі розглянуті три паралельні методи для виконання
операції матричного множення. Перший алгоритм грунтований на стрічковому
розділенні матриць між процесорами. У роботі приведені два різні варіанти
цього алгоритму. Перший варіант алгоритму грунтований на різному розділенні
перемножуваних матриць - перша матриця (матриця ) розбивається на
горизонтальні смуги, а друга матриця (матриця ) ділиться на вертикальні смуги.
Другий варіант стрічкового алгоритму використовує розбиття обох матриць на
горизонтальні смуги.
Далі в роботі розглядаються широко відомі алгоритми Фокса і Кэннона,
грунтовані на блоковому розділенні матриць. При використанні однакової схеми
розбиття матриць ці алгоритми відрізняються характером виконуваних операцій
передачі даних. Для алгоритму Фокса в ході обчислень здійснюється розсилка і
циклічне зрушення блоків матриць, в алгоритмі Кэннона виконується тільки
операція циклічного зрушення.
Відмінність в способах розбиття даних призводить до різних топологій
комунікаційної мережі, при яких виконання паралельних алгоритмів є найбільш
ефективним. Так, алгоритми, грунтовані на стрічковому розділенні даних,
орієнтовані на топологію мережі у вигляді гіперкуба або повного графа. Для
реалізації алгоритмів, грунтованих на блоковому розділенні даних, потрібна
наявність топології грат.
На загальному графіку представлені показники прискорення, отримані в
результаті виконання обчислювальних експериментів для усіх розглянутих
алгоритмів. Як можна помітити, при використанні чотирьох процесорів деяку
перевагу по прискоренню має паралельний алгоритм при стрічковому розділенні
даних. Виконані розрахунки показують також, що при більшій кількості
процесорів ефективнішими стають блокові алгоритми множення матриць.
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1.
Гергель, В.П., Стронгин, Р.Г. (2001). Основы параллельных
вычислений для многопроцессорных вычислительных систем. - Н.Новгород,
ННГУ (2 изд., 2003).
2.
Culler, D.E., et al. (1996). LogP: A practical model for parallel
computation. – Comm. Of the ACM, 39, 11, pp. 75-85.
3.
Hockney, R. (1994). The communication challenge for MPP: Intel
Paragon and Meiko CS-2. – Parallel Computing, 20 (3), pp. 389-398.
4.
Kumar V., Grama, A., Gupta, A., Karypis, G. (1994). Introduction to
Parallel Computing. - The Benjamin/Cummings Publishing Company, Inc. (2nd
edn., 2003)
5.
Quinn, M. J. (2004). Parallel Programming in C with MPI and OpenMP.
– New York, NY: McGraw-Hill.
6.
Skillicorn, D.B., Talia, D. (1998). Models and languages for parallel
computation. – ACM Computing surveys, 30, 2.
Размещено на Allbest.ru
Змн.
Арк.
№ докум.
Підпис
Дата
КПКН 16.279.24.001 ПЗ
Арк.