Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
делать №5.doc
Скачиваний:
2
Добавлен:
15.11.2019
Размер:
654.85 Кб
Скачать

Звіт повинен містити:

  1. Тему, мету та завдання роботи.

  2. Схему алгоритму розпаралелення.

  3. Блок – схему програми.

  4. Листинг програми.

  5. Порядок виконання роботи з описом усіх дій.

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

  1. Що таке паралельна комп’ютерна система (КС)?

  2. Які ви знаєте типи структур паралельних КС?

  3. Паралельні КС зі спільною пам’яттю: структура, принципи побудови, переваги та недоліки?

  4. Паралельні КС з локальною (розподіленою) пам’яттю: структура, принципи побудови, переваги та недоліки?

  5. Розподілені КС: структура, принципи побудови, переваги та недоліки?

  6. Що таке кластер?

  7. Що таке паралельний алгоритм?

  8. Що таке ярус?

  9. Що таке висота паралельного алгоритму?

  10. Що таке ширина паралельного алгоритму?

  11. Що таке прискорення паралельного алгоритму?

  12. Що таке ефективність паралельного алгоритму?

Лабораторна робота №2 Тема: «Розпаралелювання обчислення суми десяти чисел»

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

Задача

Задано масив перших десяти натуральних чисел a1, a2, … a10. Скласти блок-схеми і програму алгоритму розпаралелювання сум від 4 до 10 чисел та кількості процесорів згідно варіанту (див. табли­ цю 2.1). Для перевірки додати у програму частину, яка б сумувала числа за допомогою стандартного алгоритму.

Таблиця 2.1 – Варіанти завдання

№ варіанту

Кількість чисел

Кількість процесорів

1

8

4

2

7

3

3

6

3

4

10

2

5

9

2

6

8

2

7

7

2

8

6

2

9

5

2

10

4

2

Хід роботи

Складемо схеми розпаралелювання для двох процесорів:

Для чотирьох чисел: Для п’яти чисел:

Рисунок 2.1 – Схеми розпаралелювання для чотирьох та п’яти чисел

Для шости чисел: Для семи чисел:

Рисунок 2.2 – Схеми розпаралелювання для шости та семи чисел

Для восьми чисел:

Для дев’яти чисел:

Рисунок 2.3 – Схеми розпаралелювання для восьми та дев’яти чисел

Для десяти чисел:

Рисунок 2.4 – Схеми розпаралелювання для десяти чисел

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

Особливості програмного інтерфейсу потоків

Програмний інтерфейс керування потоками у Windows ХР є частиною Win32 АРІ. Такий інтерфейс ще називають інтерфейсом потоків Win32. Розглянемо особливості його використання.

Створення потоків у Win32 арі

У Win32 АРІ, як зазначалося раніше, для створення потоку призначена функція CreateThread(), а для його завершення – EndThread().

На практиці, однак, пару CreateThread()/EndThread() є сенс використати лише тоді, коли з коду, що виконує потік, не викликаються функції стандартної бібліотеки мови С (такі, як printf() aбo strcmp()).

Річ у тому, що функції стандартної бібліотеки С у Win32 АРІ не пристосовані до використання за умов багатопотоковості, і для того щоб підготувати потік до роботи за таких умов, необхідно під час його створення і завершення виконувати деякі додаткові дії. Ці дії враховані у спеціальних бібліотечних функціях роботи з потоками, описаних у заголовному файлі рrосеss.h. Це функція _beginthreadex() для створення потоку й _endthreadex() – для завершення потоку.

Розглянемо синтаксис функції _beginthreadex(). Відразу ж наголосимо, що той самий набір параметрів (відмінний лише за типами) передають і у функцію CreateThread().

#include <process.h>

unsigned long _beginthreadex( void *security, unsigned stack_size,

unsigned WINAPI (*thread_fun)(void *),

void *argument. unsigned init_state, unsigned *tid );

де: security — атрибути безпеки цього потоку (NULL – атрибути безпеки за замовчуванням);

stack_size — розмір стека для потоку (зазвичай 0, у цьому разі розмір буде таким самим, що й у потоку, який викликає _beginthreadex());

thread_fun — покажчик на функцію потоку;

argument — додаткові дані для передачі у функцію потоку;

init_state — початковий стан потоку під час створення (0 для потоку, що почне виконуватися негайно, CREATE_SUSPEND для припиненого);

tid – покажчик на змінну, в яку буде записано ідентифікатор потоку після виклику (0, якщо цей ідентифікатор не потрібний).

Функція _beginthreadex() повертає дескриптор створеного потоку, який потрібно перетворити в тип HANDLE:

HANDLE th = (HANDLE)_beginthreadex( ... ):

Після отримання дескриптора, якщо він у цій функції більше не потрібний, його закривають за допомогою CloseHandle() аналогічно до дескриптора процесу:

CloseHandle(th);

Розглянемо приклад задання функції потоку. Додаткові дані, які передаються під час виклику _beginthreadex() за допомогою параметра argument, доступні в цій функції через параметр типу void *.

unsigned int WINAPI thread_fun (void *num) {

printf ("потік %d почав виконання\n", (int)num);

//код функції потоку

printf ("потік %d завершив виконання\п". (int)num);

}

Ось приклад виклику _beginthreadex() з усіма параметрами:

unsigned tid;

int number = 0;

HANDLE th = (HANDLE) _beginthreadex (

NULL, 0. thread_fun, (void *)++number, 0. &tid):

Після створення потоку може виникнути потреба змінити його характеристи­ки. Якщо це необхідно зробити у функції потоку, варто знати, як отримати доступ до його дескриптора. Для цього використовують функцію GetCurrentThread():

unsigned int WINAPI thread_fun (void *num) {

HANDLE curth = GetCurrentThread():

}