Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод АТПО лр.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
561.15 Кб
Скачать

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ

КРЕМЕНЧУЦЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ

ІМЕНІ МИХАЙЛА ОСТРОГРАДСЬКОГО

МЕТОДИЧНІ ВКАЗІВКИ

ЩОДО ВИКОНАННЯ ЛАБОРАТОРНИХ РОБІТ

З НАВЧАЛЬНОЇ ДИСЦИПЛІНИ

«АЛГОРИТМИ ТА ТЕХНОЛОГІЇ ПАРАЛЕЛЬНИХ ОБЧИСЛЕНЬ»

ДЛЯ СТУДЕНТІВ ДЕННОЇ ТА ЗАОЧНОЇ ФОРМ НАВЧАННЯ

З НАПРЯМУ 6.040302 – «ІНФОРМАТИКА»

(У ТОМУ ЧИСЛІ СКОРОЧЕНИЙ ТЕРМІН НАВЧАННЯ)

КРЕМЕНЧУК 2012

Методичні вказівки щодо виконання лабораторних робіт з навчальної дисципліни «Алгоритми та технології паралельних обчислень» для студентів денної та заочної форм навчання з напряму 6.040302 – «Інформатика» (у тому числі скорочений термін навчання)

Укладачі: доцент, к. ф.-м.н. Ю.П. Глухов,

асист. О. І. Нечепуренко,

асист. С.О. Геращенко,

асист. Т.С. Бриль

Рецензент доцент, к. т. н., Г. В. Славко

Кафедра інформатики і вищої математики

Затверджено методичною радою Кременчуцького національного університету

імені Михайла Остроградського

Протокол №____ від__________

Голова методичної ради______________ проф. В.В. Костін

ЗМІСТ

ВСТУП 4

СПИСОК ЛІТЕРАТУРИ 38

Методичні вказівки щодо виконання лабораторних робіт з навчальної дисципліни «Алгоритми та технології паралельних обчислень» для студентів денної та заочної форм навчання з напряму 6.040302 – «Інформатика» (у тому числі скорочений термін навчання) 39

ВСТУП

Метою навчальної дисципліни «Алгоритми та технології паралельних обчислень» є ознайомити студентів з основними архітектурними принципами реалізації паралельної обробки в обчислювальних машинах, методами та мовними механізмами конструювання паралельних алгоритмів та програм. Дати уяву про сучасні технології систем розробки паралельних програмних продуктів. Розглянути основні паралельні обчислювальні математичні методи на прикладі типових задач обчислювальної математики – лінійної алгебри, математичного аналізу.

У даних методичних вказівках розглянуто лабораторні роботи з тем: розробка програмного забезпечення, що базується на використанні процесів; організація паралельного чисельного інтегрування; організація паралельного скалярного добутку векторів; організація паралельного множення матриць. Лабораторні роботи, які пропонуються студентові для виконання, сприяють формуванню вмінь і навичок використання теоретичного матеріалу дисципліни «Алгоритми та технології паралельних обчислень» при постановці та розв’язанні складних обчислювальних задач виробництва, що є принципово необхідним для формування висококваліфікованого фахівця напряму підготовки «Інформатика».

Кожна лабораторна робота включає завдання. Студент повинен виконати його після того, як ознайомиться з конспектом лекцій та необхідною літературою. Завдання перевіряють на комп’ютері та оформлюють звіт. Звіт можна оформити у зошиті або роздрукувати на аркушах форматом А4. У звіті повинна бути тема, мета роботи, результати виконання лабораторної роботи та висновки.

ПЕРЕЛІК ЛАБОРАТОРНИХ РОБІТ

Лабораторна робота № 1

Тема. Розробка синхронного механізму обміну даними між паралельними процесами

Мета роботи: ознайомитись з прийомами створення паралельного програмного забезпечення; розробити синхронний механізм обміну даними між паралельними процесами на одному процесорі за допомогою створення віртуальних зв’язків (лінків).

Короткі теоретичні відомості

Інформаційні та логічні зв'язки. Основні механізми взаємодії процесів

Обмін даних заснований на концепції віртуальних зв'язків між процесорами, які утворюють канали ``точка-точка'' між будь-якими процесорами. Набір створених віртуальних зв'язків задає віртуальну топологію (грати, конвеєр, дерево, гіперкуб). Синхронний канал − природний для архітектури Parsytec CC тип комунікаційного каналу. Процеси, зв'язані синхронним каналом, синхронізуються при обміні даних: якщо одна сторона ще не готова до обміну даними, то інша чекатиме готовності. Наступні системні виклики відносяться до синхронних каналів: Send, Recv, Select, SendLink, RecvLink. Синхронна ``випадкова'' передача − єдиний спосіб передачі даних, при якому не потрібно створювати комунікаційний канал. Дані передаються по системних каналах. Проте, при великому розмірі повідомлення бібліотечні виклики автоматично створюють віртуальний канал, з метою підвищення швидкості обміну.

Асинхронний канал. Такий канал може здійснювати обмін даними не перериваючи обчислень на вузлі. Тому канал такого типу покращує ккд процесора. Прийом/передача виконуються з буферизацією як на стороні передавача, так і на стороні приймача.

Відповідно до можливостей паралельного комп'ютера процеси взаємодіють між собою зазвичай одним з наступних способів:

  • Обмін повідомленнями (message passing). Посилаючий процес формує повідомлення із заголовком, в якому указує, який процесор повинен прийняти повідомлення, і передає повідомлення в мережу, що сполучає процесори. Якщо, як тільки повідомлення було передане в мережу, що посилає процес продовжує роботу, то такий вид відправки повідомлення, називається неблокуючим (non-blocking send). Якщо ж посилаючий процес чекає, поки приймаючий процес не прийме повідомлення, то такий вид відправки повідомлення, називається блокуючим (blocking send).

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

  • Обмін через загальну пам'ять (Transfers through shared memory). У архітектурі із загальнодоступною пам'яттю процеси зв'язуються між собою через загальну пам'ять - відправляючий процес поміщає дані у відомі елементи пам'яті, з яких приймаючий процес може прочитувати їх. При такому обміні складність представляє процес виявлення того, коли безпечно поміщати дані, а коли видаляти їх. Найчастіше для цього використовуються стандартні методи операційної системи, такі як семафори або блокування процесів. Проте це дорого і сильно ускладнює програмування. Деяку архітектуру надають біти зайнято/вільно, пов'язані з кожним словом загальної пам'яті, що забезпечує легкий і високоефективний спосіб синхронізації відправників і приймачів.

Хід роботи

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

Програма базується на діалозі трьох процесів Max, Harry і Tony.

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<sys/root.h>

#include<sys/link.h>

#define BUFFER 4096

#define ANSW 1024

#define link_HT 1

#define link_TM 2

#define link_MH 3

int ID;

int Harry (void)

{

LinkCB_t *TonyLink,*MaxLink;

char *FName = "Harry";

char answ[ANSW+1];

char *messg[] = {"Harry_MSG1", "Harry_MSG2", "Harry_MSG3", "Harry_MSG4"};

int error, i;

ID = GET_ROOT()->ProcRoot->MyProcID;

TonyLink = MakeLink(ID, link_HT, &error);

if (TonyLink==NULL) {

LogError(EC_ERROR, FName, "\make link Tony error = %d", error);

exit(1);

}

for (i=0; i<2; i++) {

printf ("\nHarry->Tony :%s", messg[i]);

SendLink (TonyLink, (byte*)messg[i], strlen(messg[i])+1);

RecvLink (TonyLink, (byte*)answ, ANSW);

printf ("\nHarry<-Tony : %s",answ);

}

MaxLink=GetLink(ID,link_MH,&error);

if(MaxLink==NULL)

{

LogError(EC_ERROR,FName,”can’t get link from Max,error=%d”,error);

exit(1);

}

for(i=2;i<4;i++)

{

RecvLink(MaxLink,answ,ANSW);

printf(“\n Harry<-Max:%s \n Harry->Max:%s”,answ,messg[i]);

SendLink(MaxLink,messg[i],strlen(messg[i])+1);

}

return 0;

}

int Tony (void)

{

LinkCB_t *HarryLink,*MaxLink;

char *FName = "Tony";

char answ[ANSW+1];

char *messg[] = {"Tony_MSG1", "Tony_MSG2", "Tony_MSG3", "Tony_MSG4"};

int error, i;

ID = GET_ROOT()->ProcRoot->MyProcID;

HarryLink = GetLink(ID, link_HT, &error);

if (HarryLink==NULL) {

LogError(EC_ERROR, FName, "\nGet link Harry error = %d", error);

exit(1);

}

for (i=0; i<2; i++) {

printf("\nTony_for");

RecvLink (HarryLink, (byte*)answ, ANSW);

printf ("\nTony<-Harry : %s \n Tony->Harry :%s",answ, messg[i]);

SendLink (HarryLink, (byte*)messg[i], strlen(messg[i])+1);

}

MaxLink=MakeLink(ID,link_TM,&error);

if(MaxLink==NULL)

{LogError(EC_ERROR,FName,”can’t make linl to Max,error=%d”,error);

exit(1);

}

for(i=2;i<4;i++)

{

printf(“\nTony->Max: %s”,messg[i]);

SendLink(MaxLink,messg[i],strlen(messg[i])+1);

RecvLink(MaxLink,answ,ANSW);

printf(“\n Tony<-Max: %s”,answ);

}

return 0;

}

int Max (void)

{

LinkCB_t *HarryLink,*TonyLink;

char *FName=”Max”;

int error;

int i;

int result;

char answ[ANSW+1];

char *messg[]={"Max_MSG1", "Max_MSG2", "Max_MSG3", "Max_MSG4"};

ID=GET_ROOT()->ProcRoot->MyProcID;

TonyLink=GetLink(ID,link_TM,&error);

if(TonyLink==NULL)

{LogError(EC_ERROR,FName,”\n can’t get link to Tony, error=%d”,error);

exit(1);

}

for(i=0;i<2;i++)

{

RecvLink(TonyLink,answ,ANSW);

printf(“\n Max<-Tony : %s \n Max->Tony :%s”,answ,messg[i]);

SendLink(TonyLink,messg[i],strlen(messg[i])+1);

}

HarryLink=MakeLink(ID,link_MH,&error);

if(HarryLinl==NULL)

{LogError(EC_ERROR,FName,”\n can’t make link to Harry, error=%d”,error);

exit(1);

}

for(i=2;i<4;i++)

{

printf(“Max->Harry: %s”,messg[i]);

SendLink(HarryLink,messg[i],strlen(messg[i])+1);

RecvLink(HarryLink,answ,ANSW);

printf(“Max<-Harry: %s”,answ);

}

return 0;

}

int main(void)

{

Thread_t *HarryThread, *TonyThread, *MaxThread;

char *FName = "main";

int error;

int result;

HarryThread = StartThread (Harry, BUFFER, &error, 0);

if (HarryThread==NULL){

LogError (EC_ERROR, FName, "\nStarting Harry error = %d", error);

exit(1);

}

TonyThread = StartThread (Tony, BUFFER, &error, 0);

if (TonyThread==NULL){

LogError (EC_ERROR, FName, "Starting Tony error = %d", error);

exit(1);

}

MaxThread = StartThread (Max, BUFFER, &error, 0);

if (MaxThread==NULL){

LogError (EC_ERROR, FName, "Starting Max error = %d", error);

exit(1);

}

WaitThread (HarryThread, &result);

WaitThread (TonyThread, &result);

WaitThread(MaxThread,&result);

exit (0);

}

Завдання

  1. Вивчити теоретичні відомості.

  2. Описати взаємодію процесів Max, Harry і Tony, показати приклад роботи програми.

  3. Розробити блок-схему реалізованої взаємодії процесів.

  4. Відповісти на контрольні питання.

Контрольні питання

  1. Якими способами взаємодіють між собою процеси відповідно до можливостей паралельного комп'ютера?

  2. Як відбувається обмін повідомленнями?

  3. Опишіть процес обміну через загальну пам'ять.

Зміст звіту

  1. Тема і мета лабораторної роботи.

  2. Завдання.

  3. Блок-схема і програмний код.

  4. Опис результатів роботи програми взаємодії.

  5. Відповіді на контрольні запитання.

Лабораторна робота № 2

Тема. Організація паралельного чисельного інтегрування

Мета роботи: ознайомитись із прийомами створення паралельного програмного забезпечення; набути навичок реалізації розроблених блок-схем розпаралелювання послідовних алгоритмів інтегрування.

Короткі теоретичні відомості

Щоб розробити коректний і ефективний паралельний додаток, потрібно виконати наступні умови:

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

  2. Паралельно працюючі частини алгоритму повинні складати велику за часом виконання частину програми. При зменшенні паралельної частини додатку різко знижується його ефективність.

  3. Кількість і об'єм передаваних повідомлень повинні бути мінімізовані; крім того, допустима частота повідомлень може обмежуватися використовуваними комунікаціями.

Цим умовам ідеально відповідає алгоритм підсумовування якого-небудь ряду - практично повністю відсутня послідовна частина додатку, тобто паралелізм наближається до 100%. Число повідомлень рівне подвоєному числу процесів: спочатку кожному процесу розсилається інформація про довжину підсумовуваної ним ділянки, і в кінці від кожного процесу передається результат, а отримані значення додаються.

Подібний алгоритм можна використовувати для написання паралельної програми знаходження певного інтегралу методом трапецій:

де

Розпаралелити це обчислення просто:

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

  1. Визначення підінтегральної функції f(x).

  2. Запуск паралельного додатку, визначення числа процесів і їх номерів.

  3. Визначення меж інтеграції ai, ai+1 і частоти розбиття відрізка для кожного процесу.

  4. Інтегрування кожним процесом функції по своєму відрізку.

  5. Пересилка кожним процесом отриманого результату нульовому процесу.

  6. Підсумовування нульовим процесом отриманих значень і друк результату.

  7. Завершення паралельної частини додатку і всієї програми.